From 7af964d1562d70f51a8e9aca24215ac3d83d0624 Mon Sep 17 00:00:00 2001 From: Apple Date: Tue, 25 Aug 2009 00:18:22 +0000 Subject: [PATCH] objc4-437.tar.gz --- Makefile | 559 - ReleaseNotes.rtf | 358 + libobjc.order | 1 - markgc.c | 7 +- objc.sln | 34 + objc.suo | Bin 0 -> 23552 bytes objc.vcproj | 1030 + objc.xcodeproj/project.pbxproj | 729 + objcrt/objcrt.vcproj | 95 + runtests.sh | 24 + .../Accessors.subproj/objc-accessors-i386.s | 157 - .../Accessors.subproj/objc-accessors-ppc.s | 24 - .../Accessors.subproj/objc-accessors-ppc64.s | 24 - .../Accessors.subproj/objc-accessors-table.h | 166 - .../Accessors.subproj/objc-accessors-x86_64.s | 24 - runtime/Accessors.subproj/objc-accessors.m | 108 +- runtime/Auto.subproj/objc-auto-i386.s | 7 +- runtime/Auto.subproj/objc-auto-ppc.s | 6 +- runtime/Auto.subproj/objc-auto-ppc64.s | 4 + runtime/Auto.subproj/objc-auto-x86_64.s | 4 + runtime/Auto.subproj/objc-auto.s | 35 - runtime/Messengers.subproj/objc-msg-arm.s | 914 + runtime/Messengers.subproj/objc-msg-i386.s | 97 +- runtime/Messengers.subproj/objc-msg-ppc.s | 33 +- runtime/Messengers.subproj/objc-msg-ppc64.s | 1434 - .../Messengers.subproj/objc-msg-stub-i386.s | 62 - .../Messengers.subproj/objc-msg-stub-ppc.s | 58 - .../Messengers.subproj/objc-msg-stub-ppc64.s | 57 - .../Messengers.subproj/objc-msg-stub-x86_64.s | 38 - runtime/Messengers.subproj/objc-msg-stub.s | 36 - runtime/Messengers.subproj/objc-msg-win32.m | 505 + runtime/Messengers.subproj/objc-msg-x86_64.s | 795 +- runtime/OldClasses.subproj/List.h | 4 +- runtime/OldClasses.subproj/List.m | 2 +- runtime/Protocol.h | 2 +- runtime/Protocol.m | 2 +- runtime/error.h | 8 +- runtime/hashtable.h | 2 + runtime/hashtable2.h | 8 +- runtime/hashtable2.m | 159 +- runtime/lookupa.h | 24 - runtime/lookupa.m | 244 - runtime/maptable.h | 3 +- runtime/maptable.m | 23 +- runtime/message.h | 33 +- runtime/objc-api.h | 27 +- runtime/objc-auto-dump.h | 53 + runtime/objc-auto-dump.m | 218 + runtime/objc-auto.h | 183 +- runtime/objc-auto.m | 1392 +- runtime/objc-cache.m | 286 +- runtime/objc-class-old.m | 430 +- runtime/objc-class.m | 473 +- runtime/objc-config.h | 70 +- runtime/objc-errors.m | 70 +- runtime/objc-exception.h | 19 +- runtime/objc-exception.m | 292 +- runtime/objc-file.m | 188 +- runtime/objc-gdb.h | 117 + runtime/objc-initialize.h | 10 + runtime/objc-initialize.m | 144 +- .../objc-msg.s => objc-internal.h} | 38 +- runtime/objc-layout.m | 290 +- runtime/objc-load.h | 6 +- runtime/objc-load.m | 9 +- runtime/objc-loadmethod.h | 2 +- runtime/objc-loadmethod.m | 47 +- runtime/objc-lockdebug.m | 436 +- runtime/objc-os.h | 843 + runtime/objc-os.m | 913 + runtime/objc-private.h | 571 +- runtime/objc-probes.d | 5 + ...bjc-accessors-arch.s => objc-references.h} | 29 +- runtime/objc-references.mm | 305 + runtime/objc-rtp-sym.s | 72 - runtime/objc-rtp.h | 2 + runtime/objc-rtp.m | 137 +- runtime/objc-runtime-new.h | 27 +- runtime/objc-runtime-new.m | 3167 +- runtime/objc-runtime-old.m | 729 +- runtime/objc-runtime.m | 951 +- runtime/objc-sel-set.h | 4 + runtime/objc-sel-set.m | 54 +- runtime/objc-sel-table.h | 32771 ---------------- runtime/objc-sel-table.s | 21 + runtime/objc-sel.m | 172 - runtime/objc-sel.mm | 362 + runtime/objc-selopt.h | 1041 + runtime/objc-sync.h | 14 +- runtime/objc-sync.m | 267 +- runtime/objc-typeencoding.m | 5 +- runtime/objc.h | 4 +- runtime/objcrt.c | 97 + runtime/objcrt.h | 20 + runtime/phash.h | 17 - runtime/phash.m | 573 - runtime/runtime.h | 67 +- runtime/standard.h | 54 - test/Makefile | 279 + test/README | 22 + test/accessors.m | 77 + test/addMethod.m | 105 + test/association-cf.m | 24 + test/cacheflush.h | 7 + test/cacheflush.m | 54 + test/cacheflush0.m | 8 + test/cacheflush2.m | 6 + test/cacheflush3.m | 6 + test/category.m | 107 + test/classgetclass.m | 19 + test/classname.m | 41 + test/classpair.m | 250 + test/classversion.m | 22 + test/concurrentcat.m | 110 + test/concurrentcat_category.m | 70 + test/copyIvarList.m | 111 + test/copyMethodList.m | 146 + test/copyPropertyList.m | 120 + test/createInstance.m | 57 + test/debuggerMode.m | 157 + test/definitions.m | 23 + test/duplicateClass.m | 157 + test/errcheck.pl | 116 + test/exc.m | 635 + test/exchangeImp.m | 86 + test/fail.m | 6 + test/foreach.m | 237 + test/forward.m | 639 + test/future.h | 19 + test/future0.m | 7 + test/future1.m | 86 + test/future2.m | 17 + test/gc.c | 1 + test/gc.m | 2 + test/gcenforcer.m | 22 + test/gcenforcer_nogc.gc.expected-stderr | 2 + test/gcenforcer_nogc.nogc.expected-stderr | 1 + test/gcenforcer_requiresgc.gc.expected-stderr | 1 + ...gcenforcer_requiresgc.nogc.expected-stderr | 2 + test/gdb-lock.m | 59 + test/gdb.m | 51 + test/getMethod.m | 117 + test/ignoredSelector.m | 287 + test/imageorder.h | 19 + test/imageorder.m | 32 + test/imageorder1.m | 41 + test/imageorder2.m | 23 + test/imageorder3.m | 23 + test/initialize.m | 129 + test/instanceSize.m | 63 + test/ismeta.m | 16 + test/ivar.m | 116 + test/ivarSlide.h | 120 + test/ivarSlide1.m | 27 + test/ivarSlide2.m | 519 + test/layout.m | 94 + test/load-order.m | 9 + test/load-order1.m | 14 + test/load-order2.m | 14 + test/load-order3.m | 11 + test/load-parallel.m | 46 + test/load-parallel0.m | 44 + test/load-parallel00.m | 1 + test/load-reentrant.m | 28 + test/load-reentrant2.m | 22 + test/load.m | 82 + test/main.m | 9 + test/methodArgs.m | 147 + test/method_getName.m | 20 + test/msgSend.m | 501 + test/nilAPIArgs.m | 11 + test/nsobject.m | 24 + test/property.m | 65 + test/protocol.m | 202 + test/protocol_copyMethodList.m | 141 + test/protocol_copyPropertyList.m | 105 + test/protocol_cw.m | 36 + test/resolve.expected-stderr | 3 + test/resolve.m | 275 + test/runtime.expected-stderr | 2 + test/runtime.m | 83 + test/sel.m | 32 + test/setSuper.m | 44 + test/super.m | 27 + test/synchronized-counter.m | 82 + test/synchronized-grid.m | 104 + test/synchronized.m | 101 + test/test.h | 104 + test/test.xcodeproj/project.pbxproj | 453 + test/unload.h | 10 + test/unload.m | 126 + test/unload2.m | 33 + test/unload3.m | 8 + test/unload4.m | 8 + test/unwind.m | 83 + test/weakcopy.m | 34 + test/zone.m | 33 + unexported_symbols | 1 + 198 files changed, 23506 insertions(+), 41298 deletions(-) delete mode 100644 Makefile create mode 100644 ReleaseNotes.rtf create mode 100755 objc.sln create mode 100755 objc.suo create mode 100644 objc.vcproj create mode 100644 objc.xcodeproj/project.pbxproj create mode 100755 objcrt/objcrt.vcproj create mode 100755 runtests.sh delete mode 100644 runtime/Accessors.subproj/objc-accessors-i386.s delete mode 100644 runtime/Accessors.subproj/objc-accessors-ppc.s delete mode 100644 runtime/Accessors.subproj/objc-accessors-ppc64.s delete mode 100644 runtime/Accessors.subproj/objc-accessors-table.h delete mode 100644 runtime/Accessors.subproj/objc-accessors-x86_64.s delete mode 100644 runtime/Auto.subproj/objc-auto.s create mode 100644 runtime/Messengers.subproj/objc-msg-arm.s delete mode 100644 runtime/Messengers.subproj/objc-msg-ppc64.s delete mode 100644 runtime/Messengers.subproj/objc-msg-stub-i386.s delete mode 100644 runtime/Messengers.subproj/objc-msg-stub-ppc.s delete mode 100644 runtime/Messengers.subproj/objc-msg-stub-ppc64.s delete mode 100644 runtime/Messengers.subproj/objc-msg-stub-x86_64.s delete mode 100644 runtime/Messengers.subproj/objc-msg-stub.s create mode 100644 runtime/Messengers.subproj/objc-msg-win32.m create mode 100644 runtime/hashtable.h delete mode 100644 runtime/lookupa.h delete mode 100644 runtime/lookupa.m create mode 100644 runtime/objc-auto-dump.h create mode 100644 runtime/objc-auto-dump.m create mode 100644 runtime/objc-gdb.h rename runtime/{Messengers.subproj/objc-msg.s => objc-internal.h} (60%) create mode 100644 runtime/objc-os.h create mode 100644 runtime/objc-os.m create mode 100644 runtime/objc-probes.d rename runtime/{Accessors.subproj/objc-accessors-arch.s => objc-references.h} (67%) create mode 100644 runtime/objc-references.mm delete mode 100644 runtime/objc-rtp-sym.s delete mode 100644 runtime/objc-sel-table.h create mode 100644 runtime/objc-sel-table.s delete mode 100644 runtime/objc-sel.m create mode 100644 runtime/objc-sel.mm create mode 100644 runtime/objc-selopt.h create mode 100644 runtime/objcrt.c create mode 100644 runtime/objcrt.h delete mode 100644 runtime/phash.h delete mode 100644 runtime/phash.m delete mode 100644 runtime/standard.h create mode 100644 test/Makefile create mode 100644 test/README create mode 100644 test/accessors.m create mode 100644 test/addMethod.m create mode 100644 test/association-cf.m create mode 100644 test/cacheflush.h create mode 100644 test/cacheflush.m create mode 100644 test/cacheflush0.m create mode 100644 test/cacheflush2.m create mode 100644 test/cacheflush3.m create mode 100644 test/category.m create mode 100644 test/classgetclass.m create mode 100644 test/classname.m create mode 100644 test/classpair.m create mode 100644 test/classversion.m create mode 100644 test/concurrentcat.m create mode 100644 test/concurrentcat_category.m create mode 100644 test/copyIvarList.m create mode 100644 test/copyMethodList.m create mode 100644 test/copyPropertyList.m create mode 100644 test/createInstance.m create mode 100644 test/debuggerMode.m create mode 100644 test/definitions.m create mode 100644 test/duplicateClass.m create mode 100644 test/errcheck.pl create mode 100644 test/exc.m create mode 100644 test/exchangeImp.m create mode 100644 test/fail.m create mode 100644 test/foreach.m create mode 100644 test/forward.m create mode 100644 test/future.h create mode 100644 test/future0.m create mode 100644 test/future1.m create mode 100644 test/future2.m create mode 100644 test/gc.c create mode 100644 test/gc.m create mode 100644 test/gcenforcer.m create mode 100644 test/gcenforcer_nogc.gc.expected-stderr create mode 100644 test/gcenforcer_nogc.nogc.expected-stderr create mode 100644 test/gcenforcer_requiresgc.gc.expected-stderr create mode 100644 test/gcenforcer_requiresgc.nogc.expected-stderr create mode 100644 test/gdb-lock.m create mode 100644 test/gdb.m create mode 100644 test/getMethod.m create mode 100644 test/ignoredSelector.m create mode 100644 test/imageorder.h create mode 100644 test/imageorder.m create mode 100644 test/imageorder1.m create mode 100644 test/imageorder2.m create mode 100644 test/imageorder3.m create mode 100644 test/initialize.m create mode 100644 test/instanceSize.m create mode 100644 test/ismeta.m create mode 100644 test/ivar.m create mode 100644 test/ivarSlide.h create mode 100644 test/ivarSlide1.m create mode 100644 test/ivarSlide2.m create mode 100644 test/layout.m create mode 100644 test/load-order.m create mode 100644 test/load-order1.m create mode 100644 test/load-order2.m create mode 100644 test/load-order3.m create mode 100644 test/load-parallel.m create mode 100644 test/load-parallel0.m create mode 100644 test/load-parallel00.m create mode 100644 test/load-reentrant.m create mode 100644 test/load-reentrant2.m create mode 100644 test/load.m create mode 100644 test/main.m create mode 100644 test/methodArgs.m create mode 100644 test/method_getName.m create mode 100644 test/msgSend.m create mode 100644 test/nilAPIArgs.m create mode 100644 test/nsobject.m create mode 100644 test/property.m create mode 100644 test/protocol.m create mode 100644 test/protocol_copyMethodList.m create mode 100644 test/protocol_copyPropertyList.m create mode 100644 test/protocol_cw.m create mode 100644 test/resolve.expected-stderr create mode 100644 test/resolve.m create mode 100644 test/runtime.expected-stderr create mode 100644 test/runtime.m create mode 100644 test/sel.m create mode 100644 test/setSuper.m create mode 100644 test/super.m create mode 100644 test/synchronized-counter.m create mode 100644 test/synchronized-grid.m create mode 100644 test/synchronized.m create mode 100644 test/test.h create mode 100644 test/test.xcodeproj/project.pbxproj create mode 100644 test/unload.h create mode 100644 test/unload.m create mode 100644 test/unload2.m create mode 100644 test/unload3.m create mode 100644 test/unload4.m create mode 100644 test/unwind.m create mode 100644 test/weakcopy.m create mode 100644 test/zone.m create mode 100644 unexported_symbols diff --git a/Makefile b/Makefile deleted file mode 100644 index 47d8553..0000000 --- a/Makefile +++ /dev/null @@ -1,559 +0,0 @@ -# use LDFLAGS not LFLAGS -# -# Simple makefile for building objc4 on Darwin -# -# These make variables (or environment variables) are used -# when defined: -# SRCROOT path location of root of source hierarchy; -# defaults to ".", but must be set to a -# destination path for installsrc target. -# OBJROOT path location where .o files will be put; -# defaults to SRCROOT. -# SYMROOT path location where build products will be -# put; defaults to SRCROOT. -# DSTROOT path location where installed products will -# be put; defaults to / . -# OBJROOT and SYMROOT should not be directories shared with other -# built projects. -# PLATFORM name of platform being built on -# USER name of user building the project -# ARCHS list of archs for which to build -# RC_ARCHS more archs for which to build (build system) -# OTHER_CFLAGS other flags to be passed to compiler -# RC_CFLAGS more flags to be passed to compiler (build system) -# OTHER_LDFLAGS other flags to be passed to the link stage -# - -# Default targets -default: build -all: build - -test: - make -C test - -.SUFFIXES: -.PHONY: default all test build optimized debug profile installsrc installhdrs install clean prebuild build-optimized build-debug build-profile prebuild-optimized prebuild-debug prebuild-profile compile-optimized compile-debug compile-profile link-optimized link-debug link-profile postbuild - -CURRENT_PROJECT_VERSION = 227 - -VERSION_NAME = A - -# First figure out the platform if not specified, so we can use it in the -# rest of this file. Currently defined values: Darwin -ifeq "$(PLATFORM)" "" -PLATFORM := $(shell uname) -endif - -ifndef SRCROOT -SRCROOT = . -endif - -ifndef OBJROOT -OBJROOT = $(SRCROOT) -endif - -ifndef SYMROOT -SYMROOT = $(SRCROOT) -endif - -ifndef DSTROOT -DSTROOT = / -endif - -ifeq "$(PLATFORM)" "Darwin" -CC = /usr/bin/cc -else -CC = /usr/bin/gcc -endif - -ECHO = @/bin/echo -MKDIRS = /bin/mkdir -p -CD = cd -COPY = /bin/cp -COPY_RECUR = /bin/cp -r -REMOVE = /bin/rm -REMOVE_RECUR = /bin/rm -rf -SYMLINK = /bin/ln -s -CHMOD = /bin/chmod -CHOWN = /usr/sbin/chown -TAR = /usr/bin/tar -STRIP = /usr/bin/strip -NMEDIT = /usr/bin/nmedit -LIPO = /usr/bin/lipo - -ifeq "$(PLATFORM)" "Darwin" -WARNING_FLAGS = -Wall -Wno-four-char-constants -Wshorten-64-to-32 -Wno-deprecated-declarations -endif - -ARCH_LIST= -ifeq "$(PLATFORM)" "Darwin" - -ifneq "$(ARCHS)" "" -ARCH_LIST += $(ARCHS) -else -ifneq "$(RC_ARCHS)" "" -ARCH_LIST += $(RC_ARCHS) -else -ARCH_LIST += $(shell /usr/bin/arch) -endif -endif - -ARCH_FLAGS = $(foreach A, $(ARCH_LIST), $(addprefix -arch , $(A))) - -endif - - -ifeq "$(ORDERFILE)" "" -ORDERFILE = $(SRCROOT)/libobjc.order -endif -ifneq "$(ORDERFILE)" "" -ORDER = -Wl,-order_file,$(ORDERFILE) -else -ORDER = -endif - -ifeq "$(USER)" "" -USER = unknown -endif - -CFLAGS = -g -fno-common -fdollars-in-identifiers -pipe $(PLATFORM_CFLAGS) $(WARNING_FLAGS) -I$(SYMROOT) -I. -I$(SYMROOT)/ProjectHeaders -LDFLAGS = - -LIBRARY_EXT = .dylib - -PUBLIC_HEADER_INSTALLDIR = usr/include/objc -OTHER_HEADER_INSTALLDIR = usr/local/include/objc -INSTALLDIR = usr/lib - -ifeq "$(PLATFORM)" "Darwin" -LDFLAGS += -dynamiclib -dynamic -compatibility_version 1 -current_version $(CURRENT_PROJECT_VERSION) -endif - -ifeq "$(PLATFORM)" "Darwin" -# GC flags -LDFLAGS += -lauto -#CFLAGS += -fobjc-gc -Wassign-intercept -endif - -CFLAGS += $(OTHER_CFLAGS) $(RC_CFLAGS) -LDFLAGS += $(OTHER_LDFLAGS) - -ifndef OPTIMIZATION_CFLAGS -OPTIMIZATION_CFLAGS = -Os -DNDEBUG -endif -ifndef DEBUG_CFLAGS -DEBUG_CFLAGS = -DDEBUG -endif -ifndef PROFILE_CFLAGS -PROFILE_CFLAGS = -DPROFILE -pg -Os -DNDEBUG -endif - -CFLAGS_OPTIMIZED = $(OPTIMIZATION_CFLAGS) $(CFLAGS) -CFLAGS_DEBUG = $(DEBUG_CFLAGS) $(CFLAGS) -CFLAGS_PROFILE = $(PROFILE_CFLAGS) $(CFLAGS) - -LDFLAGS_OPTIMIZED = $(LDFLAGS) -g -LDFLAGS_DEBUG = $(LDFLAGS) -g -LDFLAGS_PROFILE = $(LDFLAGS) -g -pg - -SUBDIRS = . runtime runtime/OldClasses.subproj runtime/Messengers.subproj runtime/Accessors.subproj runtime/Auto.subproj - -# files to compile -SOURCES= -# files to compile into separate linker modules -MODULE_SOURCES= -# files to not compile -OTHER_SOURCES= -# headers to install in /usr/include/objc -PUBLIC_HEADERS= -# headers that don't get installed -PRIVATE_HEADERS= -# headers to install in /usr/local/include/objc -OTHER_HEADERS= - -# runtime -SOURCES += $(addprefix runtime/, \ - Object.m Protocol.m hashtable2.m maptable.m objc-class.m \ - objc-errors.m objc-cache.m objc-initialize.m \ - objc-file.m objc-load.m objc-runtime.m objc-sel.m \ - objc-sync.m objc-exception.m objc-auto.m objc-sel-set.m objc-rtp.m \ - objc-layout.m objc-loadmethod.m objc-class-old.m objc-runtime-old.m \ - objc-runtime-new.m objc-typeencoding.m objc-lockdebug.m \ - phash.m lookupa.m \ - ) -PUBLIC_HEADERS += $(addprefix runtime/, \ - objc.h runtime.h message.h \ - objc-class.h objc-api.h objc-load.h objc-runtime.h Object.h \ - objc-sync.h objc-exception.h objc-auto.h \ - Protocol.h error.h hashtable2.h \ - ) -PRIVATE_HEADERS += $(addprefix runtime/, \ - objc-private.h objc-config.h objc-sel-table.h objc-sel-set.h \ - objc-rtp.h objc-initialize.h objc-loadmethod.h objc-runtime-new.h \ - phash.h lookupa.h standard.h \ - ) -OTHER_HEADERS += runtime/maptable.h runtime/objc-auto.h - -# OldClasses -SOURCES += runtime/OldClasses.subproj/List.m -PUBLIC_HEADERS += runtime/OldClasses.subproj/List.h - -# Messengers -SOURCES += runtime/Messengers.subproj/objc-msg.s -OTHER_SOURCES += runtime/Messengers.subproj/objc-msg-ppc.s runtime/Messengers.subproj/objc-msg-ppc64.s runtime/Messengers.subproj/objc-msg-i386.s runtime/Messengers.subproj/objc-msg-x86_64.s - -# Property Accessors -SOURCES += runtime/Accessors.subproj/objc-accessors.m runtime/Accessors.subproj/objc-accessors-arch.s -PRIVATE_HEADERS += runtime/Accessors.subproj/objc-accessors.h runtime/Accessors.subproj/objc-accessors-table.h -OTHER_SOURCES += runtime/Accessors.subproj/objc-accessors-ppc.s runtime/Accessors.subproj/objc-accessors-ppc64.s -OTHER_SOURCES += runtime/Accessors.subproj/objc-accessors-i386.s runtime/Accessors.subproj/objc-accessors-x86_64.s - -# Auto support -SOURCES += runtime/Auto.subproj/objc-auto.s -OTHER_SOURCES += runtime/Auto.subproj/objc-auto-ppc.s runtime/Auto.subproj/objc-auto-ppc64.s runtime/Auto.subproj/objc-auto-i386.s runtime/Auto.subproj/objc-auto-x86_64.s - -# RTP symbols for gdb -# See also $(OBJROOT)/runtime/objc-rtp-sym.ppc.o rule below. -OTHER_SOURCES += runtime/objc-rtp-sym.s - -# Interposing support. -# This code is built into a second module so dyld's function interposing -# can manipulate the calls. -MODULE_SOURCES += runtime/Messengers.subproj/objc-msg-stub.s -OTHER_SOURCES += runtime/Messengers.subproj/objc-msg-stub-ppc.s runtime/Messengers.subproj/objc-msg-stub-ppc64.s runtime/Messengers.subproj/objc-msg-stub-i386.s runtime/Messengers.subproj/objc-msg-stub-x86_64.s - -# project root -OTHER_SOURCES += Makefile APPLE_LICENSE libobjc.order - -# The GC Mark tool that marks our .o files as if they had been compiled with write-barriers -OTHER_SOURCES += markgc.c -MARKGC = $(OBJROOT)/markgc - - -OBJECTS = $(addprefix $(OBJROOT)/, $(addsuffix .o, $(basename $(SOURCES) ) ) ) -OBJECTS_OPTIMIZED = $(OBJECTS:.o=.opt.o) -OBJECTS_DEBUG = $(OBJECTS:.o=.debug.o) -OBJECTS_PROFILE = $(OBJECTS:.o=.profile.o) - -MODULE_OBJECTS = $(addprefix $(OBJROOT)/, $(addsuffix .o, $(basename $(MODULE_SOURCES) ) ) ) -MODULE_OBJECTS_OPTIMIZED = $(MODULE_OBJECTS:.o=.opt.o) -MODULE_OBJECTS_DEBUG = $(MODULE_OBJECTS:.o=.debug.o) -MODULE_OBJECTS_PROFILE = $(MODULE_OBJECTS:.o=.profile.o) - -# For simplicity, each object target depends on all objc headers. Most of -# them come close to requiring this anyway, and rebuild from scratch is fast. -DEPEND_HEADERS = $(addprefix $(SRCROOT)/, \ - $(PUBLIC_HEADERS) $(PRIVATE_HEADERS) $(OTHER_HEADERS) ) - -$(OBJROOT)/%.opt.o : $(SRCROOT)/%.m $(DEPEND_HEADERS) $(MARKGC) - $(SILENT) $(ECHO) " ... $<" - $(SILENT) $(CC) $(ARCH_FLAGS) $(CFLAGS_OPTIMIZED) "$<" -c -o "$@" - $(SILENT) $(MARKGC) -p "$@" - -$(OBJROOT)/%.debug.o : $(SRCROOT)/%.m $(DEPEND_HEADERS) $(MARKGC) - $(SILENT) $(ECHO) " ... $<" - $(SILENT) $(CC) $(ARCH_FLAGS) $(CFLAGS_DEBUG) "$<" -c -o "$@" - $(SILENT) $(MARKGC) -p "$@" - -$(OBJROOT)/%.profile.o : $(SRCROOT)/%.m $(DEPEND_HEADERS) $(MARKGC) - $(SILENT) $(ECHO) " ... $<" - $(SILENT) $(CC) $(ARCH_FLAGS) $(CFLAGS_PROFILE) "$<" -c -o "$@" - $(SILENT) $(MARKGC) -p "$@" - -$(OBJROOT)/%.opt.o : $(SRCROOT)/%.c $(DEPEND_HEADERS) - $(SILENT) $(ECHO) " ... $<" - $(SILENT) $(CC) $(ARCH_FLAGS) $(CFLAGS_OPTIMIZED) "$<" -c -o "$@" - -$(OBJROOT)/%.debug.o : $(SRCROOT)/%.c $(DEPEND_HEADERS) - $(SILENT) $(ECHO) " ... $<" - $(SILENT) $(CC) $(ARCH_FLAGS) $(CFLAGS_DEBUG) "$<" -c -o "$@" - -$(OBJROOT)/%.profile.o : $(SRCROOT)/%.c $(DEPEND_HEADERS) - $(SILENT) $(ECHO) " ... $<" - $(SILENT) $(CC) $(ARCH_FLAGS) $(CFLAGS_PROFILE) "$<" -c -o "$@" - -$(OBJROOT)/%.opt.o : $(SRCROOT)/%.s $(DEPEND_HEADERS) - $(SILENT) $(ECHO) " ... $<" - $(SILENT) $(CC) $(ARCH_FLAGS) $(CFLAGS_OPTIMIZED) "$<" -c -o "$@" - -$(OBJROOT)/%.debug.o : $(SRCROOT)/%.s $(DEPEND_HEADERS) - $(SILENT) $(ECHO) " ... $<" - $(SILENT) $(CC) $(ARCH_FLAGS) $(CFLAGS_DEBUG) "$<" -c -o "$@" - -$(OBJROOT)/%.profile.o : $(SRCROOT)/%.s $(DEPEND_HEADERS) - $(SILENT) $(ECHO) " ... $<" - $(SILENT) $(CC) $(ARCH_FLAGS) $(CFLAGS_PROFILE) "$<" -c -o "$@" - -# Additional dependency: objc-msg.s depends on objc-msg-ppc.s and -# objc-msg-i386.s, which it includes. -$(OBJROOT)/runtime/Messengers.subproj/objc-msg.opt.o \ -$(OBJROOT)/runtime/Messengers.subproj/objc-msg.debug.o \ -$(OBJROOT)/runtime/Messengers.subproj/objc-msg.profile.o : \ - $(SRCROOT)/runtime/Messengers.subproj/objc-msg-ppc.s \ - $(SRCROOT)/runtime/Messengers.subproj/objc-msg-ppc64.s \ - $(SRCROOT)/runtime/Messengers.subproj/objc-msg-i386.s \ - $(SRCROOT)/runtime/Messengers.subproj/objc-msg-x86_64.s - -# Additional dependency: objc-msg-sutb.s depends on objc-msg-stub-ppc.s and -# objc-msg-stub-i386.s, which it includes. -$(OBJROOT)/runtime/Messengers.subproj/objc-msg-stub.opt.o \ -$(OBJROOT)/runtime/Messengers.subproj/objc-msg-stub.debug.o \ -$(OBJROOT)/runtime/Messengers.subproj/objc-msg-stub.profile.o : \ - $(SRCROOT)/runtime/Messengers.subproj/objc-msg-stub-ppc.s \ - $(SRCROOT)/runtime/Messengers.subproj/objc-msg-stub-ppc64.s \ - $(SRCROOT)/runtime/Messengers.subproj/objc-msg-stub-i386.s \ - $(SRCROOT)/runtime/Messengers.subproj/objc-msg-stub-x86_64.s - -# Additional dependency: objc-auto.s depends on objc-auto-ppc.s and -# objc-auto-i386.s, which it includes. -$(OBJROOT)/runtime/Auto.subproj/objc-auto.opt.o \ -$(OBJROOT)/runtime/Auto.subproj/objc-auto.debug.o \ -$(OBJROOT)/runtime/Auto.subproj/objc-auto.profile.o : \ - $(SRCROOT)/runtime/Auto.subproj/objc-auto-ppc.s \ - $(SRCROOT)/runtime/Auto.subproj/objc-auto-ppc64.s \ - $(SRCROOT)/runtime/Auto.subproj/objc-auto-i386.s \ - $(SRCROOT)/runtime/Auto.subproj/objc-auto-x86_64.s - -# Additional rules: objc-rtp-sym.s needs to be built with a per-arch seg1addr, -# and need to be stripped here because stripping the dylib does not remove -# debug info from the magic sections. -# objc-rtp-sym.s is not in SOURCES, and objc-rtp-sym.o is not in OBJECTS -$(OBJROOT)/runtime/objc-rtp-sym.ppc.o: $(SRCROOT)/runtime/objc-rtp-sym.s - $(SILENT) $(CC) $(CFLAGS_OPTIMIZED) -arch ppc "$<" -c -o "$@.temp" - $(SILENT) $(STRIP) -S "$@.temp" - $(SILENT) $(LD) -arch ppc -seg1addr 0xfffec000 "$@.temp" -r -o "$@" - -$(OBJROOT)/runtime/objc-rtp-sym.ppc64.o: $(SRCROOT)/runtime/objc-rtp-sym.s - $(SILENT) $(CC) $(CFLAGS_OPTIMIZED) -arch ppc64 "$<" -c -o "$@.temp" - $(SILENT) $(STRIP) -S "$@.temp" - $(SILENT) $(LD) -arch ppc64 -seg1addr 0xfffffffffffec000 "$@.temp" -r -o "$@" - -$(OBJROOT)/runtime/objc-rtp-sym.i386.o: $(SRCROOT)/runtime/objc-rtp-sym.s - $(SILENT) $(CC) $(CFLAGS_OPTIMIZED) -arch i386 "$<" -c -o "$@.temp" - $(SILENT) $(STRIP) -S "$@.temp" - $(SILENT) $(LD) -arch i386 -seg1addr 0xfffe8000 "$@.temp" -r -o "$@" - -$(OBJROOT)/runtime/objc-rtp-sym.x86_64.o: $(SRCROOT)/runtime/objc-rtp-sym.s - $(SILENT) $(CC) $(CFLAGS_OPTIMIZED) -arch x86_64 "$<" -c -o "$@.temp" - $(SILENT) $(STRIP) -S "$@.temp" - $(SILENT) $(LD) -arch x86_64 -seg1addr 0xfffffffffffec000 "$@.temp" -r -o "$@" - -# Additional rule: markgc tool to pretend we compiled with GC write-barriers -$(MARKGC): $(SRCROOT)/markgc.c - $(SILENT) $(ECHO) "Building markgc tool ..." - $(SILENT) $(CC) -std=gnu99 "$<" -o "$@" - -# Additional linkage: LP64 targets require libstdc++ -LIBS_ppc64 = -lstdc++ -LIBS_x86_64 = -lstdc++ - -# These are the main targets: -# build builds the library to OBJROOT and SYMROOT -# installsrc copies the sources to SRCROOT -# installhdrs install only the headers to DSTROOT -# install build, then install the headers and library to DSTROOT -# clean removes build products in OBJROOT and SYMROOT -# -# optimized same as 'build' but builds optimized library only -# debug same as 'build' but builds debug library only -# profile same as 'build' but builds profile library only - -# Default build doesn't currently build the debug library. -build: prebuild build-optimized build-profile postbuild - -optimized: prebuild build-optimized postbuild -debug: prebuild build-debug postbuild -profile: prebuild build-profile postbuild - -installsrc: - $(SILENT) $(ECHO) "Installing source from . to $(SRCROOT)..." -ifeq "$(SRCROOT)" "." - $(SILENT) $(ECHO) "SRCROOT must be defined to be the destination directory; it cannot be '.'" - exit 1 -endif - $(SILENT) $(TAR) -cf $(SRCROOT)/objc4.sources.tar $(SOURCES) $(PUBLIC_HEADERS) $(PRIVATE_HEADERS) $(OTHER_HEADERS) $(OTHER_SOURCES) $(MODULE_SOURCES) - $(SILENT) $(CD) $(SRCROOT) && $(TAR) -xf $(SRCROOT)/objc4.sources.tar - $(SILENT) $(REMOVE) -f $(SRCROOT)/objc4.sources.tar - -installhdrs: - $(SILENT) $(ECHO) "Installing headers from $(SRCROOT) to $(DSTROOT)/$(HEADER_INSTALLDIR)..." - - $(SILENT) $(MKDIRS) $(DSTROOT)/$(PUBLIC_HEADER_INSTALLDIR) - -$(SILENT) $(CHMOD) +w $(DSTROOT)/$(PUBLIC_HEADER_INSTALLDIR)/*.h - $(SILENT) $(COPY) $(addprefix $(SRCROOT)/, $(PUBLIC_HEADERS) ) \ - $(DSTROOT)/$(PUBLIC_HEADER_INSTALLDIR) -# duplicate hashtable2.h to hashtable.h - $(SILENT) $(COPY) $(DSTROOT)/$(PUBLIC_HEADER_INSTALLDIR)/hashtable2.h \ - $(DSTROOT)/$(PUBLIC_HEADER_INSTALLDIR)/hashtable.h - $(SILENT) $(CHMOD) -w $(DSTROOT)/$(PUBLIC_HEADER_INSTALLDIR)/*.h - $(SILENT) $(CHMOD) a+r $(DSTROOT)/$(PUBLIC_HEADER_INSTALLDIR)/*.h - - $(SILENT) $(MKDIRS) $(DSTROOT)/$(OTHER_HEADER_INSTALLDIR) - -$(SILENT) $(CHMOD) +w $(DSTROOT)/$(OTHER_HEADER_INSTALLDIR)/*.h - $(SILENT) $(COPY) $(addprefix $(SRCROOT)/, $(OTHER_HEADERS) ) \ - $(DSTROOT)/$(OTHER_HEADER_INSTALLDIR) - $(SILENT) $(CHMOD) -w $(DSTROOT)/$(OTHER_HEADER_INSTALLDIR)/*.h - $(SILENT) $(CHMOD) a+r $(DSTROOT)/$(OTHER_HEADER_INSTALLDIR)/*.h - - - $(SILENT) $(RM) -f $(DSTROOT)$(PUBLIC_HEADER_DIR)$(PUBLIC_HEADER_DIR_SUFFIX)/hashtable.h - - -install: build installhdrs - $(SILENT) $(ECHO) "Installing products from $(SYMROOT) to $(DSTROOT)..." - - $(SILENT) $(MKDIRS) $(DSTROOT)/$(INSTALLDIR) - -$(SILENT) $(CHMOD) +w $(DSTROOT)/$(INSTALLDIR) - - $(SILENT) $(REMOVE) -f $(DSTROOT)/$(INSTALLDIR)/libobjc.$(VERSION_NAME)$(LIBRARY_EXT) - $(SILENT) $(REMOVE) -f $(DSTROOT)/$(INSTALLDIR)/libobjc_debug.$(VERSION_NAME)$(LIBRARY_EXT) - $(SILENT) $(REMOVE) -f $(DSTROOT)/$(INSTALLDIR)/libobjc_profile.$(VERSION_NAME)$(LIBRARY_EXT) - -# optimized - $(SILENT) $(COPY) $(SYMROOT)/libobjc.$(VERSION_NAME)$(LIBRARY_EXT) $(DSTROOT)/$(INSTALLDIR) - $(SILENT) $(STRIP) -S $(DSTROOT)/$(INSTALLDIR)/libobjc.$(VERSION_NAME)$(LIBRARY_EXT) - -$(SILENT) $(CHOWN) root:wheel $(DSTROOT)/$(INSTALLDIR)/libobjc.$(VERSION_NAME)$(LIBRARY_EXT) - $(SILENT) $(CHMOD) 755 $(DSTROOT)/$(INSTALLDIR)/libobjc.$(VERSION_NAME)$(LIBRARY_EXT) - $(SILENT) $(CD) $(DSTROOT)/$(INSTALLDIR) && \ - $(SYMLINK) libobjc.$(VERSION_NAME)$(LIBRARY_EXT) libobjc$(LIBRARY_EXT) - -# debug (allowed not to exist) - -$(SILENT) $(COPY) $(SYMROOT)/libobjc_debug.$(VERSION_NAME)$(LIBRARY_EXT) $(DSTROOT)/$(INSTALLDIR) - -$(SILENT) $(CHOWN) root:wheel $(DSTROOT)/$(INSTALLDIR)/libobjc_debug.$(VERSION_NAME)$(LIBRARY_EXT) - -$(SILENT) $(CHMOD) 755 $(DSTROOT)/$(INSTALLDIR)/libobjc_debug.$(VERSION_NAME)$(LIBRARY_EXT) - -$(SILENT) $(CD) $(DSTROOT)/$(INSTALLDIR) && \ - test -e libobjc_debug.$(VERSION_NAME)$(LIBRARY_EXT) && \ - $(SYMLINK) libobjc_debug.$(VERSION_NAME)$(LIBRARY_EXT) libobjc_debug$(LIBRARY_EXT) && \ - $(SYMLINK) libobjc_debug.$(VERSION_NAME)$(LIBRARY_EXT) libobjc.$(VERSION_NAME)_debug$(LIBRARY_EXT) - - -# profile (allowed not to exist) - -$(SILENT) $(COPY) $(SYMROOT)/libobjc_profile.$(VERSION_NAME)$(LIBRARY_EXT) $(DSTROOT)/$(INSTALLDIR) - -$(SILENT) $(CHOWN) root:wheel $(DSTROOT)/$(INSTALLDIR)/libobjc_profile.$(VERSION_NAME)$(LIBRARY_EXT) - -$(SILENT) $(CHMOD) 755 $(DSTROOT)/$(INSTALLDIR)/libobjc_profile.$(VERSION_NAME)$(LIBRARY_EXT) - -$(SILENT) $(CD) $(DSTROOT)/$(INSTALLDIR) && \ - test -e libobjc_profile.$(VERSION_NAME)$(LIBRARY_EXT) && \ - $(SYMLINK) libobjc_profile.$(VERSION_NAME)$(LIBRARY_EXT) libobjc_profile$(LIBRARY_EXT) && \ - $(SYMLINK) libobjc_profile.$(VERSION_NAME)$(LIBRARY_EXT) libobjc.$(VERSION_NAME)_profile$(LIBRARY_EXT) - - -clean: - $(SILENT) $(ECHO) "Deleting build products..." - $(SILENT) $(REMOVE) -f \ - $(foreach A, $(ARCH_LIST), \ - $(OBJROOT)/libobjc_debug.$A.$(VERSION_NAME)$(LIBRARY_EXT) \ - $(OBJROOT)/libobjc_profile.$A.$(VERSION_NAME)$(LIBRARY_EXT) \ - $(OBJROOT)/libobjc.$A.$(VERSION_NAME)$(LIBRARY_EXT) \ - $(OBJROOT)/runtime/objc-rtp-sym.$A.o \ - $(OBJROOT)/runtime/objc-rtp-sym.$A.o.temp \ - ) - - $(SILENT) $(REMOVE) -f $(SYMROOT)/libobjc.optimized.o - $(SILENT) $(REMOVE) -f $(SYMROOT)/libobjc.debug.o - $(SILENT) $(REMOVE) -f $(SYMROOT)/libobjc.profile.o - - $(SILENT) $(REMOVE) -f $(SYMROOT)/libobjc.$(VERSION_NAME)$(LIBRARY_EXT) - $(SILENT) $(REMOVE) -f $(SYMROOT)/libobjc_debug.$(VERSION_NAME)$(LIBRARY_EXT) - $(SILENT) $(REMOVE) -f $(SYMROOT)/libobjc_profile.$(VERSION_NAME)$(LIBRARY_EXT) - - $(SILENT) $(REMOVE) -f $(OBJECTS_OPTIMIZED) - $(SILENT) $(REMOVE) -f $(OBJECTS_DEBUG) - $(SILENT) $(REMOVE) -f $(OBJECTS_PROFILE) - - $(SILENT) $(REMOVE) -f $(MODULE_OBJECTS_OPTIMIZED) - $(SILENT) $(REMOVE) -f $(MODULE_OBJECTS_DEBUG) - $(SILENT) $(REMOVE) -f $(MODULE_OBJECTS_PROFILE) - - $(SILENT) $(REMOVE) -rf $(SYMROOT)/ProjectHeaders - - $(SILENT) $(REMOVE) -f $(MARKGC) - -prebuild: - $(SILENT) $(ECHO) "Prebuild-setup..." - -# Install headers into $(SYMROOT)/ProjectHeaders so #includes can find them -# even if they're not installed in /usr. - $(SILENT) $(MKDIRS) $(SYMROOT) - $(SILENT) $(REMOVE_RECUR) $(SYMROOT)/ProjectHeaders - $(SILENT) $(MKDIRS) $(SYMROOT)/ProjectHeaders - $(SILENT) $(ECHO) "Copying headers from $(SRCROOT) to $(SYMROOT)/ProjectHeaders..." - $(SILENT) $(COPY) $(addprefix $(SRCROOT)/, $(PRIVATE_HEADERS) ) $(SYMROOT)/ProjectHeaders - $(SILENT) $(MKDIRS) $(SYMROOT)/ProjectHeaders/objc - $(SILENT) $(COPY) $(addprefix $(SRCROOT)/, $(PUBLIC_HEADERS) ) $(SYMROOT)/ProjectHeaders/objc - $(SILENT) $(COPY) $(addprefix $(SRCROOT)/, $(OTHER_HEADERS) ) $(SYMROOT)/ProjectHeaders/objc - - - -build-optimized: prebuild-optimized compile-optimized link-optimized -build-debug: prebuild-debug compile-debug link-debug -build-profile: prebuild-profile compile-profile link-profile - - -prebuild-optimized: - $(SILENT) $(ECHO) "Building (optimized) ..." - $(SILENT) $(MKDIRS) $(foreach S, $(SUBDIRS), $(OBJROOT)/$(S) ) - -prebuild-debug: - $(SILENT) $(ECHO) "Building (debug) ..." - $(SILENT) $(MKDIRS) $(foreach S, $(SUBDIRS), $(OBJROOT)/$(S) ) - -prebuild-profile: - $(SILENT) $(ECHO) "Building (profile) ..." - $(SILENT) $(MKDIRS) $(foreach S, $(SUBDIRS), $(OBJROOT)/$(S) ) - - -compile-optimized: $(OBJECTS_OPTIMIZED) $(MODULE_OBJECTS_OPTIMIZED) $(foreach A, $(ARCH_LIST), $(OBJROOT)/runtime/objc-rtp-sym.$A.o ) -compile-debug: $(OBJECTS_DEBUG) $(MODULE_OBJECTS_DEBUG) $(foreach A, $(ARCH_LIST), $(OBJROOT)/runtime/objc-rtp-sym.$A.o ) -compile-profile: $(OBJECTS_PROFILE) $(MODULE_OBJECTS_PROFILE) $(foreach A, $(ARCH_LIST), $(OBJROOT)/runtime/objc-rtp-sym.$A.o ) - - -# link lib-suffix, LDFLAGS, OBJECTS, MODULE_OBJECTS -# libsuffix should be "" or _debug or _profile -ifeq "$(PLATFORM)" "Darwin" - -define link - $(foreach A, $(ARCH_LIST), \ - $(SILENT) $(LD) -r \ - -arch $A \ - -o $(OBJROOT)/libobjc$1.$A.o \ - $3 ; \ - $(SILENT) $(CC) $2 \ - -arch $A \ - $(LIBS_$(A)) \ - $(ORDER) \ - -sectcreate __DATA __commpage $(OBJROOT)/runtime/objc-rtp-sym.$A.o \ - -install_name /$(INSTALLDIR)/libobjc$1.$(VERSION_NAME)$(LIBRARY_EXT) \ - -o $(OBJROOT)/libobjc$1.$A.$(VERSION_NAME)$(LIBRARY_EXT) \ - $(OBJROOT)/libobjc$1.$A.o $4 ; \ - ) - $(SILENT) $(LIPO) \ - -create -output $(SYMROOT)/libobjc$1.$(VERSION_NAME)$(LIBRARY_EXT) \ - $(foreach A, $(ARCH_LIST), -arch $A $(OBJROOT)/libobjc$1.$A.$(VERSION_NAME)$(LIBRARY_EXT) ) -endef - -else -# PLATFORM != Darwin -define link - $(SILENT) $(ECHO) "Don't know how to link for platform '$(PLATFORM)'" -endef - -endif - - -link-optimized: - $(SILENT) $(ECHO) "Linking (optimized)..." - $(call link,,$(LDFLAGS_OPTIMIZED),$(OBJECTS_OPTIMIZED),$(MODULE_OBJECTS_OPTIMIZED) ) - -link-debug: - $(SILENT) $(ECHO) "Linking (debug)..." - $(call link,_debug,$(LDFLAGS_DEBUG),$(OBJECTS_DEBUG),$(MODULE_OBJECTS_DEBUG) ) - -link-profile: - $(SILENT) $(ECHO) "Linking (profile)..." - $(call link,_profile,$(LDFLAGS_PROFILE),$(OBJECTS_PROFILE),$(MODULE_OBJECTS_PROFILE) ) - - -postbuild: - $(SILENT) $(ECHO) "Done!" - - diff --git a/ReleaseNotes.rtf b/ReleaseNotes.rtf new file mode 100644 index 0000000..eec82a9 --- /dev/null +++ b/ReleaseNotes.rtf @@ -0,0 +1,358 @@ +{\rtf1\mac\ansicpg10000\cocoartf824\cocoasubrtf420 +{\fonttbl\f0\fswiss\fcharset77 Helvetica-Bold;\f1\fswiss\fcharset77 Helvetica;\f2\fnil\fcharset77 Monaco; +} +{\colortbl;\red255\green255\blue255;\red70\green130\blue100;} +\vieww11200\viewh14360\viewkind0 +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural + +\f0\b\fs30 \cf0 Objective-C Release Notes\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural + +\f1\b0\fs24 \cf0 \ +\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural + +\f0\b\fs30 \cf0 Mac OS X 10.5 Leopard +\f1\b0\fs24 \ +\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural + +\f0\b \cf0 Contents +\f1\b0 \ +\'a5 Garbage Collection\ +\'a5\'caProperties\ +\'a5\'caLoading and Unloading Bundles\ +\'a5 Method and Class Attributes\ +\'a5\'ca@package Instance Variables\ +\'a5\'caRuntime API changes\ +\'a5\'ca64-bit ABI\ +\'a5\'ca64-bit Class and Instance Variable Access Control\ +\'a5\'ca64-bit Non-Fragile Instance Variables\ +\'a5\'ca64-bit Zero-Cost C++-Compatible Exceptions\ +\ +\ + +\f0\b Garbage Collection\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural + +\f1\b0 \cf0 \ +The Objective-C runtime examines on startup the execution image to determine whether to run with garbage collection or not. Each object file has an info section and they must all agree for execution to proceed. Standard compilation results in an info section that indicates that no GC capability is present. Compiling with -fobjc-gc indicates that both GC and retain/release logic is present. Compiling with -fobjc-gc-only indicates that only GC logic is present. A non-GC executable that attempts to load a gc-only framework will fail, as will a GC capable executable that attemps to load a GC incapable framework (or bundle).\ +\ +The collector initially runs only on the main thread when requested via objc_collect_if_needed(1), which is called automatically from the autoreleasepool -drain method. The AppKit arranges to call objc_start_collector_thread() after launch and subsequently collections run on a dedicated thread and are responsive to pure allocation demand. The objc_set_collection_threshold and objc_set_collection_ratio calls are used to establish the "need" for a collection. Once every ratio times a full (complete) collection will occur; otherwise a generational collection will be done if allocations have exceeded the threshold.\ +\ +The garbage collector minimally pauses those threads which have been registered to it while collecting. Registration occurs during establishment of an NSThread, not simply a pthread.\ +\ +A critical assumption that the collector makes is that one thread never gains access to an object (or more generally any block of garbage collected memory) by way of a pointer to another thread's stack memory. In other words, the collector does not make provision for cross thread stack references. This enables the collector to avoid pausing all threads at the same time while it examines recursively all of their references.\ +\ +The compiler uses three "helper" functions for assignments of strong pointers to garbage collected memory into global memory ( +\f2\fs20 objc_assign_global +\f1\fs24 ), garbage collected heap memory ( +\f2\fs20 objc_assign_ivar +\f1\fs24 ), or into unknown memory ( +\f2\fs20 objc_assign_strongCast +\f1\fs24 ). For assignments of weak pointers it uses objc_assign_weak and for reads it uses objc_read_weak.\ +\ +When copying memory in bulk into a garbage collected block one must use the API +\f2\fs20 objc_memmove_collectable(void *dst, const void *src, size_t size) +\f1\fs24 .\ +\ +Garbage Collection Errors\ +\ +The collector itself is found in +\f2\fs20 /usr/lib/libauto.dylib +\f1\fs24 . Its error messages are printed using +\f2\fs20 malloc_printf +\f1\fs24 . The ObjC runtime is found in +\f2\fs20 /usr/lib/libobjc.dylib +\f1\fs24 . Its errors are printed using +\f2\fs20 _objc_inform +\f1\fs24 . Currently we note resurrection and reference count underflow errors by calling the following routines:\ +\ +\pard\tx960\pardeftab960\ql\qnatural\pardirnatural + +\f2\fs20 \cf2 \CocoaLigature0 objc_assign_global_error\ +\pard\tx960\pardeftab960\ql\qnatural\pardirnatural +\cf0 objc_assign_ivar_error\ +\pard\tx960\pardeftab960\ql\qnatural\pardirnatural +\cf2 objc_exception_during_finalize_error\ +auto_zone_resurrection_error\cf0 \ +\cf2 auto_refcount_underflow_error +\f1\fs24 \cf0 \CocoaLigature1 \ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural +\cf0 \ +\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural + +\f0\b \cf0 Properties +\f1\b0 \ +\ +The syntax for Objective-C properties has been overhauled since WWDC 2006. See the property documentation for details.\ +\ +In summary, @property(attributes) type name introduces an implicit declaration of a "getter" and a "setter" method (unless a read-only property is requested) for the "variable" named. The setter= and getter= attributes allow one to specify the names of the methods, otherwise a "name" method and a "setName:" method are implicitly declared. They may also be explicitly named.\ +\ +By default, properties are assigned when set. For objects under non-GC this is often incorrect and a warning is issued unless the assignment semantic is explicitly named. There are three choices - assign, for non-retained object references, copy, for objects that are copied and implicitly retained, and simply retain, for objects that require being retained when set.\ +\ +Access to properties is atomic by default. This is trivial under GC for almost everything and also trivial under non-GC for everything but objects and structures. In particular atomic access to retained objects under non-GC conditions can be expensive. As such, a nonatomic property attribute is available.\ +\ +Pointers may be held strongly under GC by declaring them __strong, and they can be zeroing weak by declaring them __weak.\ +\ +The implementations for properties can be provided by the compiler and runtime through the use of the @synthesize statement in the @implementation section of the class (or class extension). The compiler expects an instance variable of the same name as the property. If one wishes a different name it can be supplied to the @synthesize statement.\ +\ +In particular the compiler and runtime will implement accessors to retained objects by using atomic compare and swap instructions. It is extremely dangerous to directly access an atomic object property through its instance variable since another thread might change its value unpredictably. As such the compiler will warn you about such unprotected accesses. The runtime, in fact, will temporarily use the least significant bit of the instance variable as a temporary lock while retaining the new value and releasing the old. Direct use of an atomic instance variable under non-GC is strongly discouraged.\ +\ +\ + +\f0\b Loading and Unloading Bundles\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural + +\f1\b0 \cf0 \ +Since Mac OS X Version 10.4 it has been possible to unload bundles containing Objective-C. No attempt is made to prevent this if objects are still present for classes that are unloaded. Subclasses of classes loaded in bundles are particularly vulnerable.\ +\ +\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural + +\f0\b \cf0 Method and Class Attributes\ +\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural + +\f1\b0 \cf0 Objective-C now supports some gcc attributes for Objective-C methods. Syntactically, attributes for a method follow the method's declaration, and attributes for a method parameter sit between the parameter type and the parameter name. Supported attributes include:\ +\ +Deprecation and availability, including AvailabilityMacros.h\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural + +\f2\fs20 \cf0 - (void)method:(id)param __attribute__((deprecated));\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural + +\f1\fs24 \cf0 \ +Unused parameters\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural + +\f2\fs20 \cf0 - (void)method:(id) __attribute__((unused)) param;\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural + +\f1\fs24 \cf0 \ +Sentinel parameters, including +\f2\fs20 NS_REQUIRES_NIL_TERMINATION +\f1\fs24 \ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural + +\f2\fs20 \cf0 - (void)methodWithObjects:(id)obj, ... NS_REQUIRES_NIL_TERMINATION;\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural + +\f1\fs24 \cf0 \ +Objective-C also supports some gcc attributes for Objective-C classes. Syntactically, attributes for a class precede the class's +\f2\fs20 @interface +\f1\fs24 declaration. Supported attributes include:\ +\ +Deprecation and availability, including AvailabilityMacros.h\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural + +\f2\fs20 \cf0 __attribute__((deprecated))\ + @interface MyDeprecatedClass : SomeSuperclass\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural + +\f1\fs24 \cf0 \ +Visibility\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural + +\f2\fs20 \cf0 __attribute__((visibility("hidden")))\ + @interface MyPrivateClass : SomeSuperclass +\f1\fs24 \ +\ +\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural + +\f0\b \cf0 @package Instance Variables +\f1\b0 \ +\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural + +\f2\fs20 \cf0 @package +\f1\fs24 is a new ivar protection class, like +\f2\fs20 @public +\f1\fs24 and +\f2\fs20 @protected +\f1\fs24 . +\f2\fs20 @package +\f1\fs24 ivars behave as follows:\ +\'a5\'ca +\f2\fs20 @public +\f1\fs24 in 32-bit; \ +\'a5\'ca +\f2\fs20 @public +\f1\fs24 in 64-bit, inside the framework that defined the class; \ +\'a5\'ca +\f2\fs20 @private +\f1\fs24 in 64-bit, outside the framework that defined the class.\ +\ +In 64-bit, the ivar symbol for an +\f2\fs20 @package +\f1\fs24 ivar is not exported, so any attempt to use the ivar from outside the framework that defined the class will fail with a link error. See "64-bit Class and Instance Variable Access Control" for more about ivar symbols.\ +\ +\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural + +\f0\b \cf0 Runtime API changes\ +\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural + +\f1\b0 \cf0 The C interface to the Objective-C runtime (in +\f2\fs20 +\f1\fs24 ) has changed significantly. Highlights include:\ +\'a5\'caAlmost all structures are deprecated, including +\f2\fs20 struct objc_class +\f1\fs24 . Functional replacements for most of these are provided.\ +\'a5\'ca +\f2\fs20 class_poseAs +\f1\fs24 is deprecated. Use method list manipulation functions instead.\ +\'a5\'ca +\f2\fs20 class_nextMethodList +\f1\fs24 is deprecated. Use +\f2\fs20 class_copyMethodList +\f1\fs24 instead.\ +\'a5\'ca +\f2\fs20 class_addMethods +\f1\fs24 is deprecated. Use +\f2\fs20 class_addMethod +\f1\fs24 instead.\ +\'a5\'ca +\f2\fs20 objc_addClass +\f1\fs24 is deprecated. Use +\f2\fs20 objc_allocateClassPair +\f1\fs24 and +\f2\fs20 objc_registerClassPair +\f1\fs24 instead.\ +\'a5\'caIn general, all deprecated declarations are absent in 64-bit.\ +\'a5\'caThe API in objc/objc-runtime.h and objc/objc-class.h is now in objc/runtime.h and objc/message.h. The old header files simply #include the new ones.\ +\ +\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural + +\f0\b \cf0 64-bit ABI\ +\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural + +\f1\b0 \cf0 The 64-bit Objective-C ABI is generally unlike the 32-bit ABI. The new ABI provides new features, better performance, and improved future adaptability. All aspects of the 64-bit ABI are private and subject to future change. Forthcoming documentation will describe the ABI for the use of compilers and developer tools only.\ +\ +\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural + +\f0\b \cf0 64-bit Class and Instance Variable Access Control\ +\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural + +\f1\b0 \cf0 In 64-bit Objective-C, access control for classes and each class and instance variable has a symbol associated with it. All uses of a class or instance variable reference this symbol. These symbols are subject to access control by the linker.\ +\ +The upshot is that access to private classes and ivars is more strictly enforced. Illegal use of a private ivar may fail with a link error. Frameworks that provide classes and ivars must correctly export their symbols. In particular, frameworks built with +\f2\fs20 -fvisibility=hidden +\f1\fs24 or a linker export list may need to be changed.\ +\ +Class symbols have names of the form +\f2\fs20 _OBJC_CLASS_$_ClassName +\f1\fs24 and +\f2\fs20 _OBJC_METACLASS_$_ClassName +\f1\fs24 . The class symbol is used by clients who send messages to the class (i.e. +\f2\fs20 [ClassName someMessage] +\f1\fs24 ). The metaclass symbol is used by clients who subclass the class.\ +\ +By default, class symbols are exported. They are affected by gcc's symbol visibility flags, so +\f2\fs20 -fvisibility=hidden +\f1\fs24 will make the class symbols non-exported. The linker recognizes the old symbol name +\f2\fs20 .objc_class_name_ClassName +\f1\fs24 in linker export lists and translates it to these symbols. \ +\ +Visibility of a single class can be changed using an attribute.\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural + +\f2\fs20 \cf0 __attribute__((visibility("hidden")))\ + @interface ClassName : SomeSuperclass\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural + +\f1\fs24 \cf0 For classes with +\f2\fs20 "default" +\f1\fs24 visibility, the class symbols are exported, and the ivar symbols are handled as described below. For classes with +\f2\fs20 "hidden" +\f1\fs24 visibility, the class symbols and ivar symbols are all not exported.\ +\ +Ivar symbols have the form +\f2\fs20 _OBJC_IVAR_$_ClassName.IvarName +\f1\fs24 . The ivar symbol is used by clients who read or write the ivar.\ +\ +By default, ivar symbols for +\f2\fs20 @private +\f1\fs24 and +\f2\fs20 @package +\f1\fs24 ivars are not exported, and ivar symbols for +\f2\fs20 @public +\f1\fs24 and +\f2\fs20 @protected +\f1\fs24 ivars are exported. This can be changed by export lists, +\f2\fs20 -fvisibility +\f1\fs24 , or a visibility attribute on the class. Visibility attributes on individual ivars are currently not supported.\ +\ +\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural + +\f0\b \cf0 64-bit Non-Fragile Instance Variables\ +\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural + +\f1\b0 \cf0 All instance variables in 64-bit Objective-C are non-fragile. That is, existing compiled code that uses a class's ivars will not break when the class or a superclass changes its own ivar layout. In particular, framework classes may add new ivars without breaking subclasses compiled against a previous version of the framework.\ +\ +Ivars may be added or reordered freely; existing users of a reordered ivar will adapt transparently. Other ivar changes are safe except that they will break any existing users of the ivar: deleting an ivar, renaming an ivar, moving an ivar to a different class, and changing the type of an ivar. \ +\ +Do not use +\f2\fs20 @defs +\f1\fs24 . The ivar layout it presents cannot adapt to superclass changes.\ +\ +Do not use +\f2\fs20 sizeof(SomeClass) +\f1\fs24 . Use +\f2\fs20 class_getInstanceSize([SomeClass class]) +\f1\fs24 instead.\ +\ +Do not use +\f2\fs20 offsetof(SomeClass, SomeIvar) +\f1\fs24 . Use +\f2\fs20 ivar_getOffset(class_getInstanceVariable([SomeClass class], "SomeIvar")) +\f1\fs24 instead.\ +\ +\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural + +\f0\b \cf0 64-bit Zero-Cost C++-Compatible Exceptions\ +\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural + +\f1\b0 \cf0 In 64-bit, the implementation of Objective-C exceptions has been rewritten. The new system provides "zero-cost" try blocks and interoperability with C++. \ +\ +"Zero-cost" try blocks incur no time penalty when entering an +\f2\fs20 @try +\f1\fs24 block, unlike 32-bit which must call +\f2\fs20 setjmp() +\f1\fs24 and other additional bookkeeping. On the other hand, actually throwing an exception is much more expensive. For best performance in 64-bit, exceptions should be thrown only in exceptional cases.\ +\ +The Cocoa frameworks require that all exceptions be instances of NSException or its subclasses. Do not throw objects of other types.\ +\ +The Cocoa frameworks are generally not exception-safe. Their general pattern is that exceptions are reserved for programmer error only, and the program should quit soon after catching such an exception. Be careful when throwing exceptions across the Cocoa frameworks.\ +\ +In 64-bit, C++ exceptions and Objective-C exceptions are interoperable. In particular, C++ destructors and Objective-C +\f2\fs20 @finally +\f1\fs24 blocks are honored when unwinding any exception, and default catch clauses - +\f2\fs20 catch (...) +\f1\fs24 and +\f2\fs20 @catch (...) +\f1\fs24 - are able to catch and re-throw any exception.\ +\ +Objective-C +\f2\fs20 @catch (id e) +\f1\fs24 catches any Objective-C exception, but no C++ exceptions. Use +\f2\fs20 @catch (...) +\f1\fs24 to catch everything, and +\f2\fs20 @throw; +\f1\fs24 to re-throw caught exceptions. +\f2\fs20 @catch (...) +\f1\fs24 is allowed in 32-bit, and has the same effect there as +\f2\fs20 @catch (id e) +\f1\fs24 . \ +} \ No newline at end of file diff --git a/libobjc.order b/libobjc.order index 5301ba8..d23b201 100644 --- a/libobjc.order +++ b/libobjc.order @@ -117,7 +117,6 @@ _setOriginalClassForFutureClass _change_class_references _NXInitHashState _NXNextHashState -__objc_headerStart _objc_msgSend __class_lookupMethodAndLoadCache __class_getFreedObjectClass diff --git a/markgc.c b/markgc.c index 1224e5f..e2d26e8 100644 --- a/markgc.c +++ b/markgc.c @@ -323,12 +323,12 @@ void doofile(void *start, uint32_t size, struct gcinfo *gcip) { mh->flags = OSSwapInt32(mh->flags); isFlipped = true; } - if (rrOnly && mh->filetype != 6) return; // ignore executables + if (rrOnly && mh->filetype != MH_DYLIB) return; // ignore executables NXArchInfo *info = (NXArchInfo *)NXGetArchInfoFromCpuType(mh->cputype, mh->cpusubtype); //printf("%s:", info->description); gcip->arch = (char *)info->description; //if (debug) printf("...description is %s\n", info->description); - bool is32 = (mh->cputype == 18 || mh->cputype == 7); + bool is32 = !(mh->cputype & CPU_ARCH_ABI64); if (debug) printf("is 32? %d\n", is32); if (debug) printf("filetype -> %d\n", mh->filetype); if (debug) printf("ncmds -> %d\n", mh->ncmds); @@ -386,6 +386,7 @@ void dofat(void *start) { int narchs; struct fat_arch *arch_ptr = (struct fat_arch *)(fh + 1); for (narchs = 0; narchs < fh->nfat_arch; ++narchs) { + if (debug) printf("doing arch %d\n", narchs); if (needsFlip) { arch_ptr->offset = OSSwapInt32(arch_ptr->offset); arch_ptr->size = OSSwapInt32(arch_ptr->size); @@ -433,7 +434,7 @@ void closeFile() { void dumpinfo(char *filename) { initGCInfo(); - openFile(filename); + if (!openFile(filename)) exit(1); struct fat_header *fh = (struct fat_header *)FileBase; if (fh->magic == FAT_MAGIC || fh->magic == FAT_CIGAM) { dofat((void *)FileBase); diff --git a/objc.sln b/objc.sln new file mode 100755 index 0000000..ddfd6e0 --- /dev/null +++ b/objc.sln @@ -0,0 +1,34 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual C++ Express 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "objc", "objc.vcproj", "{B3408263-0CF1-47BE-83CC-56070EFC9BC1}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "objcrt", "objcrt\objcrt.vcproj", "{E38C1996-8B3D-4050-A4B2-DC85957B047D}" + ProjectSection(ProjectDependencies) = postProject + {B3408263-0CF1-47BE-83CC-56070EFC9BC1} = {B3408263-0CF1-47BE-83CC-56070EFC9BC1} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + DebugDLL|Win32 = DebugDLL|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {B3408263-0CF1-47BE-83CC-56070EFC9BC1}.Debug|Win32.ActiveCfg = Debug|Win32 + {B3408263-0CF1-47BE-83CC-56070EFC9BC1}.Debug|Win32.Build.0 = Debug|Win32 + {B3408263-0CF1-47BE-83CC-56070EFC9BC1}.DebugDLL|Win32.ActiveCfg = DebugDLL|Win32 + {B3408263-0CF1-47BE-83CC-56070EFC9BC1}.DebugDLL|Win32.Build.0 = DebugDLL|Win32 + {B3408263-0CF1-47BE-83CC-56070EFC9BC1}.Release|Win32.ActiveCfg = Release|Win32 + {B3408263-0CF1-47BE-83CC-56070EFC9BC1}.Release|Win32.Build.0 = Release|Win32 + {E38C1996-8B3D-4050-A4B2-DC85957B047D}.Debug|Win32.ActiveCfg = Debug|Win32 + {E38C1996-8B3D-4050-A4B2-DC85957B047D}.Debug|Win32.Build.0 = Debug|Win32 + {E38C1996-8B3D-4050-A4B2-DC85957B047D}.DebugDLL|Win32.ActiveCfg = Debug|Win32 + {E38C1996-8B3D-4050-A4B2-DC85957B047D}.DebugDLL|Win32.Build.0 = Debug|Win32 + {E38C1996-8B3D-4050-A4B2-DC85957B047D}.Release|Win32.ActiveCfg = Release|Win32 + {E38C1996-8B3D-4050-A4B2-DC85957B047D}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/objc.suo b/objc.suo new file mode 100755 index 0000000000000000000000000000000000000000..83257504cbd7f9983625e58e8abdfa8fb71a5dcf GIT binary patch literal 23552 zcmeI334B%6oyTuLSzM|Wp#m0zED93#fFL^oL{<%(B_c6|ErDP{Kmi4{>Qt?^=!jEo zoz?|vON*mewY7>`!3Cu{(_+=urPifZt##DaDfIWf_jj8^z?T=G<8(fr@O$U~zVCnT zIrr@MyvMeuKL6skZ*TQdR4WXM8b&*IHjNquJV!Q)!{JfXKnB{ebLY+kMv=_V!aq?B z{8eQ=K#kW*I#8m$n@EkNgQcd@LDC`8q0;B1&r63%>H^UbQVXe>bfnZ=`hrBCI7)F# zskPr9?YNENW29WEt#qu^P9jYQ#T}*Nq~oPdQfKJ|sf+YQ>7S^2|IZiow5URVi`5n* zqJ@epqjOcm*@qVDHR(;#{+UAV9T&A8blsyl4dpb1Mpu}q94n&v(P-s9Th@r^oaBQn zUt4GfO7kbqGFjYr@tqVEM^#Z-G&Y*2cyTmYucaze%B$+QVEd>+4t+i?Lmlq%$IPLO zF~St(Hz{s|^5`tZ=R}2Z{!3Jz5?OVHW0gPSsy_KMXEWvrjJZ9D@lP4k@sAI40C9iE zjDO|==74bgGaoPqq~o8tg*kw7GJb21{}Ezbx4q(U{KLBXGwe~a^Q7KVH>tbSL+UB@ zl157TQXdKbixu~?eUjn<(m-jDG*}uU4V8vT!=(a=bcmY&vNYOkjN@^N$4e8WiPEXk zX;PsyNt!H8k)}%1q|>D@Nz@DwfWYN~ARJ*|O(IbESFGe2LG>6)%t$ zN)^%~>1?S|x=>myRZB~xr4l2F(Y#DrF0GKxlg^h`N?h~c()&I*Y-9C=dy1P~@qw#bWT!fMrYSwLw&LZxas{UjYn$tQdN z+CWL^Z^PqqB(vfi_+ce&mbid9Fm z#47aeM5P%nYk~eMRPMfdKU#f#gyJQNOLfoH>Th%6d1tDwu~;=QH_ol@`^nY(qiz(h z^~80jh_tgz_6qpc&VQKhxm0B+Q}3?O9k3>4nuCwm{LfrP-UO~$SD?+9LkP9=XZ>N` zU8H=ezl9ldXRlKK_2)q4o6i5W^QWa3s_hDuceU!Gt~EgU=cIeKZ0{fcHaXlq^A7!i zHZNEIn63B8{P4fs50i3~=#H7i>K7P0wZp!!+SkhTzEPAzP0osannfELu5F<0^3I(( z4WgW))vn|y+Aw`}&KA8-Km&HsNob`017&SRtY2Hd*ZYWfcD%h4zEPd!R;fcRev{sB zlvsbqsi&03{gshl9M@sBdT_e8V%1~JMbSxdzhABuua~Uunj1d3|DCJ;z>b7f=aa+U z^ncc!^oq6fAE&X$JjFhAs>ecwR;BVwWToOsV4l_^ z=09epWFFo%-}If@KhBrD2`SGM^X&SO7w!r1ia$=dRqoctQ#3y63hcj+kQ3uD+x(A} zZ#q8>*WL33QWdY^rRwQP4eZ|2_FNJ@f5cXYI6%hRmXM;?8p5%LGvOv#_W3{JFMr+TF9TxXk_D{pqvMdWVbMN5& zUYgT1Yp^e*2bI>VEIbGOqiUu;b;3NbT)nE7dK*2epZ@y9eUCM&AnuRd)&IK78mhiI zO!b^6K3x9!^39KXYxlU<7G%{QbF>O3EwMjy-Pe}bpJl08Q|sRnLsh>c)gFCSqa)(^ zU|4K3NA%ENfm?#lhKhC9-%yD;p}SJ@H(V{3?aZL&-=}bDF3shwzUpx6W(cYFYS*ty{Cbc%}?|ar{UHGJ3Uy_zrt-tkN z|HJj~WbH0y#Vxi__gt>hjEr|ANgMv-^Pdp!eacmeg|X%YHD4gY*-oZF{ZsF0$mE-T z#(Bq#fvJYiv%n;ZLcADG2sN$^oC3%Z0s~48VW|6GL^A?mQ+;6&a z02ehHu&}zkoO48dQ&CsSlH!uNrMsugOVX(fMXEPWl-TL=91zxbaoj&DRFj+r^5nis zDQK-^{;D}6V$YnO5iO9-d=Q=yRjE~Jog(emk~0RLt7^Aiw&R{VCmgN*$55sY>4UJk zLMJ)U2MOspdwTv(A7l>V42q|Mx<(-T-?Z;%n}28Jo1VX98h<>C*A;aBRqy=yF6$Cs zc$!+gT(e%W?zc>@oWdph=WI@&qKNT-xUR)1Y_|8`MZOI^|I#0pXvfu60w%ACDoZwJwx2wtx#o& z-u}z_7ZuJet}LB3b>8B+Q^sXAdF=U88AkuEWzSPP@J!KFeI{9PC+%}9OxovK+_j8J z*>-GcPNz(JWH`BnH?boAN&?3Na`xxL$O=_da*)64c4@^v-)uM?Q~KrchB(;_=WFB3 zqYDo%Jeu$*JwoE4ng?bcq4V@vFIjxvQ-8xHw%k4AFJ^l5-zvV){1HhbhT7Ey<{14K1o?7tOSH*mY!v15e+>{(9*x%1&zytL&cl zpP6@Vq~ulE_PSs|SSRqsX8Vz-ZH2>D}%r^g1*NALmQn zge;Qi)F_I!aA>WNDgX40H1XW?EBDX$>wM>)ZT=_Accw(xKdWfii(6gy{Ow#hDNS89 zQs4f*`wlr%FYhw=;yY@}f>k?wy8DLXPV}bC!3RPcEK=g&0BH){E`Aj zC*~xP(Z|yejG3UnL|HgzgHeWI66F~#rG6vLMwv02GCGOJm~n68CE^KY-1lh`aiJOM z_=f%{=?pWp=W|ZM-sjYO4Su@2yl(@zQGs^N4iT1fKU=NsW zGNX>}l?V?>ik3X1ky|<+f(jU#p_rE3j)dyzyeJIhsADMMg{JzBX{v5EKvKbE) zgtFk*KnCmpGsZw8*+(mGY=&P`+0?~B0Xs}KGwk63Yi4$2z*@@Yx~Ff zc4yfw6`v6Jb&^dUd4XSd*^HN-X4FA1*^HNbGtvySJ=`(*j_BoE}+t=H^!7=l|v69|K zDWebZv`hGwKFD^}OH$N+rBr>J&W!QiT&aHR5xI@8=MHc89Kwf?u?wNe|0Q78%C45ym{F$h zNQ9dtu2&)5A`#X~uqDzu=~n5x5{wlx# zA>Azz*uB6ml71`^ek#HC<+}^c|14dPcs4A3cM;HGvjR*~pkAduJHoREeHZD5b1QHtCiI>_XY}j4ual zwQPFE)n@dJZ%Kq3C9X%$__jnydka0|W{F-vufeaG^zTy0xHsO@GrlL`N6+|yL`e6z z^o-kM5=D0?#*dys&mr6;!RQ(E975V#7(r=oN%zOp9X*HefJEBS(k6-UkOcdZ^sq#D zM1s*inAFD;UMlh3=p~MsD|r7|`2Sl2`}f<#Y`(|Y^*EOibiYK{ zB+=s;r4LF3Mj?z*`ZI~ZD1X0_bpA5&)C(jlMP#Mc8u%|W_JaC_n7@O z@Y`gzIq-YT?5V)-X|wHt-*aX!27a%Yy&d@d(d^^EZ--garZx9*h-~hog&FtJ(yU$J z*U_w7;Mdb^K;Spn?Bu|2jM?PCZ<<+g;5W-`QQ%i)c7EV@f!U>j-(_Z31%9i|ZV3Et zG+P_^ec$Y^!0#Tj2Lr#KnLQr(J!$q#;P(r&m(A##ugT6+{JI%q>1;E~H%~TYt_=LD%~qIEmaoZX?)kbIWm#=@wHeo2DVsd5F(d7*vY8*( znvr&$*>}w--x}GZz0Hj4t(Q&tHU@roo82GyJ!rNy@Y`ngY~c62*{gxy>t^o+e(#xm z9Qf@pJMiG7%_(0K*_7||X57b-W~~FiHfCJ{ziws&0>8m#V*|elX43<|8D?_=zxifo z2Y!pq&I|ljnOz$AU1oM|;P-E4HwS)e&3+L0-EQ`y!0%qOErH+TX4?b5=geLT{C;cp zM&S3B*++rj$7YRmpvzi7dmJR2_GoU#I@eV8@rqjnel6|S){J&*Z`L{R%QHJE@Ec?{ zCh!|?HYxC%YF1>%SU5*Ed7W#HA;Q#NB^g&AqDk&$L9BacUAGv_>JMjnrwJz>W6?vza)Tg^!Oifrbg-dv?XbCWWySmk?)&M+t7@(EoGB$D>KrzHapskd>hFo-!Gbx zwvX(5#eL04d!kuCGxBXGo3#DSNIO>cV8!FiNITwaf*JV^lug=+W~7}hyO-iQW~7~K zHqVTF3uTjbz8PuHmpxGNN;A@~GP}Txd>6?&o00F6 zvPt`b8P|JJHuv^g;Pb3W|Z$3 zvs^REcZh7#wlz}}_0|hdZ~11V?PJ#0Oi^@-UWOYvvFoei}jaHm|#Yk+nb$c z#@n;>GD>lY8P}U-R%)gws@BUG#Y@caTWWTW8TrnYO;~2e{Z2MpVaD69>1DLyubXkb z)n-?lQRbDhsjF+u6h*h{rBLx&Gt#az`>q-Ju8~dJ+sqV259pZb8;LFkn4Na@&nS2pJie=^fhjeoD9DEf<;mW*hJ)LSAUX_-TEWDHcyFV$h>@v%f` zWXAI!zuh1lVupRFZ1Qa$uy$tr9z*})(8a84zx54 zU>BQR7O=0HT@|o3X4eI5t=YPO-C=g88TWRt>=P9K*o-p&#OyvZ_T&%9K3VZYW-_Bk zWK-rXX0-34vI$!QzbEat&5SwoP1$V}|32`0*M9GrQNBOPCVUw9ePqAC1Z;=dPBZdo zq((baabv~8aX3^qWj-umN1C+=SWC0k0UKmCG+-mlMg{B?v#|l2WHu#W=b5cEV{IBH zn{ZX&_chs_#jX$7TG`ykZD#b@pUBQtd|$v`vft}w`Z#*a><#uy^@iE6$c!{+$_5vk<;tFAd!A#Vs7$v0MGFE} zX|_0E=b9}K*ac=6ndRy_U$%W|;P(~#U17%Bf2C~VtIYVu;yT%!L0@l{D|?OYZ#r%( z_HEmD1?)$*pKwec-zvMC;-}20t8Hdan+Zi9$kxB;qk#R@Y-hk4ACUMRq&RK2_GZVK zv7hT~ySrn`k}sRS)GuKD%?1Q)pxKas4K*8K#&vqj=6*(+(KmY99_5&^daP`oSyCo5 zIz^289cw?>M6*IO=A7xWd6p|OBfm3bcTqgUj5a*o_Dsh|iA|QxzAj}lqY^RlEwvwP zo>`e0WnM0Otl|{`TPb_A*s6eiMKtvJ1^=8dve@k|E#Wx0i-?87#X0*|r zvI+N^albz{+hoS)56dQxN6aYmX4{Vieoxr%X)~UIp0WK)$9xy^tnC*9zu(w?*D?Eo zKiY1fg3Xvj+4!LlV_$V>T1^8Oei{4HuqL&#=T9E-CptOfnSmR zW|*<&%(Pt^_|383JTt~eneEDeRoPzVm@+Sy%^G^XnWAW=*@b45>tfrN2kZ*ls~vN_ zt7YdazSc}pw8rckX2*(s)AmgPyT$hR9Fy;Q+jj=+F5CAxCg1yIlkd;W6h)7iJz>VP z&r7ynb4=ZDlTCQtjQV?9HqVP6n9&dZY{m!l4g4C)#_wP={61&a+zh{?%-RHgZOu9c zex1yE1b)5EP73@6nT-tmMw?9x{0hyc2YxfmN&~;SW{U#9DzjyQ-+5-227Z^BT^;yc zYj#86cca$4*VW7+ZOmeW41l;d(Q0T!0%PF-v@qg zo4p_SeQ5SSf!|KE1O4nwKWHLbI6BmfesH*1%fRnwv-W}Cab`UOzkIX7f!{E*v4P(N zvuT0fbhBB3-yE}wz^~Hmyufdj*=2#>SIyQ0e%~-l&kwlYTg}!7ejCj0GQ;m4vrU2D z!)A{Me%s8p2Y%0)y&U+xYW7y(_m0{7f!~K_I|9F)CP}+BR-BIWgUpUFqkWs3wGRB+ zm~{;NI+=9~{Cb-83;YI{4GsJX%*F(M + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/objc.xcodeproj/project.pbxproj b/objc.xcodeproj/project.pbxproj new file mode 100644 index 0000000..d7aa938 --- /dev/null +++ b/objc.xcodeproj/project.pbxproj @@ -0,0 +1,729 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 45; + objects = { + +/* Begin PBXBuildFile section */ + 393CEAC00DC69E3E000B69DE /* objc-references.mm in Sources */ = {isa = PBXBuildFile; fileRef = 393CEABF0DC69E3E000B69DE /* objc-references.mm */; settings = {COMPILER_FLAGS = "-fvisibility=hidden"; }; }; + 393CEAC60DC69E67000B69DE /* objc-references.h in Headers */ = {isa = PBXBuildFile; fileRef = 393CEAC50DC69E67000B69DE /* objc-references.h */; }; + 830F2A740D737FB800392440 /* objc-msg-arm.s in Sources */ = {isa = PBXBuildFile; fileRef = 830F2A690D737FB800392440 /* objc-msg-arm.s */; }; + 830F2A750D737FB900392440 /* objc-msg-i386.s in Sources */ = {isa = PBXBuildFile; fileRef = 830F2A6A0D737FB800392440 /* objc-msg-i386.s */; }; + 830F2A760D737FB900392440 /* objc-msg-ppc.s in Sources */ = {isa = PBXBuildFile; fileRef = 830F2A6B0D737FB800392440 /* objc-msg-ppc.s */; }; + 830F2A7D0D737FBB00392440 /* objc-msg-x86_64.s in Sources */ = {isa = PBXBuildFile; fileRef = 830F2A720D737FB800392440 /* objc-msg-x86_64.s */; }; + 830F2A890D73819A00392440 /* objc-auto-i386.s in Sources */ = {isa = PBXBuildFile; fileRef = 830F2A850D73819A00392440 /* objc-auto-i386.s */; }; + 830F2A8A0D73819A00392440 /* objc-auto-ppc.s in Sources */ = {isa = PBXBuildFile; fileRef = 830F2A860D73819A00392440 /* objc-auto-ppc.s */; }; + 830F2A8B0D73819A00392440 /* objc-auto-ppc64.s in Sources */ = {isa = PBXBuildFile; fileRef = 830F2A870D73819A00392440 /* objc-auto-ppc64.s */; }; + 830F2A940D73876100392440 /* objc-accessors.h in Headers */ = {isa = PBXBuildFile; fileRef = 830F2A920D73876100392440 /* objc-accessors.h */; }; + 830F2A950D73876100392440 /* objc-accessors.m in Sources */ = {isa = PBXBuildFile; fileRef = 830F2A930D73876100392440 /* objc-accessors.m */; }; + 830F2A980D738DC200392440 /* hashtable.h in Headers */ = {isa = PBXBuildFile; fileRef = 830F2A970D738DC200392440 /* hashtable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 830F2AB10D73962200392440 /* markgc.c in Sources */ = {isa = PBXBuildFile; fileRef = 830F2AA50D7394C200392440 /* markgc.c */; }; + 83112ED40F00599600A5FBAF /* objc-internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 83112ED30F00599600A5FBAF /* objc-internal.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 831C85D50E10CF850066E64C /* objc-os.h in Headers */ = {isa = PBXBuildFile; fileRef = 831C85D30E10CF850066E64C /* objc-os.h */; }; + 831C85D60E10CF850066E64C /* objc-os.m in Sources */ = {isa = PBXBuildFile; fileRef = 831C85D40E10CF850066E64C /* objc-os.m */; }; + 834266D80E665A8B002E4DA2 /* objc-gdb.h in Headers */ = {isa = PBXBuildFile; fileRef = 834266D70E665A8B002E4DA2 /* objc-gdb.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 838485BE0D6D687300CEA253 /* error.h in Headers */ = {isa = PBXBuildFile; fileRef = 838485B60D6D687300CEA253 /* error.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 838485BF0D6D687300CEA253 /* hashtable2.h in Headers */ = {isa = PBXBuildFile; fileRef = 838485B70D6D687300CEA253 /* hashtable2.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 838485C00D6D687300CEA253 /* hashtable2.m in Sources */ = {isa = PBXBuildFile; fileRef = 838485B80D6D687300CEA253 /* hashtable2.m */; }; + 838485C30D6D687300CEA253 /* maptable.h in Headers */ = {isa = PBXBuildFile; fileRef = 838485BB0D6D687300CEA253 /* maptable.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 838485C40D6D687300CEA253 /* maptable.m in Sources */ = {isa = PBXBuildFile; fileRef = 838485BC0D6D687300CEA253 /* maptable.m */; }; + 838485EF0D6D68A200CEA253 /* objc-api.h in Headers */ = {isa = PBXBuildFile; fileRef = 838485C80D6D68A200CEA253 /* objc-api.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 838485F00D6D68A200CEA253 /* objc-auto.h in Headers */ = {isa = PBXBuildFile; fileRef = 838485C90D6D68A200CEA253 /* objc-auto.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 838485F10D6D68A200CEA253 /* objc-auto.m in Sources */ = {isa = PBXBuildFile; fileRef = 838485CA0D6D68A200CEA253 /* objc-auto.m */; }; + 838485F20D6D68A200CEA253 /* objc-cache.m in Sources */ = {isa = PBXBuildFile; fileRef = 838485CB0D6D68A200CEA253 /* objc-cache.m */; }; + 838485F30D6D68A200CEA253 /* objc-class-old.m in Sources */ = {isa = PBXBuildFile; fileRef = 838485CC0D6D68A200CEA253 /* objc-class-old.m */; }; + 838485F40D6D68A200CEA253 /* objc-class.h in Headers */ = {isa = PBXBuildFile; fileRef = 838485CD0D6D68A200CEA253 /* objc-class.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 838485F50D6D68A200CEA253 /* objc-class.m in Sources */ = {isa = PBXBuildFile; fileRef = 838485CE0D6D68A200CEA253 /* objc-class.m */; }; + 838485F60D6D68A200CEA253 /* objc-config.h in Headers */ = {isa = PBXBuildFile; fileRef = 838485CF0D6D68A200CEA253 /* objc-config.h */; }; + 838485F70D6D68A200CEA253 /* objc-errors.m in Sources */ = {isa = PBXBuildFile; fileRef = 838485D00D6D68A200CEA253 /* objc-errors.m */; }; + 838485F80D6D68A200CEA253 /* objc-exception.h in Headers */ = {isa = PBXBuildFile; fileRef = 838485D10D6D68A200CEA253 /* objc-exception.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 838485F90D6D68A200CEA253 /* objc-exception.m in Sources */ = {isa = PBXBuildFile; fileRef = 838485D20D6D68A200CEA253 /* objc-exception.m */; }; + 838485FA0D6D68A200CEA253 /* objc-file.m in Sources */ = {isa = PBXBuildFile; fileRef = 838485D30D6D68A200CEA253 /* objc-file.m */; }; + 838485FB0D6D68A200CEA253 /* objc-initialize.h in Headers */ = {isa = PBXBuildFile; fileRef = 838485D40D6D68A200CEA253 /* objc-initialize.h */; }; + 838485FC0D6D68A200CEA253 /* objc-initialize.m in Sources */ = {isa = PBXBuildFile; fileRef = 838485D50D6D68A200CEA253 /* objc-initialize.m */; }; + 838485FD0D6D68A200CEA253 /* objc-layout.m in Sources */ = {isa = PBXBuildFile; fileRef = 838485D60D6D68A200CEA253 /* objc-layout.m */; }; + 838485FE0D6D68A200CEA253 /* objc-load.h in Headers */ = {isa = PBXBuildFile; fileRef = 838485D70D6D68A200CEA253 /* objc-load.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 838485FF0D6D68A200CEA253 /* objc-load.m in Sources */ = {isa = PBXBuildFile; fileRef = 838485D80D6D68A200CEA253 /* objc-load.m */; }; + 838486000D6D68A200CEA253 /* objc-loadmethod.h in Headers */ = {isa = PBXBuildFile; fileRef = 838485D90D6D68A200CEA253 /* objc-loadmethod.h */; }; + 838486010D6D68A200CEA253 /* objc-loadmethod.m in Sources */ = {isa = PBXBuildFile; fileRef = 838485DA0D6D68A200CEA253 /* objc-loadmethod.m */; }; + 838486020D6D68A200CEA253 /* objc-lockdebug.m in Sources */ = {isa = PBXBuildFile; fileRef = 838485DB0D6D68A200CEA253 /* objc-lockdebug.m */; }; + 838486030D6D68A200CEA253 /* objc-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 838485DC0D6D68A200CEA253 /* objc-private.h */; }; + 838486050D6D68A200CEA253 /* objc-rtp.h in Headers */ = {isa = PBXBuildFile; fileRef = 838485DE0D6D68A200CEA253 /* objc-rtp.h */; }; + 838486060D6D68A200CEA253 /* objc-rtp.m in Sources */ = {isa = PBXBuildFile; fileRef = 838485DF0D6D68A200CEA253 /* objc-rtp.m */; }; + 838486070D6D68A200CEA253 /* objc-runtime-new.h in Headers */ = {isa = PBXBuildFile; fileRef = 838485E00D6D68A200CEA253 /* objc-runtime-new.h */; }; + 838486080D6D68A200CEA253 /* objc-runtime-new.m in Sources */ = {isa = PBXBuildFile; fileRef = 838485E10D6D68A200CEA253 /* objc-runtime-new.m */; }; + 838486090D6D68A200CEA253 /* objc-runtime-old.m in Sources */ = {isa = PBXBuildFile; fileRef = 838485E20D6D68A200CEA253 /* objc-runtime-old.m */; }; + 8384860A0D6D68A200CEA253 /* objc-runtime.h in Headers */ = {isa = PBXBuildFile; fileRef = 838485E30D6D68A200CEA253 /* objc-runtime.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8384860B0D6D68A200CEA253 /* objc-runtime.m in Sources */ = {isa = PBXBuildFile; fileRef = 838485E40D6D68A200CEA253 /* objc-runtime.m */; }; + 8384860C0D6D68A200CEA253 /* objc-sel-set.h in Headers */ = {isa = PBXBuildFile; fileRef = 838485E50D6D68A200CEA253 /* objc-sel-set.h */; }; + 8384860D0D6D68A200CEA253 /* objc-sel-set.m in Sources */ = {isa = PBXBuildFile; fileRef = 838485E60D6D68A200CEA253 /* objc-sel-set.m */; }; + 8384860F0D6D68A200CEA253 /* objc-sel.mm in Sources */ = {isa = PBXBuildFile; fileRef = 838485E80D6D68A200CEA253 /* objc-sel.mm */; }; + 838486100D6D68A200CEA253 /* objc-sync.h in Headers */ = {isa = PBXBuildFile; fileRef = 838485E90D6D68A200CEA253 /* objc-sync.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 838486110D6D68A200CEA253 /* objc-sync.m in Sources */ = {isa = PBXBuildFile; fileRef = 838485EA0D6D68A200CEA253 /* objc-sync.m */; }; + 838486120D6D68A200CEA253 /* objc-typeencoding.m in Sources */ = {isa = PBXBuildFile; fileRef = 838485EB0D6D68A200CEA253 /* objc-typeencoding.m */; }; + 838486130D6D68A200CEA253 /* objc.h in Headers */ = {isa = PBXBuildFile; fileRef = 838485EC0D6D68A200CEA253 /* objc.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 838486140D6D68A200CEA253 /* Object.h in Headers */ = {isa = PBXBuildFile; fileRef = 838485ED0D6D68A200CEA253 /* Object.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 838486150D6D68A200CEA253 /* Object.m in Sources */ = {isa = PBXBuildFile; fileRef = 838485EE0D6D68A200CEA253 /* Object.m */; }; + 8384861E0D6D68A800CEA253 /* Protocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 838486180D6D68A800CEA253 /* Protocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8384861F0D6D68A800CEA253 /* Protocol.m in Sources */ = {isa = PBXBuildFile; fileRef = 838486190D6D68A800CEA253 /* Protocol.m */; }; + 838486200D6D68A800CEA253 /* runtime.h in Headers */ = {isa = PBXBuildFile; fileRef = 8384861A0D6D68A800CEA253 /* runtime.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 838486250D6D68F000CEA253 /* List.m in Sources */ = {isa = PBXBuildFile; fileRef = 838486230D6D68F000CEA253 /* List.m */; }; + 838486260D6D68F000CEA253 /* List.h in Headers */ = {isa = PBXBuildFile; fileRef = 838486240D6D68F000CEA253 /* List.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 838486280D6D6A2400CEA253 /* message.h in Headers */ = {isa = PBXBuildFile; fileRef = 838485BD0D6D687300CEA253 /* message.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 838B85700DB8915A0029D21A /* objc-sel-table.s in Sources */ = {isa = PBXBuildFile; fileRef = 838B856F0DB8915A0029D21A /* objc-sel-table.s */; }; + 83CDE7530E2E0040003703C1 /* objc-selopt.h in Headers */ = {isa = PBXBuildFile; fileRef = 83CDE7520E2E0040003703C1 /* objc-selopt.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 87BB4EA70EC39854005D08E1 /* objc-probes.d in Sources */ = {isa = PBXBuildFile; fileRef = 87BB4E900EC39633005D08E1 /* objc-probes.d */; }; + BC07A00C0EF72D360014EC61 /* objc-auto-dump.h in Headers */ = {isa = PBXBuildFile; fileRef = BC07A00B0EF72D360014EC61 /* objc-auto-dump.h */; settings = {ATTRIBUTES = (Private, ); }; }; + BC07A0110EF72D9C0014EC61 /* objc-auto-dump.m in Sources */ = {isa = PBXBuildFile; fileRef = BC07A0100EF72D9C0014EC61 /* objc-auto-dump.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 830F2AAF0D7394E900392440 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 830F2AA80D7394D000392440; + remoteInfo = markgc; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 393CEABF0DC69E3E000B69DE /* objc-references.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = "objc-references.mm"; path = "runtime/objc-references.mm"; sourceTree = ""; }; + 393CEAC50DC69E67000B69DE /* objc-references.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "objc-references.h"; path = "runtime/objc-references.h"; sourceTree = ""; }; + 830F2A690D737FB800392440 /* objc-msg-arm.s */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; name = "objc-msg-arm.s"; path = "runtime/Messengers.subproj/objc-msg-arm.s"; sourceTree = ""; }; + 830F2A6A0D737FB800392440 /* objc-msg-i386.s */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; name = "objc-msg-i386.s"; path = "runtime/Messengers.subproj/objc-msg-i386.s"; sourceTree = ""; }; + 830F2A6B0D737FB800392440 /* objc-msg-ppc.s */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; name = "objc-msg-ppc.s"; path = "runtime/Messengers.subproj/objc-msg-ppc.s"; sourceTree = ""; }; + 830F2A720D737FB800392440 /* objc-msg-x86_64.s */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; name = "objc-msg-x86_64.s"; path = "runtime/Messengers.subproj/objc-msg-x86_64.s"; sourceTree = ""; }; + 830F2A850D73819A00392440 /* objc-auto-i386.s */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; name = "objc-auto-i386.s"; path = "runtime/Auto.subproj/objc-auto-i386.s"; sourceTree = ""; }; + 830F2A860D73819A00392440 /* objc-auto-ppc.s */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; name = "objc-auto-ppc.s"; path = "runtime/Auto.subproj/objc-auto-ppc.s"; sourceTree = ""; }; + 830F2A870D73819A00392440 /* objc-auto-ppc64.s */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; name = "objc-auto-ppc64.s"; path = "runtime/Auto.subproj/objc-auto-ppc64.s"; sourceTree = ""; }; + 830F2A920D73876100392440 /* objc-accessors.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "objc-accessors.h"; path = "runtime/Accessors.subproj/objc-accessors.h"; sourceTree = ""; }; + 830F2A930D73876100392440 /* objc-accessors.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "objc-accessors.m"; path = "runtime/Accessors.subproj/objc-accessors.m"; sourceTree = ""; }; + 830F2A970D738DC200392440 /* hashtable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = hashtable.h; path = runtime/hashtable.h; sourceTree = ""; }; + 830F2AA50D7394C200392440 /* markgc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = markgc.c; sourceTree = ""; }; + 830F2AA90D7394D000392440 /* markgc */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = markgc; sourceTree = BUILT_PRODUCTS_DIR; }; + 83112ED30F00599600A5FBAF /* objc-internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "objc-internal.h"; path = "runtime/objc-internal.h"; sourceTree = ""; }; + 831C85D30E10CF850066E64C /* objc-os.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "objc-os.h"; path = "runtime/objc-os.h"; sourceTree = ""; }; + 831C85D40E10CF850066E64C /* objc-os.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "objc-os.m"; path = "runtime/objc-os.m"; sourceTree = ""; }; + 834266D70E665A8B002E4DA2 /* objc-gdb.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "objc-gdb.h"; path = "runtime/objc-gdb.h"; sourceTree = ""; }; + 838485B30D6D682B00CEA253 /* libobjc.order */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = libobjc.order; sourceTree = ""; }; + 838485B40D6D683300CEA253 /* APPLE_LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = APPLE_LICENSE; sourceTree = ""; }; + 838485B50D6D683300CEA253 /* ReleaseNotes.rtf */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; path = ReleaseNotes.rtf; sourceTree = ""; }; + 838485B60D6D687300CEA253 /* error.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = error.h; path = runtime/error.h; sourceTree = ""; }; + 838485B70D6D687300CEA253 /* hashtable2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = hashtable2.h; path = runtime/hashtable2.h; sourceTree = ""; }; + 838485B80D6D687300CEA253 /* hashtable2.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = hashtable2.m; path = runtime/hashtable2.m; sourceTree = ""; }; + 838485BB0D6D687300CEA253 /* maptable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = maptable.h; path = runtime/maptable.h; sourceTree = ""; }; + 838485BC0D6D687300CEA253 /* maptable.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = maptable.m; path = runtime/maptable.m; sourceTree = ""; }; + 838485BD0D6D687300CEA253 /* message.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = message.h; path = runtime/message.h; sourceTree = ""; }; + 838485C80D6D68A200CEA253 /* objc-api.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "objc-api.h"; path = "runtime/objc-api.h"; sourceTree = ""; }; + 838485C90D6D68A200CEA253 /* objc-auto.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "objc-auto.h"; path = "runtime/objc-auto.h"; sourceTree = ""; }; + 838485CA0D6D68A200CEA253 /* objc-auto.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "objc-auto.m"; path = "runtime/objc-auto.m"; sourceTree = ""; }; + 838485CB0D6D68A200CEA253 /* objc-cache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "objc-cache.m"; path = "runtime/objc-cache.m"; sourceTree = ""; }; + 838485CC0D6D68A200CEA253 /* objc-class-old.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "objc-class-old.m"; path = "runtime/objc-class-old.m"; sourceTree = ""; }; + 838485CD0D6D68A200CEA253 /* objc-class.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "objc-class.h"; path = "runtime/objc-class.h"; sourceTree = ""; }; + 838485CE0D6D68A200CEA253 /* objc-class.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "objc-class.m"; path = "runtime/objc-class.m"; sourceTree = ""; }; + 838485CF0D6D68A200CEA253 /* objc-config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "objc-config.h"; path = "runtime/objc-config.h"; sourceTree = ""; }; + 838485D00D6D68A200CEA253 /* objc-errors.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "objc-errors.m"; path = "runtime/objc-errors.m"; sourceTree = ""; }; + 838485D10D6D68A200CEA253 /* objc-exception.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "objc-exception.h"; path = "runtime/objc-exception.h"; sourceTree = ""; }; + 838485D20D6D68A200CEA253 /* objc-exception.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "objc-exception.m"; path = "runtime/objc-exception.m"; sourceTree = ""; }; + 838485D30D6D68A200CEA253 /* objc-file.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "objc-file.m"; path = "runtime/objc-file.m"; sourceTree = ""; }; + 838485D40D6D68A200CEA253 /* objc-initialize.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "objc-initialize.h"; path = "runtime/objc-initialize.h"; sourceTree = ""; }; + 838485D50D6D68A200CEA253 /* objc-initialize.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "objc-initialize.m"; path = "runtime/objc-initialize.m"; sourceTree = ""; }; + 838485D60D6D68A200CEA253 /* objc-layout.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "objc-layout.m"; path = "runtime/objc-layout.m"; sourceTree = ""; }; + 838485D70D6D68A200CEA253 /* objc-load.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "objc-load.h"; path = "runtime/objc-load.h"; sourceTree = ""; }; + 838485D80D6D68A200CEA253 /* objc-load.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "objc-load.m"; path = "runtime/objc-load.m"; sourceTree = ""; }; + 838485D90D6D68A200CEA253 /* objc-loadmethod.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "objc-loadmethod.h"; path = "runtime/objc-loadmethod.h"; sourceTree = ""; }; + 838485DA0D6D68A200CEA253 /* objc-loadmethod.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "objc-loadmethod.m"; path = "runtime/objc-loadmethod.m"; sourceTree = ""; }; + 838485DB0D6D68A200CEA253 /* objc-lockdebug.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "objc-lockdebug.m"; path = "runtime/objc-lockdebug.m"; sourceTree = ""; }; + 838485DC0D6D68A200CEA253 /* objc-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "objc-private.h"; path = "runtime/objc-private.h"; sourceTree = ""; }; + 838485DE0D6D68A200CEA253 /* objc-rtp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "objc-rtp.h"; path = "runtime/objc-rtp.h"; sourceTree = ""; }; + 838485DF0D6D68A200CEA253 /* objc-rtp.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "objc-rtp.m"; path = "runtime/objc-rtp.m"; sourceTree = ""; }; + 838485E00D6D68A200CEA253 /* objc-runtime-new.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "objc-runtime-new.h"; path = "runtime/objc-runtime-new.h"; sourceTree = ""; }; + 838485E10D6D68A200CEA253 /* objc-runtime-new.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "objc-runtime-new.m"; path = "runtime/objc-runtime-new.m"; sourceTree = ""; }; + 838485E20D6D68A200CEA253 /* objc-runtime-old.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "objc-runtime-old.m"; path = "runtime/objc-runtime-old.m"; sourceTree = ""; }; + 838485E30D6D68A200CEA253 /* objc-runtime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "objc-runtime.h"; path = "runtime/objc-runtime.h"; sourceTree = ""; }; + 838485E40D6D68A200CEA253 /* objc-runtime.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "objc-runtime.m"; path = "runtime/objc-runtime.m"; sourceTree = ""; }; + 838485E50D6D68A200CEA253 /* objc-sel-set.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "objc-sel-set.h"; path = "runtime/objc-sel-set.h"; sourceTree = ""; }; + 838485E60D6D68A200CEA253 /* objc-sel-set.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "objc-sel-set.m"; path = "runtime/objc-sel-set.m"; sourceTree = ""; }; + 838485E80D6D68A200CEA253 /* objc-sel.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = "objc-sel.mm"; path = "runtime/objc-sel.mm"; sourceTree = ""; }; + 838485E90D6D68A200CEA253 /* objc-sync.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "objc-sync.h"; path = "runtime/objc-sync.h"; sourceTree = ""; }; + 838485EA0D6D68A200CEA253 /* objc-sync.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "objc-sync.m"; path = "runtime/objc-sync.m"; sourceTree = ""; }; + 838485EB0D6D68A200CEA253 /* objc-typeencoding.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "objc-typeencoding.m"; path = "runtime/objc-typeencoding.m"; sourceTree = ""; }; + 838485EC0D6D68A200CEA253 /* objc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = objc.h; path = runtime/objc.h; sourceTree = ""; }; + 838485ED0D6D68A200CEA253 /* Object.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Object.h; path = runtime/Object.h; sourceTree = ""; }; + 838485EE0D6D68A200CEA253 /* Object.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Object.m; path = runtime/Object.m; sourceTree = ""; }; + 838486180D6D68A800CEA253 /* Protocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Protocol.h; path = runtime/Protocol.h; sourceTree = ""; }; + 838486190D6D68A800CEA253 /* Protocol.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Protocol.m; path = runtime/Protocol.m; sourceTree = ""; }; + 8384861A0D6D68A800CEA253 /* runtime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = runtime.h; path = runtime/runtime.h; sourceTree = ""; }; + 838486230D6D68F000CEA253 /* List.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = List.m; path = runtime/OldClasses.subproj/List.m; sourceTree = ""; }; + 838486240D6D68F000CEA253 /* List.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = List.h; path = runtime/OldClasses.subproj/List.h; sourceTree = ""; }; + 838B856F0DB8915A0029D21A /* objc-sel-table.s */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; name = "objc-sel-table.s"; path = "runtime/objc-sel-table.s"; sourceTree = ""; }; + 83CDE7520E2E0040003703C1 /* objc-selopt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "objc-selopt.h"; path = "runtime/objc-selopt.h"; sourceTree = ""; }; + 87BB4E900EC39633005D08E1 /* objc-probes.d */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.dtrace; name = "objc-probes.d"; path = "runtime/objc-probes.d"; sourceTree = ""; }; + BC07A00B0EF72D360014EC61 /* objc-auto-dump.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "objc-auto-dump.h"; path = "runtime/objc-auto-dump.h"; sourceTree = ""; }; + BC07A0100EF72D9C0014EC61 /* objc-auto-dump.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "objc-auto-dump.m"; path = "runtime/objc-auto-dump.m"; sourceTree = ""; }; + D2AAC0630554660B00DB518D /* libobjc.A.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libobjc.A.dylib; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 830F2AA70D7394D000392440 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D289988505E68E00004EDB86 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 08FB7794FE84155DC02AAC07 /* objc */ = { + isa = PBXGroup; + children = ( + 838485C60D6D687700CEA253 /* Public Headers */, + 838485C70D6D688200CEA253 /* Private Headers */, + 8384862A0D6D6ABC00CEA253 /* Project Headers */, + 838486220D6D68E300CEA253 /* Obsolete Headers */, + 838486270D6D690F00CEA253 /* Obsolete Source */, + 08FB7795FE84155DC02AAC07 /* Source */, + 838485B20D6D67F900CEA253 /* Other */, + 1AB674ADFE9D54B511CA2CBB /* Products */, + ); + name = objc; + sourceTree = ""; + }; + 08FB7795FE84155DC02AAC07 /* Source */ = { + isa = PBXGroup; + children = ( + 838B856F0DB8915A0029D21A /* objc-sel-table.s */, + 838485B80D6D687300CEA253 /* hashtable2.m */, + 838485BC0D6D687300CEA253 /* maptable.m */, + 830F2A930D73876100392440 /* objc-accessors.m */, + 838485CA0D6D68A200CEA253 /* objc-auto.m */, + BC07A0100EF72D9C0014EC61 /* objc-auto-dump.m */, + 838485CB0D6D68A200CEA253 /* objc-cache.m */, + 838485CC0D6D68A200CEA253 /* objc-class-old.m */, + 838485CE0D6D68A200CEA253 /* objc-class.m */, + 838485D00D6D68A200CEA253 /* objc-errors.m */, + 838485D20D6D68A200CEA253 /* objc-exception.m */, + 838485D30D6D68A200CEA253 /* objc-file.m */, + 838485D50D6D68A200CEA253 /* objc-initialize.m */, + 838485D60D6D68A200CEA253 /* objc-layout.m */, + 838485D80D6D68A200CEA253 /* objc-load.m */, + 838485DA0D6D68A200CEA253 /* objc-loadmethod.m */, + 838485DB0D6D68A200CEA253 /* objc-lockdebug.m */, + 831C85D40E10CF850066E64C /* objc-os.m */, + 393CEABF0DC69E3E000B69DE /* objc-references.mm */, + 838485DF0D6D68A200CEA253 /* objc-rtp.m */, + 838485E10D6D68A200CEA253 /* objc-runtime-new.m */, + 838485E20D6D68A200CEA253 /* objc-runtime-old.m */, + 838485E40D6D68A200CEA253 /* objc-runtime.m */, + 838485E60D6D68A200CEA253 /* objc-sel-set.m */, + 838485E80D6D68A200CEA253 /* objc-sel.mm */, + 838485EA0D6D68A200CEA253 /* objc-sync.m */, + 838485EB0D6D68A200CEA253 /* objc-typeencoding.m */, + 830F2A850D73819A00392440 /* objc-auto-i386.s */, + 830F2A860D73819A00392440 /* objc-auto-ppc.s */, + 830F2A870D73819A00392440 /* objc-auto-ppc64.s */, + 830F2A690D737FB800392440 /* objc-msg-arm.s */, + 830F2A6A0D737FB800392440 /* objc-msg-i386.s */, + 830F2A6B0D737FB800392440 /* objc-msg-ppc.s */, + 830F2A720D737FB800392440 /* objc-msg-x86_64.s */, + 87BB4E900EC39633005D08E1 /* objc-probes.d */, + ); + name = Source; + sourceTree = ""; + }; + 1AB674ADFE9D54B511CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + D2AAC0630554660B00DB518D /* libobjc.A.dylib */, + 830F2AA90D7394D000392440 /* markgc */, + ); + name = Products; + sourceTree = ""; + }; + 838485B20D6D67F900CEA253 /* Other */ = { + isa = PBXGroup; + children = ( + 830F2AA50D7394C200392440 /* markgc.c */, + 838485B40D6D683300CEA253 /* APPLE_LICENSE */, + 838485B50D6D683300CEA253 /* ReleaseNotes.rtf */, + 838485B30D6D682B00CEA253 /* libobjc.order */, + ); + name = Other; + sourceTree = ""; + }; + 838485C60D6D687700CEA253 /* Public Headers */ = { + isa = PBXGroup; + children = ( + 838485BD0D6D687300CEA253 /* message.h */, + 838485C80D6D68A200CEA253 /* objc-api.h */, + 838485C90D6D68A200CEA253 /* objc-auto.h */, + 838485D10D6D68A200CEA253 /* objc-exception.h */, + 838485E90D6D68A200CEA253 /* objc-sync.h */, + 838485EC0D6D68A200CEA253 /* objc.h */, + 8384861A0D6D68A800CEA253 /* runtime.h */, + ); + name = "Public Headers"; + sourceTree = ""; + }; + 838485C70D6D688200CEA253 /* Private Headers */ = { + isa = PBXGroup; + children = ( + 83112ED30F00599600A5FBAF /* objc-internal.h */, + 838485BB0D6D687300CEA253 /* maptable.h */, + BC07A00B0EF72D360014EC61 /* objc-auto-dump.h */, + 834266D70E665A8B002E4DA2 /* objc-gdb.h */, + 83CDE7520E2E0040003703C1 /* objc-selopt.h */, + ); + name = "Private Headers"; + sourceTree = ""; + }; + 838486220D6D68E300CEA253 /* Obsolete Headers */ = { + isa = PBXGroup; + children = ( + 838485B60D6D687300CEA253 /* error.h */, + 830F2A970D738DC200392440 /* hashtable.h */, + 838485B70D6D687300CEA253 /* hashtable2.h */, + 838485CD0D6D68A200CEA253 /* objc-class.h */, + 838485D70D6D68A200CEA253 /* objc-load.h */, + 838485E30D6D68A200CEA253 /* objc-runtime.h */, + 838486240D6D68F000CEA253 /* List.h */, + 838485ED0D6D68A200CEA253 /* Object.h */, + 838486180D6D68A800CEA253 /* Protocol.h */, + ); + name = "Obsolete Headers"; + sourceTree = ""; + }; + 838486270D6D690F00CEA253 /* Obsolete Source */ = { + isa = PBXGroup; + children = ( + 838486230D6D68F000CEA253 /* List.m */, + 838485EE0D6D68A200CEA253 /* Object.m */, + 838486190D6D68A800CEA253 /* Protocol.m */, + ); + name = "Obsolete Source"; + sourceTree = ""; + }; + 8384862A0D6D6ABC00CEA253 /* Project Headers */ = { + isa = PBXGroup; + children = ( + 831C85D30E10CF850066E64C /* objc-os.h */, + 830F2A920D73876100392440 /* objc-accessors.h */, + 838485CF0D6D68A200CEA253 /* objc-config.h */, + 838485D40D6D68A200CEA253 /* objc-initialize.h */, + 838485D90D6D68A200CEA253 /* objc-loadmethod.h */, + 838485DC0D6D68A200CEA253 /* objc-private.h */, + 393CEAC50DC69E67000B69DE /* objc-references.h */, + 838485DE0D6D68A200CEA253 /* objc-rtp.h */, + 838485E00D6D68A200CEA253 /* objc-runtime-new.h */, + 838485E50D6D68A200CEA253 /* objc-sel-set.h */, + ); + name = "Project Headers"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + D2AAC0600554660B00DB518D /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 838485BE0D6D687300CEA253 /* error.h in Headers */, + 838485BF0D6D687300CEA253 /* hashtable2.h in Headers */, + 838485C30D6D687300CEA253 /* maptable.h in Headers */, + 838485EF0D6D68A200CEA253 /* objc-api.h in Headers */, + 838485F00D6D68A200CEA253 /* objc-auto.h in Headers */, + BC07A00C0EF72D360014EC61 /* objc-auto-dump.h in Headers */, + 838485F40D6D68A200CEA253 /* objc-class.h in Headers */, + 838485F60D6D68A200CEA253 /* objc-config.h in Headers */, + 838485F80D6D68A200CEA253 /* objc-exception.h in Headers */, + 838485FB0D6D68A200CEA253 /* objc-initialize.h in Headers */, + 838485FE0D6D68A200CEA253 /* objc-load.h in Headers */, + 838486000D6D68A200CEA253 /* objc-loadmethod.h in Headers */, + 838486030D6D68A200CEA253 /* objc-private.h in Headers */, + 838486050D6D68A200CEA253 /* objc-rtp.h in Headers */, + 838486070D6D68A200CEA253 /* objc-runtime-new.h in Headers */, + 8384860A0D6D68A200CEA253 /* objc-runtime.h in Headers */, + 83CDE7530E2E0040003703C1 /* objc-selopt.h in Headers */, + 8384860C0D6D68A200CEA253 /* objc-sel-set.h in Headers */, + 838486100D6D68A200CEA253 /* objc-sync.h in Headers */, + 838486130D6D68A200CEA253 /* objc.h in Headers */, + 838486140D6D68A200CEA253 /* Object.h in Headers */, + 8384861E0D6D68A800CEA253 /* Protocol.h in Headers */, + 838486200D6D68A800CEA253 /* runtime.h in Headers */, + 838486260D6D68F000CEA253 /* List.h in Headers */, + 838486280D6D6A2400CEA253 /* message.h in Headers */, + 830F2A940D73876100392440 /* objc-accessors.h in Headers */, + 830F2A980D738DC200392440 /* hashtable.h in Headers */, + 393CEAC60DC69E67000B69DE /* objc-references.h in Headers */, + 831C85D50E10CF850066E64C /* objc-os.h in Headers */, + 834266D80E665A8B002E4DA2 /* objc-gdb.h in Headers */, + 83112ED40F00599600A5FBAF /* objc-internal.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 830F2AA80D7394D000392440 /* markgc */ = { + isa = PBXNativeTarget; + buildConfigurationList = 830F2AAE0D7394D600392440 /* Build configuration list for PBXNativeTarget "markgc" */; + buildPhases = ( + 830F2AA60D7394D000392440 /* Sources */, + 830F2AA70D7394D000392440 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = markgc; + productName = markgc; + productReference = 830F2AA90D7394D000392440 /* markgc */; + productType = "com.apple.product-type.tool"; + }; + D2AAC0620554660B00DB518D /* objc */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1DEB914A08733D8E0010E9CD /* Build configuration list for PBXNativeTarget "objc" */; + buildPhases = ( + D2AAC0600554660B00DB518D /* Headers */, + D2AAC0610554660B00DB518D /* Sources */, + D289988505E68E00004EDB86 /* Frameworks */, + 830F2AB60D739AB600392440 /* Run Script (markgc) */, + 830F2AFA0D73BC5800392440 /* Run Script (symlink) */, + ); + buildRules = ( + ); + dependencies = ( + 830F2AB00D7394E900392440 /* PBXTargetDependency */, + ); + name = objc; + productName = objc; + productReference = D2AAC0630554660B00DB518D /* libobjc.A.dylib */; + productType = "com.apple.product-type.library.dynamic"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 08FB7793FE84155DC02AAC07 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = NO; + }; + buildConfigurationList = 1DEB914E08733D8E0010E9CD /* Build configuration list for PBXProject "objc" */; + compatibilityVersion = "Xcode 3.1"; + hasScannedForEncodings = 1; + mainGroup = 08FB7794FE84155DC02AAC07 /* objc */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + D2AAC0620554660B00DB518D /* objc */, + 830F2AA80D7394D000392440 /* markgc */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXShellScriptBuildPhase section */ + 830F2AB60D739AB600392440 /* Run Script (markgc) */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + comments = "Set the GC-supported bit in libobjc itself.\n\nlibobjc cannot be built with -fobjc-gc, because it needs more precise control over write-barrier use.\n\nThis is done on all architectures and platforms, even though some don't actually support GC. In those cases, a program that actually tries to use GC will fail with link errors."; + files = ( + ); + inputPaths = ( + ); + name = "Run Script (markgc)"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${BUILT_PRODUCTS_DIR}/markgc\" -p \"${BUILT_PRODUCTS_DIR}/libobjc.A.dylib\"\n"; + }; + 830F2AFA0D73BC5800392440 /* Run Script (symlink) */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 8; + files = ( + ); + inputPaths = ( + ); + name = "Run Script (symlink)"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 1; + shellPath = /bin/sh; + shellScript = "cd \"${INSTALL_DIR}\"\n/bin/ln -s libobjc.A.dylib libobjc.dylib\n"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 830F2AA60D7394D000392440 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 830F2AB10D73962200392440 /* markgc.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D2AAC0610554660B00DB518D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 838485C00D6D687300CEA253 /* hashtable2.m in Sources */, + 838485C40D6D687300CEA253 /* maptable.m in Sources */, + 838485F10D6D68A200CEA253 /* objc-auto.m in Sources */, + 838485F20D6D68A200CEA253 /* objc-cache.m in Sources */, + 838485F30D6D68A200CEA253 /* objc-class-old.m in Sources */, + 838485F50D6D68A200CEA253 /* objc-class.m in Sources */, + 838485F70D6D68A200CEA253 /* objc-errors.m in Sources */, + 838485F90D6D68A200CEA253 /* objc-exception.m in Sources */, + 838485FA0D6D68A200CEA253 /* objc-file.m in Sources */, + 838485FC0D6D68A200CEA253 /* objc-initialize.m in Sources */, + 838485FD0D6D68A200CEA253 /* objc-layout.m in Sources */, + 838485FF0D6D68A200CEA253 /* objc-load.m in Sources */, + 838486010D6D68A200CEA253 /* objc-loadmethod.m in Sources */, + 838486020D6D68A200CEA253 /* objc-lockdebug.m in Sources */, + 838486060D6D68A200CEA253 /* objc-rtp.m in Sources */, + 838486080D6D68A200CEA253 /* objc-runtime-new.m in Sources */, + 838486090D6D68A200CEA253 /* objc-runtime-old.m in Sources */, + 8384860B0D6D68A200CEA253 /* objc-runtime.m in Sources */, + 8384860D0D6D68A200CEA253 /* objc-sel-set.m in Sources */, + 8384860F0D6D68A200CEA253 /* objc-sel.mm in Sources */, + 838486110D6D68A200CEA253 /* objc-sync.m in Sources */, + 838486120D6D68A200CEA253 /* objc-typeencoding.m in Sources */, + 838486150D6D68A200CEA253 /* Object.m in Sources */, + 8384861F0D6D68A800CEA253 /* Protocol.m in Sources */, + 838486250D6D68F000CEA253 /* List.m in Sources */, + 830F2A740D737FB800392440 /* objc-msg-arm.s in Sources */, + 830F2A750D737FB900392440 /* objc-msg-i386.s in Sources */, + 830F2A760D737FB900392440 /* objc-msg-ppc.s in Sources */, + 830F2A7D0D737FBB00392440 /* objc-msg-x86_64.s in Sources */, + 830F2A890D73819A00392440 /* objc-auto-i386.s in Sources */, + 830F2A8A0D73819A00392440 /* objc-auto-ppc.s in Sources */, + 830F2A8B0D73819A00392440 /* objc-auto-ppc64.s in Sources */, + 830F2A950D73876100392440 /* objc-accessors.m in Sources */, + 838B85700DB8915A0029D21A /* objc-sel-table.s in Sources */, + 393CEAC00DC69E3E000B69DE /* objc-references.mm in Sources */, + 831C85D60E10CF850066E64C /* objc-os.m in Sources */, + 87BB4EA70EC39854005D08E1 /* objc-probes.d in Sources */, + BC07A0110EF72D9C0014EC61 /* objc-auto-dump.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 830F2AB00D7394E900392440 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 830F2AA80D7394D000392440 /* markgc */; + targetProxy = 830F2AAF0D7394E900392440 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 1DEB914B08733D8E0010E9CD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + DYLIB_CURRENT_VERSION = 227; + EXECUTABLE_PREFIX = lib; + GCC_CW_ASM_SYNTAX = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_FAST_OBJC_DISPATCH = NO; + GCC_MODEL_TUNING = G5; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_THREADSAFE_STATICS = NO; + GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO; + HEADER_SEARCH_PATHS = ( + "$(DSTROOT)/usr/include/**", + "$(DSTROOT)/usr/local/include/**", + "$(CONFIGURATION_BUILD_DIR)/usr/include/**", + "$(CONFIGURATION_BUILD_DIR)/usr/local/include/**", + ); + INSTALL_PATH = /usr/lib; + ORDER_FILE = libobjc.order; + OTHER_CFLAGS = "-fdollars-in-identifiers"; + "OTHER_LDFLAGS[arch=i386]" = "-lauto"; + "OTHER_LDFLAGS[arch=ppc64]" = ( + "-lauto", + "-lstdc++", + ); + "OTHER_LDFLAGS[arch=ppc]" = "-lauto"; + "OTHER_LDFLAGS[arch=x86_64]" = ( + "-lauto", + "-lstdc++", + ); + PRIVATE_HEADERS_FOLDER_PATH = /usr/local/include/objc; + PRODUCT_NAME = objc.A; + PUBLIC_HEADERS_FOLDER_PATH = /usr/include/objc; + UNEXPORTED_SYMBOLS_FILE = unexported_symbols; + }; + name = Debug; + }; + 1DEB914C08733D8E0010E9CD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + DYLIB_CURRENT_VERSION = 227; + EXECUTABLE_PREFIX = lib; + GCC_CW_ASM_SYNTAX = NO; + GCC_FAST_OBJC_DISPATCH = NO; + GCC_MODEL_TUNING = G5; + GCC_THREADSAFE_STATICS = NO; + GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO; + HEADER_SEARCH_PATHS = ( + "$(DSTROOT)/usr/include/**", + "$(DSTROOT)/usr/local/include/**", + "$(CONFIGURATION_BUILD_DIR)/usr/include/**", + "$(CONFIGURATION_BUILD_DIR)/usr/local/include/**", + ); + INSTALL_PATH = /usr/lib; + ORDER_FILE = libobjc.order; + OTHER_CFLAGS = "-fdollars-in-identifiers"; + "OTHER_LDFLAGS[arch=i386]" = "-lauto"; + "OTHER_LDFLAGS[arch=ppc64]" = ( + "-lauto", + "-lstdc++", + ); + "OTHER_LDFLAGS[arch=ppc]" = "-lauto"; + "OTHER_LDFLAGS[arch=x86_64]" = ( + "-lauto", + "-lstdc++", + ); + PRIVATE_HEADERS_FOLDER_PATH = /usr/local/include/objc; + PRODUCT_NAME = objc.A; + PUBLIC_HEADERS_FOLDER_PATH = /usr/include/objc; + UNEXPORTED_SYMBOLS_FILE = unexported_symbols; + }; + name = Release; + }; + 1DEB914F08733D8E0010E9CD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = ( + i386, + x86_64, + ppc, + ); + DEBUG_INFORMATION_FORMAT = dwarf; + GCC_ENABLE_CPP_EXCEPTIONS = NO; + GCC_ENABLE_CPP_RTTI = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + ONLY_ACTIVE_ARCH = NO; + PREBINDING = NO; + SDKROOT = ""; + STANDARD_C_PLUS_PLUS_LIBRARY_TYPE = dynamic; + UNEXPORTED_SYMBOLS_FILE = unexported_symbols; + WARNING_CFLAGS = ( + "-Wall", + "-Wno-four-char-constants", + ); + }; + name = Debug; + }; + 1DEB915008733D8E0010E9CD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = ( + i386, + x86_64, + ppc, + ); + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_ENABLE_CPP_EXCEPTIONS = NO; + GCC_ENABLE_CPP_RTTI = NO; + GCC_PREPROCESSOR_DEFINITIONS = NDEBUG; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + ONLY_ACTIVE_ARCH = NO; + PREBINDING = NO; + SDKROOT = ""; + STANDARD_C_PLUS_PLUS_LIBRARY_TYPE = dynamic; + WARNING_CFLAGS = ( + "-Wall", + "-Wno-four-char-constants", + ); + }; + name = Release; + }; + 830F2AAB0D7394D100392440 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(NATIVE_ARCH)"; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_MODEL_TUNING = G5; + GCC_OPTIMIZATION_LEVEL = 0; + INSTALL_PATH = /usr/local/bin; + PREBINDING = NO; + PRODUCT_NAME = markgc; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + 830F2AAC0D7394D100392440 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(NATIVE_ARCH)"; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_ENABLE_FIX_AND_CONTINUE = NO; + GCC_MODEL_TUNING = G5; + INSTALL_PATH = /usr/local/bin; + PREBINDING = NO; + PRODUCT_NAME = markgc; + SKIP_INSTALL = YES; + ZERO_LINK = NO; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1DEB914A08733D8E0010E9CD /* Build configuration list for PBXNativeTarget "objc" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB914B08733D8E0010E9CD /* Debug */, + 1DEB914C08733D8E0010E9CD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1DEB914E08733D8E0010E9CD /* Build configuration list for PBXProject "objc" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB914F08733D8E0010E9CD /* Debug */, + 1DEB915008733D8E0010E9CD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 830F2AAE0D7394D600392440 /* Build configuration list for PBXNativeTarget "markgc" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 830F2AAB0D7394D100392440 /* Debug */, + 830F2AAC0D7394D100392440 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 08FB7793FE84155DC02AAC07 /* Project object */; +} diff --git a/objcrt/objcrt.vcproj b/objcrt/objcrt.vcproj new file mode 100755 index 0000000..22b5919 --- /dev/null +++ b/objcrt/objcrt.vcproj @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/runtests.sh b/runtests.sh new file mode 100755 index 0000000..f10f766 --- /dev/null +++ b/runtests.sh @@ -0,0 +1,24 @@ +#!/bin/sh +# Simple script to run the libclosure tests +# Note: to build the testing root, the makefile will ask to authenticate with sudo +# Use the RootsDirectory environment variable to direct the build to somewhere other than /tmp/ + +RootsDirectory=${RootsDirectory:-/tmp/} +StartingDir="$PWD" +ObjcDir="`dirname $0`" +TestsDir="test/" +cd "$ObjcDir" +# ER: option to not require extra privileges (-nosudo or somesuch) +Buildit="/Network/Servers/xs1/release/bin/buildit -rootsDirectory ${RootsDirectory} -arch i386 -arch ppc -arch x86_64 -project objc4 ." +echo Sudoing for buildit: +sudo $Buildit +XIT=$? +if [[ $XIT == 0 ]]; then + cd "$TestsDir" + ObjcRootPath="$RootsDirectory/objc4.roots/objc4~dst/usr/lib/libobjc.A.dylib" + make HALT=YES OBJC_LIB="$ObjcRootPath" + XIT=$? + make clean +fi +cd "$StartingDir" +exit $XIT \ No newline at end of file diff --git a/runtime/Accessors.subproj/objc-accessors-i386.s b/runtime/Accessors.subproj/objc-accessors-i386.s deleted file mode 100644 index 97e8f74..0000000 --- a/runtime/Accessors.subproj/objc-accessors-i386.s +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright (c) 2006 Apple Inc. All Rights Reserved. - * - * @APPLE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_LICENSE_HEADER_END@ - */ - -////////////////////////////////////////////////////////////////////// -// -// ENTRY functionName -// -// Assembly directives to begin an exported function. -// -// Takes: functionName - name of the exported function -////////////////////////////////////////////////////////////////////// - -.macro ENTRY - .text - .globl $0 -$0: -.endmacro - -////////////////////////////////////////////////////////////////////// -// -// END_ENTRY functionName -// -// Assembly directives to end an exported function. Just a placeholder, -// a close-parenthesis for ENTRY, until it is needed for something. -// -// Takes: functionName - name of the exported function -////////////////////////////////////////////////////////////////////// - -.macro END_ENTRY -.endmacro - -////////////////////////////////////////////////////////////////////// -// -// OBJC_GET_PROPERTY_OFFSET offset -// -// Optimized id typed accessor methods. -// Generates an accesssor for a specified compile time offset. -// -// Takes: offset - offset of an id typed instance variable -////////////////////////////////////////////////////////////////////// - -.macro OBJC_GET_PROPERTY_OFFSET - .private_extern __objc_getProperty_offset_$0 - ENTRY __objc_getProperty_offset_$0 - movl 4(%esp), %eax - movl $0(%eax), %eax - ret - END_ENTRY __objc_getProperty_offset_$0 -.endmacro - -/* - * Thunk to retrieve PC. - * `call 1; 1: pop` sequence breaks any branch-prediction stack. - */ -L_get_pc_thunk.edx: - movl (%esp,1), %edx - ret - -.macro LAZY_PIC_FUNCTION_STUB -.data -.picsymbol_stub -L$0$stub: - .indirect_symbol $0 - call L_get_pc_thunk.edx -L0$$0: - movl L$0$lz - L0$$0(%edx), %ecx - jmp *%ecx -L$0$stub_binder: - lea L$0$lz - L0$$0(%edx),%eax - pushl %eax - jmp dyld_stub_binding_helper - nop -.data -.lazy_symbol_pointer -L$0$lz: - .indirect_symbol $0 - .long L$0$stub_binder -.endmacro - -LAZY_PIC_FUNCTION_STUB _objc_assign_ivar_gc -#define OBJC_ASSIGN_IVAR L_objc_assign_ivar_gc$stub // call objc_assign_ivar_gc() directly to avoid extra levels of testing/branching - -.macro OBJC_SET_PROPERTY_OFFSET - .private_extern __objc_setProperty_offset_$0 - ENTRY __objc_setProperty_offset_$0 - movl 4(%esp), %eax - movl %eax, 8(%esp) // pass self as the second parameter. - movl 12(%esp), %eax - movl %eax, 4(%esp) // pass value as the first parameter. - movl $$$0, 12(%esp) // pass the offset as the third parameter. - jmp OBJC_ASSIGN_IVAR // objc_assign_ivar_gc() is __private_extern__ - END_ENTRY __objc_setProperty_offset_$0 -.endmacro - -/******************************************************************** - * id _objc_getProperty_offset_N(id self, SEL _cmd); - ********************************************************************/ - - OBJC_GET_PROPERTY_OFFSET 0 - OBJC_GET_PROPERTY_OFFSET 4 - OBJC_GET_PROPERTY_OFFSET 8 - OBJC_GET_PROPERTY_OFFSET 12 - OBJC_GET_PROPERTY_OFFSET 16 - OBJC_GET_PROPERTY_OFFSET 20 - OBJC_GET_PROPERTY_OFFSET 24 - OBJC_GET_PROPERTY_OFFSET 28 - OBJC_GET_PROPERTY_OFFSET 32 - OBJC_GET_PROPERTY_OFFSET 36 - OBJC_GET_PROPERTY_OFFSET 40 - OBJC_GET_PROPERTY_OFFSET 44 - OBJC_GET_PROPERTY_OFFSET 48 - OBJC_GET_PROPERTY_OFFSET 52 - OBJC_GET_PROPERTY_OFFSET 56 - OBJC_GET_PROPERTY_OFFSET 60 - OBJC_GET_PROPERTY_OFFSET 64 - -/******************************************************************** - * id _objc_setProperty_offset_N(id self, SEL _cmd, id value); - ********************************************************************/ - - OBJC_SET_PROPERTY_OFFSET 0 - OBJC_SET_PROPERTY_OFFSET 4 - OBJC_SET_PROPERTY_OFFSET 8 - OBJC_SET_PROPERTY_OFFSET 12 - OBJC_SET_PROPERTY_OFFSET 16 - OBJC_SET_PROPERTY_OFFSET 20 - OBJC_SET_PROPERTY_OFFSET 24 - OBJC_SET_PROPERTY_OFFSET 28 - OBJC_SET_PROPERTY_OFFSET 32 - OBJC_SET_PROPERTY_OFFSET 36 - OBJC_SET_PROPERTY_OFFSET 40 - OBJC_SET_PROPERTY_OFFSET 44 - OBJC_SET_PROPERTY_OFFSET 48 - OBJC_SET_PROPERTY_OFFSET 52 - OBJC_SET_PROPERTY_OFFSET 56 - OBJC_SET_PROPERTY_OFFSET 60 - OBJC_SET_PROPERTY_OFFSET 64 diff --git a/runtime/Accessors.subproj/objc-accessors-ppc.s b/runtime/Accessors.subproj/objc-accessors-ppc.s deleted file mode 100644 index df6aa0e..0000000 --- a/runtime/Accessors.subproj/objc-accessors-ppc.s +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2006 Apple Inc. All Rights Reserved. - * - * @APPLE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_LICENSE_HEADER_END@ - */ - - #warning ppc version needs to be implemented. diff --git a/runtime/Accessors.subproj/objc-accessors-ppc64.s b/runtime/Accessors.subproj/objc-accessors-ppc64.s deleted file mode 100644 index b7a0603..0000000 --- a/runtime/Accessors.subproj/objc-accessors-ppc64.s +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2006 Apple Inc. All Rights Reserved. - * - * @APPLE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_LICENSE_HEADER_END@ - */ - -#warning ppc64 version needs to be implemented. diff --git a/runtime/Accessors.subproj/objc-accessors-table.h b/runtime/Accessors.subproj/objc-accessors-table.h deleted file mode 100644 index 81fdb33..0000000 --- a/runtime/Accessors.subproj/objc-accessors-table.h +++ /dev/null @@ -1,166 +0,0 @@ -/* - * Copyright (c) 2006 Apple Inc. All rights reserved. - * - * @APPLE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_LICENSE_HEADER_END@ - */ - -/* Support for optimized accessor methods. Currently optimized accessor methods are provided for ivar offsets from 0 to 64. */ - -#define ALWAYS_USE_C_ACCESSOR_METHODS 0 - -// set of property getters for specific offsets. -#define GETPROPERTY_OFFSET(offset) _objc_getProperty_offset_ ## offset -#define DECLARE_GETPROPERTY_OFFSET(offset) extern id GETPROPERTY_OFFSET(offset)(id self, SEL _cmd) -#define IMPLEMENT_GETPROPERTY_OFFSET(offset) static id GETPROPERTY_OFFSET(offset)(id self, SEL _cmd) { return *(id*)((char*)self + offset); } - -#if ALWAYS_USE_C_ACCESSOR_METHODS || defined(__ppc__) || defined(__ppc64__) || defined(__x86_64__) -// C versions with hard-coded offsets. may be good enough in most cases. -IMPLEMENT_GETPROPERTY_OFFSET(0) -IMPLEMENT_GETPROPERTY_OFFSET(4) -IMPLEMENT_GETPROPERTY_OFFSET(8) -IMPLEMENT_GETPROPERTY_OFFSET(12) -IMPLEMENT_GETPROPERTY_OFFSET(16) -IMPLEMENT_GETPROPERTY_OFFSET(20) -IMPLEMENT_GETPROPERTY_OFFSET(24) -IMPLEMENT_GETPROPERTY_OFFSET(28) -IMPLEMENT_GETPROPERTY_OFFSET(32) -IMPLEMENT_GETPROPERTY_OFFSET(36) -IMPLEMENT_GETPROPERTY_OFFSET(40) -IMPLEMENT_GETPROPERTY_OFFSET(44) -IMPLEMENT_GETPROPERTY_OFFSET(48) -IMPLEMENT_GETPROPERTY_OFFSET(52) -IMPLEMENT_GETPROPERTY_OFFSET(56) -IMPLEMENT_GETPROPERTY_OFFSET(60) -IMPLEMENT_GETPROPERTY_OFFSET(64) -#else -// forward delcarations to assembly versions. only on i386 right now. -DECLARE_GETPROPERTY_OFFSET(0); -DECLARE_GETPROPERTY_OFFSET(4); -DECLARE_GETPROPERTY_OFFSET(8); -DECLARE_GETPROPERTY_OFFSET(12); -DECLARE_GETPROPERTY_OFFSET(16); -DECLARE_GETPROPERTY_OFFSET(20); -DECLARE_GETPROPERTY_OFFSET(24); -DECLARE_GETPROPERTY_OFFSET(28); -DECLARE_GETPROPERTY_OFFSET(32); -DECLARE_GETPROPERTY_OFFSET(36); -DECLARE_GETPROPERTY_OFFSET(40); -DECLARE_GETPROPERTY_OFFSET(44); -DECLARE_GETPROPERTY_OFFSET(48); -DECLARE_GETPROPERTY_OFFSET(52); -DECLARE_GETPROPERTY_OFFSET(56); -DECLARE_GETPROPERTY_OFFSET(60); -DECLARE_GETPROPERTY_OFFSET(64); -#endif - -static void* _getProperty_offset_table[] = { - GETPROPERTY_OFFSET(0), - GETPROPERTY_OFFSET(4), - GETPROPERTY_OFFSET(8), - GETPROPERTY_OFFSET(12), - GETPROPERTY_OFFSET(16), - GETPROPERTY_OFFSET(20), - GETPROPERTY_OFFSET(24), - GETPROPERTY_OFFSET(28), - GETPROPERTY_OFFSET(32), - GETPROPERTY_OFFSET(36), - GETPROPERTY_OFFSET(40), - GETPROPERTY_OFFSET(44), - GETPROPERTY_OFFSET(48), - GETPROPERTY_OFFSET(52), - GETPROPERTY_OFFSET(56), - GETPROPERTY_OFFSET(60), - GETPROPERTY_OFFSET(64), -}; - -#undef GETPROPERTY_OFFSET -#undef DECLARE_GETPROPERTY_OFFSET -#undef IMPLEMENT_GETPROPERTY_OFFSET -#define GETPROPERTY_IMP(offset) ((offset <= 64) ? (IMP)_getProperty_offset_table[offset >> 2] : NULL) - -// set of property setters for specific offsets. -#define SETPROPERTY_OFFSET(offset) _objc_setProperty_offset_ ## offset -#define DECLARE_SETPROPERTY_OFFSET(offset) extern id SETPROPERTY_OFFSET(offset)(id self, SEL _cmd, ...) -#define IMPLEMENT_SETPROPERTY_OFFSET(offset) __private_extern__ void SETPROPERTY_OFFSET(offset)(id self, SEL _cmd, id value) { objc_assign_ivar_gc(value, self, offset); } - -#if ALWAYS_USE_C_ACCESSOR_METHODS || !defined(__i386__) -// C versions with hard-coded offsets. may be good enough in most cases. -IMPLEMENT_SETPROPERTY_OFFSET(0) -IMPLEMENT_SETPROPERTY_OFFSET(4) -IMPLEMENT_SETPROPERTY_OFFSET(8) -IMPLEMENT_SETPROPERTY_OFFSET(12) -IMPLEMENT_SETPROPERTY_OFFSET(16) -IMPLEMENT_SETPROPERTY_OFFSET(20) -IMPLEMENT_SETPROPERTY_OFFSET(24) -IMPLEMENT_SETPROPERTY_OFFSET(28) -IMPLEMENT_SETPROPERTY_OFFSET(32) -IMPLEMENT_SETPROPERTY_OFFSET(36) -IMPLEMENT_SETPROPERTY_OFFSET(40) -IMPLEMENT_SETPROPERTY_OFFSET(44) -IMPLEMENT_SETPROPERTY_OFFSET(48) -IMPLEMENT_SETPROPERTY_OFFSET(52) -IMPLEMENT_SETPROPERTY_OFFSET(56) -IMPLEMENT_SETPROPERTY_OFFSET(60) -IMPLEMENT_SETPROPERTY_OFFSET(64) -#else -// forward delcarations to assembly versions. only on i386 right now. -DECLARE_SETPROPERTY_OFFSET(0); -DECLARE_SETPROPERTY_OFFSET(4); -DECLARE_SETPROPERTY_OFFSET(8); -DECLARE_SETPROPERTY_OFFSET(12); -DECLARE_SETPROPERTY_OFFSET(16); -DECLARE_SETPROPERTY_OFFSET(20); -DECLARE_SETPROPERTY_OFFSET(24); -DECLARE_SETPROPERTY_OFFSET(28); -DECLARE_SETPROPERTY_OFFSET(32); -DECLARE_SETPROPERTY_OFFSET(36); -DECLARE_SETPROPERTY_OFFSET(40); -DECLARE_SETPROPERTY_OFFSET(44); -DECLARE_SETPROPERTY_OFFSET(48); -DECLARE_SETPROPERTY_OFFSET(52); -DECLARE_SETPROPERTY_OFFSET(56); -DECLARE_SETPROPERTY_OFFSET(60); -DECLARE_SETPROPERTY_OFFSET(64); -#endif - -static void* _setProperty_offset_table[] = { - SETPROPERTY_OFFSET(0), - SETPROPERTY_OFFSET(4), - SETPROPERTY_OFFSET(8), - SETPROPERTY_OFFSET(12), - SETPROPERTY_OFFSET(16), - SETPROPERTY_OFFSET(20), - SETPROPERTY_OFFSET(24), - SETPROPERTY_OFFSET(28), - SETPROPERTY_OFFSET(32), - SETPROPERTY_OFFSET(36), - SETPROPERTY_OFFSET(40), - SETPROPERTY_OFFSET(44), - SETPROPERTY_OFFSET(48), - SETPROPERTY_OFFSET(52), - SETPROPERTY_OFFSET(56), - SETPROPERTY_OFFSET(60), - SETPROPERTY_OFFSET(64), -}; - -#undef SETPROPERTY_OFFSET -#undef DECLARE_SETPROPERTY_OFFSET -#undef IMPLEMENT_SETPROPERTY_OFFSET -#define SETPROPERTY_IMP(offset) ((offset <= 64) ? (IMP)_setProperty_offset_table[offset >> 2] : NULL) diff --git a/runtime/Accessors.subproj/objc-accessors-x86_64.s b/runtime/Accessors.subproj/objc-accessors-x86_64.s deleted file mode 100644 index ea1026d..0000000 --- a/runtime/Accessors.subproj/objc-accessors-x86_64.s +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2006 Apple Inc. All Rights Reserved. - * - * @APPLE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_LICENSE_HEADER_END@ - */ - -#warning x86-64 version needs to be implemented. diff --git a/runtime/Accessors.subproj/objc-accessors.m b/runtime/Accessors.subproj/objc-accessors.m index 3add7d2..d1e5617 100644 --- a/runtime/Accessors.subproj/objc-accessors.m +++ b/runtime/Accessors.subproj/objc-accessors.m @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2007 Apple Inc. All Rights Reserved. + * Copyright (c) 2006-2008 Apple Inc. All Rights Reserved. * * @APPLE_LICENSE_HEADER_START@ * @@ -26,14 +26,10 @@ #import +#import "objc-private.h" +#import "objc-auto.h" +#import "runtime.h" #import "objc-accessors.h" -#import -#import -#import "../objc-private.h" - -#import "/usr/local/include/auto_zone.h" - -#import "objc-accessors-table.h" // stub interface declarations to make compiler happy. @@ -41,39 +37,16 @@ - (id)copyWithZone:(void *)zone; @end +@interface __NSMutableCopyable +- (id)mutableCopyWithZone:(void *)zone; +@end + @interface __NSRetained - (id)retain; - (oneway void)release; - (id)autorelease; @end -static /*inline*/ IMP optimized_getter_for_gc(id self, SEL name, ptrdiff_t offset) { - // replace this method with a faster version that does no message sends, and fewer tests. - IMP getter = GETPROPERTY_IMP(offset); - if (getter != NULL) { - // HACK ALERT: replaces the IMP in the cache! - Class cls = self->isa; - Method method = class_getInstanceMethod(cls, name); - if (method_getImplementation(method) != getter) - method_setImplementation(method, getter); - } - return getter; -} - -static /*inline*/ IMP optimized_setter_for_gc(id self, SEL name, ptrdiff_t offset) { - // replace this method with a faster version that does no message sends. - IMP setter = SETPROPERTY_IMP(offset); - if (setter != NULL) { - // HACK ALERT: replaces the IMP in the cache! - Class cls = self->isa; - Method method = class_getInstanceMethod(cls, name); - if (method_getImplementation(method) != setter) - method_setImplementation(method, setter); - } - return setter; -} - -// ATOMIC entry points typedef uintptr_t spin_lock_t; extern void _spin_lock(spin_lock_t *lockp); @@ -89,11 +62,6 @@ static spin_lock_t PropertyLocks[1 << GOODPOWER] = { 0 }; id objc_getProperty(id self, SEL _cmd, ptrdiff_t offset, BOOL atomic) { if (UseGC) { - // FIXME: we could optimize getters when a class is first initialized, then KVO won't get confused. - if (false) { - IMP getter = optimized_getter_for_gc(self, _cmd, offset); - if (getter) return getter(self, _cmd); - } return *(id*) ((char*)self + offset); } @@ -111,18 +79,12 @@ id objc_getProperty(id self, SEL _cmd, ptrdiff_t offset, BOOL atomic) { return [value autorelease]; } +enum { OBJC_PROPERTY_RETAIN = 0, OBJC_PROPERTY_COPY = 1, OBJC_PROPERTY_MUTABLECOPY = 2 }; void objc_setProperty(id self, SEL _cmd, ptrdiff_t offset, id newValue, BOOL atomic, BOOL shouldCopy) { if (UseGC) { if (shouldCopy) { - newValue = [newValue copyWithZone:NULL]; - } - else if (false) { - IMP setter = optimized_setter_for_gc(self, _cmd, offset); - if (setter) { - setter(self, _cmd, newValue); - return; - } + newValue = (shouldCopy == OBJC_PROPERTY_MUTABLECOPY ? [newValue mutableCopyWithZone:NULL] : [newValue copyWithZone:NULL]); } objc_assign_ivar_internal(newValue, self, offset); return; @@ -134,7 +96,11 @@ void objc_setProperty(id self, SEL _cmd, ptrdiff_t offset, id newValue, BOOL ato // atomic or not, if slot would be unchanged, do nothing. if (!shouldCopy && *slot == newValue) return; - newValue = (shouldCopy ? [newValue copyWithZone:NULL] : [newValue retain]); + if (shouldCopy) { + newValue = (shouldCopy == OBJC_PROPERTY_MUTABLECOPY ? [newValue mutableCopyWithZone:NULL] : [newValue copyWithZone:NULL]); + } else { + newValue = [newValue retain]; + } if (!atomic) { oldValue = *slot; @@ -151,8 +117,6 @@ void objc_setProperty(id self, SEL _cmd, ptrdiff_t offset, id newValue, BOOL ato } -__private_extern__ auto_zone_t *gc_zone; - // This entry point was designed wrong. When used as a getter, src needs to be locked so that // if simultaneously used for a setter then there would be contention on src. // So we need two locks - one of which will be contended. @@ -187,45 +151,3 @@ void objc_copyStruct(void *dest, const void *src, ptrdiff_t size, BOOL atomic, B } } -// PRE-ATOMIC entry points - -id object_getProperty_bycopy(id self, SEL _cmd, ptrdiff_t offset) { - if (UseGC) { - IMP getter = optimized_getter_for_gc(self, _cmd, offset); - if (getter) return getter(self, _cmd); - } - id *slot = (id*) ((char*)self + offset); - return *slot; -} - -void object_setProperty_bycopy(id self, SEL _cmd, id value, ptrdiff_t offset) { - id *slot = (id*) ((char*)self + offset); - id oldValue = *slot; - objc_assign_ivar_internal([value copyWithZone:NULL], self, offset); - [oldValue release]; -} - -id object_getProperty_byref(id self, SEL _cmd, ptrdiff_t offset) { - if (UseGC) { - IMP getter = optimized_getter_for_gc(self, _cmd, offset); - if (getter) return getter(self, _cmd); - } - id *slot = (id*) ((char*)self + offset); - return *slot; -} - -void object_setProperty_byref(id self, SEL _cmd, id value, ptrdiff_t offset) { - if (UseGC) { - IMP setter = optimized_setter_for_gc(self, _cmd, offset); - if (setter) { - setter(self, _cmd, value); - return; - } - } - id *slot = (id*) ((char*)self + offset); - id oldValue = *slot; - if (oldValue != value) { - objc_assign_ivar_internal([value retain], self, offset); - [oldValue release]; - } -} diff --git a/runtime/Auto.subproj/objc-auto-i386.s b/runtime/Auto.subproj/objc-auto-i386.s index 9d16245..4b4584b 100644 --- a/runtime/Auto.subproj/objc-auto-i386.s +++ b/runtime/Auto.subproj/objc-auto-i386.s @@ -21,6 +21,8 @@ * @APPLE_LICENSE_HEADER_END@ */ +#ifdef __i386__ + /* This file defines the non-GC variants of objc_assign_* on a dedicated page in the (__DATA,__data) section. At load time under GC, each @@ -33,7 +35,8 @@ must not contain anything other than the objc_assign_* routines. */ -.data +.section __IMPORT, __objctext, regular, pure_instructions + self_modifying_code + .align 12 // align to page boundary LNonGCAssigns$Begin: @@ -80,3 +83,5 @@ LNonGCAssigns$End: // Claim the remainder of the page. .set L$set$assignsSize,LNonGCAssigns$End-LNonGCAssigns$Begin .space 4096-L$set$assignsSize + +#endif diff --git a/runtime/Auto.subproj/objc-auto-ppc.s b/runtime/Auto.subproj/objc-auto-ppc.s index 026467b..c3f7332 100644 --- a/runtime/Auto.subproj/objc-auto-ppc.s +++ b/runtime/Auto.subproj/objc-auto-ppc.s @@ -20,7 +20,8 @@ * * @APPLE_LICENSE_HEADER_END@ */ - + +#ifdef __ppc__ ; ; This section includes declarations of routines that will be used to populate @@ -64,4 +65,5 @@ _$0_non_gc: ; non_gc entry point wb_routine objc_assign_ivar,0xfffefec0 stwx r3,r4,r5 ; store value at (dest+offset) blr ; return - \ No newline at end of file + +#endif diff --git a/runtime/Auto.subproj/objc-auto-ppc64.s b/runtime/Auto.subproj/objc-auto-ppc64.s index a17f1a5..18bb0ac 100644 --- a/runtime/Auto.subproj/objc-auto-ppc64.s +++ b/runtime/Auto.subproj/objc-auto-ppc64.s @@ -21,4 +21,8 @@ * @APPLE_LICENSE_HEADER_END@ */ +#ifdef __ppc64__ + #warning ppc64 version needs to be implemented. + +#endif diff --git a/runtime/Auto.subproj/objc-auto-x86_64.s b/runtime/Auto.subproj/objc-auto-x86_64.s index 561b38e..12f0962 100644 --- a/runtime/Auto.subproj/objc-auto-x86_64.s +++ b/runtime/Auto.subproj/objc-auto-x86_64.s @@ -21,6 +21,8 @@ * @APPLE_LICENSE_HEADER_END@ */ +#ifdef __x86_64__ + /* This file defines the non-GC variants of objc_assign_* on a dedicated page in the (__DATA,__data) section. At load time under GC, each @@ -76,3 +78,5 @@ LNonGCAssigns$End: // Claim the remainder of the page. .set L$set$assignsSize,LNonGCAssigns$End-LNonGCAssigns$Begin .space 4096-L$set$assignsSize + +#endif diff --git a/runtime/Auto.subproj/objc-auto.s b/runtime/Auto.subproj/objc-auto.s deleted file mode 100644 index 601515c..0000000 --- a/runtime/Auto.subproj/objc-auto.s +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2004-2006 Apple Inc. All rights reserved. - * - * @APPLE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_LICENSE_HEADER_END@ - */ - - -#if defined (__i386__) || defined (i386) - #include "objc-auto-i386.s" -#elif defined (__ppc__) || defined(ppc) - #include "objc-auto-ppc.s" -#elif defined (__ppc64__) || defined(ppc64) - #include "objc-auto-ppc64.s" -#elif defined (__x86_64__) - #include "objc-auto-x86_64.s" -#else - #error Architecture not supported -#endif diff --git a/runtime/Messengers.subproj/objc-msg-arm.s b/runtime/Messengers.subproj/objc-msg-arm.s new file mode 100644 index 0000000..a644620 --- /dev/null +++ b/runtime/Messengers.subproj/objc-msg-arm.s @@ -0,0 +1,914 @@ +/* + * @APPLE_LICENSE_HEADER_START@ + * + * Copyright (c) 1999-2007 Apple Computer, Inc. All Rights Reserved. + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifdef __arm__ + +/******************************************************************** + * + * objc-msg-arm.s - ARM code to support objc messaging + * + ********************************************************************/ + + +#ifdef ARM11 +#define MOVE cpy +#define MOVEEQ cpyeq +#define MOVENE cpyne +#else +#define MOVE mov +#define MOVEEQ moveq +#define MOVENE movne +#endif + +#ifdef VFP_ARGS +#define SAVE_VFP fstmfdd sp!, {d0-d7} +#define RESTORE_VFP fldmfdd sp!, {d0-d7} +#else +#define SAVE_VFP /* empty */ +#define RESTORE_VFP /* empty */ +#endif + + +#if defined(__DYNAMIC__) +#define MI_EXTERN(var) \ + .non_lazy_symbol_pointer ;\ +L ## var ## __non_lazy_ptr: ;\ + .indirect_symbol var ;\ + .long 0 +#else +#define MI_EXTERN(var) \ + .globl var +#endif + +#if defined(__DYNAMIC__) +#define MI_GET_ADDRESS(reg,var) \ + ldr reg, 4f ;\ +3: ldr reg, [pc, reg] ;\ + b 5f ;\ +4: .long L ## var ## __non_lazy_ptr - (3b + 8) ;\ +5: +#else +#define MI_GET_ADDRESS(reg,var) \ + ldr reg, 3f ;\ + b 4f ;\ +3: .long var ;\ +4: +#endif + +#if defined(__DYNAMIC__) +#define MI_BRANCH_EXTERNAL(var) \ + MI_GET_ADDRESS(ip, var) ;\ + bx ip +#else +#define MI_BRANCH_EXTERNAL(var) ;\ + b var +#endif + +#if defined(__DYNAMIC__) +#define MI_CALL_EXTERNAL(var) \ + MI_GET_ADDRESS(ip,var) ;\ + MOVE lr, pc ;\ + bx ip +#else +#define MI_CALL_EXTERNAL(var) \ + bl var +#endif + + +MI_EXTERN(__class_lookupMethodAndLoadCache) +MI_EXTERN(_FwdSel) +MI_EXTERN(___objc_error) +MI_EXTERN(__objc_forward_handler) +MI_EXTERN(__objc_forward_stret_handler) + +#if 0 +// Special section containing a function pointer that dyld will call +// when it loads new images. +MI_EXTERN(__objc_notify_images) +.text +.align 2 +L__objc_notify_images: + MI_BRANCH_EXTERNAL(__objc_notify_images) + +.section __DATA,__image_notify +.long L__objc_notify_images +#endif + + +# _objc_entryPoints and _objc_exitPoints are used by method dispatch +# caching code to figure out whether any threads are actively +# in the cache for dispatching. The labels surround the asm code +# that do cache lookups. The tables are zero-terminated. +.data +.globl _objc_entryPoints +_objc_entryPoints: + .long __cache_getImp + .long __cache_getMethod + .long _objc_msgSend + .long _objc_msgSend_stret + .long _objc_msgSendSuper + .long _objc_msgSendSuper_stret + .long 0 + +.data +.globl _objc_exitPoints +_objc_exitPoints: + .long LGetImpExit + .long LGetMethodExit + .long LMsgSendExit + .long LMsgSendStretExit + .long LMsgSendSuperExit + .long LMsgSendSuperStretExit + .long 0 + + +/* objc_super parameter to sendSuper */ +.set RECEIVER, 0 +.set CLASS, 4 + +/* Selected field offsets in class structure */ +.set ISA, 0 +#if __OBJC2__ +.set CACHE, 8 +#else +.set CACHE, 32 +#endif + +/* Method descriptor */ +.set METHOD_NAME, 0 +.set METHOD_IMP, 8 + +/* Cache header */ +.set MASK, 0 +.set OCCUPIED, 4 +.set BUCKETS, 8 /* variable length array */ + + +##################################################################### +# +# ENTRY functionName +# +# Assembly directives to begin an exported function. +# We align on cache boundaries for these few functions. +# +# Takes: functionName - name of the exported function +##################################################################### + +.macro ENTRY /* name */ + .text + .align 2 + .globl _$0 +_$0: +.endmacro + +##################################################################### +# +# END_ENTRY functionName +# +# Assembly directives to end an exported function. Just a placeholder, +# a close-parenthesis for ENTRY, until it is needed for something. +# +# Takes: functionName - name of the exported function +##################################################################### + +.macro END_ENTRY /* name */ +.endmacro + + +##################################################################### +# +# CacheLookup selectorRegister, cacheMissLabel +# +# Locate the implementation for a selector in a class method cache. +# +# Takes: +# v1 = class whose cache is to be searched +# $0 = register containing selector (a2 or a3 ONLY) +# cacheMissLabel = label to branch to iff method is not cached +# +# Kills: +# a4, v1, v2, v3, ip +# +# On exit: (found) method triplet in v1, imp in ip +# (not found) jumps to cacheMissLabel +# +##################################################################### + +.macro CacheLookup /* selReg, missLabel */ + + ldr v2, [v1, #CACHE] /* cache = class->cache */ + ldr v3, [v2, #MASK] /* mask = cache->mask */ + add a4, v2, #BUCKETS /* buckets = &cache->buckets */ + and v2, v3, $0, LSR #2 /* index = mask & (sel >> 2) */ + +/* search the cache */ +/* a1=receiver, a2 or a3=sel, v2=index, v3=mask, a4=buckets, v1=method */ +1: + ldr v1, [a4, v2, LSL #2] /* method = buckets[index] */ + teq v1, #0 /* if (method == NULL) */ + add v2, v2, #1 /* index++ */ + beq $1 /* goto cacheMissLabel */ + + ldr ip, [v1, #METHOD_NAME] /* load method->method_name */ + teq $0, ip /* if (method->method_name != sel) */ + and v2, v2, v3 /* index &= mask */ + bne 1b /* retry */ + +/* cache hit, v1 == method triplet address */ +/* Return triplet in v1 and imp in ip */ + ldr ip, [v1, #METHOD_IMP] /* imp = method->method_imp */ + +.endmacro + + +/******************************************************************** + * Method _cache_getMethod(Class cls, SEL sel, IMP msgForward_internal_imp) + * + * On entry: a1 = class whose cache is to be searched + * a2 = selector to search for + * a3 = _objc_msgForward_internal IMP + * + * If found, returns method triplet pointer. + * If not found, returns NULL. + * + * NOTE: _cache_getMethod never returns any cache entry whose implementation + * is _objc_msgForward_internal. It returns NULL instead. This prevents thread- + * safety and memory management bugs in _class_lookupMethodAndLoadCache. + * See _class_lookupMethodAndLoadCache for details. + * + * _objc_msgForward_internal is passed as a parameter because it's more + * efficient to do the (PIC) lookup once in the caller than repeatedly here. + ********************************************************************/ + + ENTRY _cache_getMethod + +# save registers and load class for CacheLookup + stmfd sp!, {a4,v1-v3,r7,lr} + add r7, sp, #16 + MOVE v1, a1 + +# search the cache + CacheLookup a2, LGetMethodMiss + +# cache hit, method triplet in v1 and imp in ip + teq ip, a3 /* check for _objc_msgForward_internal */ + MOVEEQ a1, #1 /* return (Method)1 if forward */ + MOVENE a1, v1 /* return triplet if not forward */ + ldmfd sp!, {a4,v1-v3,r7,pc} + +LGetMethodMiss: + MOVE a1, #0 /* return nil if cache miss */ + ldmfd sp!, {a4,v1-v3,r7,pc} + +LGetMethodExit: + END_ENTRY _cache_getMethod + + +/******************************************************************** + * IMP _cache_getImp(Class cls, SEL sel) + * + * On entry: a1 = class whose cache is to be searched + * a2 = selector to search for + * + * If found, returns method implementation. + * If not found, returns NULL. + ********************************************************************/ + + ENTRY _cache_getImp + +# save registers and load class for CacheLookup + stmfd sp!, {a4,v1-v3,r7,lr} + add r7, sp, #16 + MOVE v1, a1 + +# search the cache + CacheLookup a2, LGetImpMiss + +# cache hit, method triplet in v1 and imp in ip + MOVE a1, ip @ return imp + ldmfd sp!, {a4,v1-v3,r7,pc} + +LGetImpMiss: + MOVE a1, #0 @ return nil if cache miss + ldmfd sp!, {a4,v1-v3,r7,pc} + +LGetImpExit: + END_ENTRY _cache_getImp + + +/******************************************************************** + * id objc_msgSend(id self, + * SEL op, + * ...) + * + * On entry: a1 is the message receiver, + * a2 is the selector + ********************************************************************/ + + ENTRY objc_msgSend +# check whether receiver is nil + teq a1, #0 + moveq a2, #0 + bxeq lr + +# save registers and load receiver's class for CacheLookup + stmfd sp!, {a4,v1-v3} + ldr v1, [a1, #ISA] + +# receiver is non-nil: search the cache + CacheLookup a2, LMsgSendCacheMiss + +# cache hit (imp in ip) - prep for forwarding, restore registers and call + teq v1, v1 /* set nonstret (eq) */ + ldmfd sp!, {a4,v1-v3} + bx ip + +# cache miss: go search the method lists +LMsgSendCacheMiss: + ldmfd sp!, {a4,v1-v3} + b _objc_msgSend_uncached + +LMsgSendExit: + END_ENTRY objc_msgSend + + + .text + .align 2 +_objc_msgSend_uncached: + +# Push stack frame + stmfd sp!, {a1-a4,r7,lr} + add r7, sp, #16 + SAVE_VFP + +# Load class and selector + ldr a1, [a1, #ISA] /* class = receiver->isa */ + # MOVE a2, a2 /* selector already in a2 */ + +# Do the lookup + MI_CALL_EXTERNAL(__class_lookupMethodAndLoadCache) + MOVE ip, a1 + +# Prep for forwarding, Pop stack frame and call imp + teq v1, v1 /* set nonstret (eq) */ + RESTORE_VFP + ldmfd sp!, {a1-a4,r7,lr} + bx ip + + +/******************************************************************** + * struct_type objc_msgSend_stret(id self, + * SEL op, + * ...); + * + * objc_msgSend_stret is the struct-return form of msgSend. + * The ABI calls for a1 to be used as the address of the structure + * being returned, with the parameters in the succeeding registers. + * + * On entry: a1 is the address where the structure is returned, + * a2 is the message receiver, + * a3 is the selector + ********************************************************************/ + + ENTRY objc_msgSend_stret +# check whether receiver is nil + teq a2, #0 + bxeq lr + +# save registers and load receiver's class for CacheLookup + stmfd sp!, {a4,v1-v3} + ldr v1, [a2, #ISA] + +# receiver is non-nil: search the cache + CacheLookup a3, LMsgSendStretCacheMiss + +# cache hit (imp in ip) - prep for forwarding, restore registers and call + tst v1, v1 /* set stret (ne); v1 is nonzero (triplet) */ + ldmfd sp!, {a4,v1-v3} + bx ip + +# cache miss: go search the method lists +LMsgSendStretCacheMiss: + ldmfd sp!, {a4,v1-v3} + b _objc_msgSend_stret_uncached + +LMsgSendStretExit: + END_ENTRY objc_msgSend_stret + + + .text + .align 2 +_objc_msgSend_stret_uncached: + +# Push stack frame + stmfd sp!, {a1-a4,r7,lr} + add r7, sp, #16 + SAVE_VFP + +# Load class and selector + ldr a1, [a2, #ISA] /* class = receiver->isa */ + MOVE a2, a3 /* selector */ + +# Do the lookup + MI_CALL_EXTERNAL(__class_lookupMethodAndLoadCache) + MOVE ip, a1 + +# Prep for forwarding, pop stack frame and call imp + tst a1, a1 /* set stret (ne); a1 is nonzero (imp) */ + + RESTORE_VFP + ldmfd sp!, {a1-a4,r7,lr} + bx ip + + +/******************************************************************** + * id objc_msgSendSuper(struct objc_super *super, + * SEL op, + * ...) + * + * struct objc_super { + * id receiver + * Class class + * } + ********************************************************************/ + + ENTRY objc_msgSendSuper2 + @ objc_super->class is superclass of the class to search + ldr r12, [a1, #CLASS] + ldr r12, [r12, #4] @ r12 = cls->super_class + str r12, [a1, #CLASS] + b _objc_msgSendSuper + END_ENTRY + + ENTRY objc_msgSendSuper + +# save registers and load super class for CacheLookup + stmfd sp!, {a4,v1-v3} + ldr v1, [a1, #CLASS] + +# search the cache + CacheLookup a2, LMsgSendSuperCacheMiss + +# cache hit (imp in ip) - prep for forwarding, restore registers and call + teq v1, v1 /* set nonstret (eq) */ + ldmfd sp!, {a4,v1-v3} + ldr a1, [a1, #RECEIVER] @ fetch real receiver + bx ip + +# cache miss: go search the method lists +LMsgSendSuperCacheMiss: + ldmfd sp!, {a4,v1-v3} + b _objc_msgSendSuper_uncached + +LMsgSendSuperExit: + END_ENTRY objc_msgSendSuper + + + .text + .align 2 +_objc_msgSendSuper_uncached: + +# Push stack frame + stmfd sp!, {a1-a4,r7,lr} + add r7, sp, #16 + SAVE_VFP + +# Load class and selector + ldr a1, [a1, #CLASS] /* class = super->class */ + # MOVE a2, a2 /* selector already in a2 */ + +# Do the lookup + MI_CALL_EXTERNAL(__class_lookupMethodAndLoadCache) + MOVE ip, a1 + +# Prep for forwarding, pop stack frame and call imp + teq v1, v1 /* set nonstret (eq) */ + RESTORE_VFP + ldmfd sp!, {a1-a4,r7,lr} + ldr a1, [a1, #RECEIVER] @ fetch real receiver + bx ip + + +/******************************************************************** + * struct_type objc_msgSendSuper_stret(objc_super *super, + * SEL op, + * ...) + * + * struct objc_super { + * id receiver + * Class class + * } + * + * + * objc_msgSendSuper_stret is the struct-return form of msgSendSuper. + * The ABI calls for a1 to be used as the address of the structure + * being returned, with the parameters in the succeeding registers. + * + * On entry: a1 is the address to which to copy the returned structure, + * a2 is the address of the objc_super structure, + * a3 is the selector + ********************************************************************/ + + ENTRY objc_msgSendSuper2_stret + @ objc_super->class is superclass of the class to search + ldr r12, [a2, #CLASS] + ldr r12, [r12, #4] @ xx = cls->super_class + str r12, [a2, #CLASS] + b _objc_msgSendSuper_stret + END_ENTRY + + ENTRY objc_msgSendSuper_stret + +# save registers and load super class for CacheLookup + stmfd sp!, {a4,v1-v3} + ldr v1, [a2, #CLASS] + +# search the cache + CacheLookup a3, LMsgSendSuperStretCacheMiss + +# cache hit (imp in ip) - prep for forwarding, restore registers and call + tst v1, v1 /* set stret (ne); v1 is nonzero (triplet) */ + ldmfd sp!, {a4,v1-v3} + ldr a2, [a2, #RECEIVER] @ fetch real receiver + bx ip + +# cache miss: go search the method lists +LMsgSendSuperStretCacheMiss: + ldmfd sp!, {a4,v1-v3} + b _objc_msgSendSuper_stret_uncached + +LMsgSendSuperStretExit: + END_ENTRY objc_msgSendSuper_stret + + + .text + .align 2 +_objc_msgSendSuper_stret_uncached: + +# Push stack frame + stmfd sp!, {a1-a4,r7,lr} + add r7, sp, #16 + SAVE_VFP + +# Load class and selector + ldr a1, [a2, #CLASS] /* class = super->class */ + MOVE a2, a3 /* selector */ + +# Do the lookup + MI_CALL_EXTERNAL(__class_lookupMethodAndLoadCache) + MOVE ip, a1 + +# Prep for forwarding, pop stack frame and call imp + tst v1, v1 /* set stret (ne); v1 is nonzero (triplet) */ + + RESTORE_VFP + ldmfd sp!, {a1-a4,r7,lr} + ldr a2, [a2, #RECEIVER] @ fetch real receiver + bx ip + + +/******************************************************************** + * + * id _objc_msgForward(id self, + * SEL sel, + * ...); + * struct_type _objc_msgForward_stret (id self, + * SEL sel, + * ...); + * + * Both _objc_msgForward and _objc_msgForward_stret + * send the message to a method having the signature: + * + * - forward:(SEL)sel :(marg_list)args; + * + * The marg_list's layout is: + * d0 <-- args + * d1 + * d2 | increasing address + * d3 v + * d4 + * d5 + * d6 + * d7 + * a1 + * a2 + * a3 + * a4 + * stack args... + * + * typedef struct objc_sendv_margs { + * #ifdef VFP_ARGS + * double vfp[8]; + * #endif + * int a[4]; + * int stackArgs[...]; + * }; + * + ********************************************************************/ + +.data +.private_extern _FwdSel +_FwdSel: + .long 0 + +.private_extern __objc_forward_handler +__objc_forward_handler: + .long 0 + +.private_extern __objc_forward_stret_handler +__objc_forward_stret_handler: + .long 0 + + + ENTRY _objc_msgForward_internal + .private_extern __objc_msgForward_internal + // Method cache version + + // THIS IS NOT A CALLABLE C FUNCTION + // Out-of-band condition register is NE for stret, EQ otherwise. + + bne __objc_msgForward_stret + b __objc_msgForward + + END_ENTRY _objc_msgForward_internal + + + ENTRY _objc_msgForward + // Non-stret version + +# check for user-installed forwarding handler + MI_GET_ADDRESS(ip, __objc_forward_handler) + ldr ip, [ip] + teq ip, #0 + bxne ip + +# build marg_list + stmfd sp!, {a1-a4} @ push args to marg_list +#ifdef VFP_ARGS + fstmfdd sp!, {d0-d7} @ push fp args to marg_list +#endif + +# build forward::'s parameter list (self, forward::, original sel, marg_list) + # a1 already is self + MOVE a3, a2 @ original sel + MI_GET_ADDRESS(a2, _FwdSel) @ "forward::" + ldr a2, [a2] + MOVE a4, sp @ marg_list + +# check for forwarding of forward:: itself + teq a2, a3 + beq LMsgForwardError @ original sel == forward:: - give up + +# push stack frame + str lr, [sp, #-(2*4)]! @ save lr and align stack + +# send it + bl _objc_msgSend + +# pop stack frame and return + ldr lr, [sp] +#ifdef VFP_ARGS + add sp, sp, #(4 + 4 + 4*4 + 8*8) @ skip lr, pad, a1..a4, d0..d7 +#else + add sp, sp, #(4 + 4 + 4*4) @ skip lr, pad, a1..a4 +#endif + bx lr + + END_ENTRY _objc_msgForward + + + ENTRY _objc_msgForward_stret + // Struct-return version + +# check for user-installed forwarding handler + MI_GET_ADDRESS(ip, __objc_forward_stret_handler) + ldr ip, [ip] + teq ip, #0 + bxne ip + +# build marg_list + stmfd sp!, {a1-a4} @ push args to marg_list +#ifdef VFP_ARGS + fstmfdd sp!, {d0-d7} @ push fp args to marg_list +#endif + +# build forward::'s parameter list (self, forward::, original sel, marg_list) + MOVE a1, a2 @ self + MI_GET_ADDRESS(a2, _FwdSel) @ "forward::" + ldr a2, [a2] + # a3 is already original sel + MOVE a4, sp @ marg_list + +# check for forwarding of forward:: itself + teq a2, a3 + beq LMsgForwardError @ original sel == forward:: - give up + +# push stack frame + str lr, [sp, #-(2*4)]! @ save lr and align stack + +# send it + bl _objc_msgSend + +# pop stack frame and return + ldr lr, [sp] +#ifdef VFP_ARGS + add sp, sp, #(4 + 4 + 4*4 + 8*8) @ skip lr, pad, a1..a4, d0..d7 +#else + add sp, sp, #(4 + 4 + 4*4) @ skip lr, pad, a1..a4 +#endif + bx lr + + END_ENTRY _objc_msgForward_stret + +LMsgForwardError: + # currently a1=self, a2=forward::, a3 = original sel, a4 = marg_list + # call __objc_error(self, format, original sel) + add a2, pc, #4 @ pc bias is 8 bytes + MI_CALL_EXTERNAL(___objc_error) + .ascii "Does not recognize selector %s\0" + + +/******************************************************************** + * id objc_msgSendv(id self, + * SEL op, + * unsigned arg_size, + * marg_list arg_frame); + * + * typedef struct objc_sendv_margs { + * #ifdef VFP_ARGS + * double vfp[8]; + * #endif + * int a[4]; + * int stackArgs[...]; + * }; + * + * arg_frame is the number of bytes used in a[] plus stackArgs. + * It does not include vfp[]. + * + ********************************************************************/ + + ENTRY objc_msgSendv + +# Push stack frame + SAVE_VFP + stmfd sp!, {a4,v1-v3,r7,lr} @ a4 saved for stack alignment only + add r7, sp, #16 + +# save sendv's parameters + # self stays in a1 + # sel stays in a2 + MOVE v1, a3 @ v1 is arg count in bytes + MOVE v2, a4 @ v2 is marg_list + +# load FP from marg_list +#ifdef VFP_ARGS + fldmfdd v2!, {d0-d7} +#endif + +# load arg registers from marg_list +# v1 is remaining count, v2 is pointer into marg_list + # self already in a1 + # sel already in a2 + cmp v1, #12 + ldrhs a3, [v2, #8] @ pop a3 if arg bytes is at least 12 + ldrhi a4, [v2, #12] @ pop a4 if arg bytes is more than 12 + subs v1, v1, #16 @ skip past register args + ble LMsgSendvCall @ call now if no args remain + add v2, v2, #16 @ skip past register args + +# copy stack args from marg_list +# v1 is remaining bytes, v2 is pointer into marg_list, sp is pointer into stack + tst v1, #4 + subne sp, sp, #4 @ push 4-byte pad if word count is odd + + sub sp, sp, v1 @ move sp to end and copy backwards + @ (this preserves ABI's stack constraints) +LMsgSendvArgLoop: + subs v1, v1, #4 + ldr v3, [v2, v1] + str v3, [sp, v1] + bne LMsgSendvArgLoop + +LMsgSendvCall: + bl _objc_msgSend + +# Pop stack frame and return + MOVE sp, r7 + ldmfd sp!, {a4,v1-v3,r7,pc} +#ifdef VFP_ARGS +#error broken for vfp +#endif + + END_ENTRY objc_msgSendv + + + +/******************************************************************** + * struct_type objc_msgSendv_stret(id self, + * SEL op, + * unsigned arg_size, + * marg_list arg_frame); + * + * typedef struct objc_sendv_margs { + * #ifdef VFP_ARGS + * double vfp[8]; + * #endif + * int a[4]; + * int stackArgs[...]; + * }; + * + * arg_frame is the number of bytes used in a[] plus stackArgs. + * It does not include vfp[]. + ********************************************************************/ + + ENTRY objc_msgSendv_stret + +# Push stack frame + stmfd sp!, {a4,v1-v3,r7,lr} @ a4 saved for stack alignment only + add r7, sp, #16 + SAVE_VFP + +# save sendv's parameters + # stret address stays in a1 + # self stays in a2 + # sel stays in a3 + MOVE v1, a4 @ v1 is arg count in bytes + ldr v2, [r7, #24] @ v2 is marg_list + +# load FP from marg_list +#ifdef VFP_ARGS + fldmfdd v2!, {d0-d7} +#endif + +# load arg registers from marg_list +# v1 is remaining count, v2 is pointer into marg_list + # stret already in a1 + # self already in a2 + # sel already in a3 + subs v1, v1, #16 @ skip past register args + ldrhs a4, [v2, #12] @ pop a4 if arg bytes is at least 16 + beq LMsgSendvStretCall @ call now if no args remain + add v2, v2, #16 @ skip past register args + +# copy stack args from marg_list +# v1 is remaining count, v2 is pointer into marg_list, sp is pointer into stack + tst v1, #4 + subne sp, sp, #4 @ push 4-byte pad if word count is odd + + sub sp, sp, v1 @ move pointers to end and copy backwards + @ (this preserves ABI's stack constraints) +LMsgSendvStretArgLoop: + subs v1, v1, #4 + ldr v3, [v2, v1] + str v3, [sp, v1] + bne LMsgSendvStretArgLoop + +LMsgSendvStretCall: + bl _objc_msgSend_stret + +# Pop stack frame and return + MOVE sp, r7 + ldmfd sp!, {a4,v1-v3,r7,pc} +#ifdef VFP_ARGS +#error broken for vfp +#endif + + END_ENTRY objc_msgSendv_stret + + + ENTRY method_invoke + # a2 is method triplet instead of SEL + ldr ip, [a2, #METHOD_IMP] + ldr a2, [a2, #METHOD_NAME] + bx ip + END_ENTRY method_invoke + + + ENTRY method_invoke_stret + # a3 is method triplet instead of SEL + ldr ip, [a3, #METHOD_IMP] + ldr a3, [a3, #METHOD_NAME] + bx ip + END_ENTRY method_invoke_stret + +#endif diff --git a/runtime/Messengers.subproj/objc-msg-i386.s b/runtime/Messengers.subproj/objc-msg-i386.s index 959791a..3840542 100644 --- a/runtime/Messengers.subproj/objc-msg-i386.s +++ b/runtime/Messengers.subproj/objc-msg-i386.s @@ -20,6 +20,9 @@ * * @APPLE_LICENSE_HEADER_END@ */ + +#ifdef __i386__ + /******************************************************************** ******************************************************************** ** @@ -124,21 +127,6 @@ LAZY_PIC_FUNCTION_STUB(___objc_error) /* No stub needed */ LAZY_PIC_FUNCTION_STUB(mcount) #endif /* PROFILE */ -/******************************************************************** - * - * Constants. - * - ********************************************************************/ - -// In case the implementation is _objc_msgForward, indicate to it -// whether the method was invoked as a word-return or struct-return. -// This flag is passed in a register that is caller-saved, and is -// not part of the parameter passing convention (i.e. it is "out of -// band"). This works because _objc_msgForward is only entered -// from here in the messenger. - kFwdMsgSend = 1 - kFwdMsgSendStret = 0 - /******************************************************************** * @@ -370,17 +358,21 @@ CACHE_GET = 2 // first argument is class, search that class xorl %ebx, %ebx // probeCount = 0 #endif movl mask(%edi), %esi // mask = cache->mask - leal buckets(%edi), %edi // buckets = &cache->buckets movl %ecx, %edx // index = selector shrl $$2, %edx // index = selector >> 2 // search the receiver's cache +// ecx = selector +// edi = cache +// esi = mask +// edx = index +// eax = method (soon) LMsgSendProbeCache_$0_$1_$2: #if defined(OBJC_INSTRUMENTED) addl $$1, %ebx // probeCount += 1 #endif andl %esi, %edx // index &= mask - movl (%edi, %edx, 4), %eax // method = buckets[index] + movl buckets(%edi, %edx, 4), %eax // meth = cache->buckets[index] testl %eax, %eax // check for end of bucket je LMsgSendCacheMiss_$0_$1_$2 // go to cache miss code @@ -568,18 +560,18 @@ LMsgSendHitInstrumentDone_$0_$1_$2: /******************************************************************** - * Method _cache_getMethod(Class cls, SEL sel, IMP objc_msgForward_imp) + * Method _cache_getMethod(Class cls, SEL sel, IMP msgForward_internal_imp) * * If found, returns method triplet pointer. * If not found, returns NULL. * * NOTE: _cache_getMethod never returns any cache entry whose implementation - * is _objc_msgForward. It returns NULL instead. This prevents thread- + * is _objc_msgForward_internal. It returns 1 instead. This prevents thread- * safety and memory management bugs in _class_lookupMethodAndLoadCache. * See _class_lookupMethodAndLoadCache for details. * - * _objc_msgForward is passed as a parameter because it's more efficient - * to do the (PIC) lookup once in the caller than repeatedly here. + * _objc_msgForward_internal is passed as a parameter because it's more + * efficient to do the (PIC) lookup once in the caller than repeatedly here. ********************************************************************/ .private_extern __cache_getMethod @@ -593,10 +585,12 @@ LMsgSendHitInstrumentDone_$0_$1_$2: CacheLookup WORD_RETURN, CACHE_GET, LGetMethodMiss // cache hit, method triplet in %eax - movl first_arg(%esp), %ecx // check for _objc_msgForward - cmpl method_imp(%eax), %ecx - je LGetMethodMiss // if (imp==_objc_msgForward) return nil + movl first_arg(%esp), %ecx // check for _objc_msgForward_internal + cmpl method_imp(%eax), %ecx // if (imp==_objc_msgForward_internal) + je 1f // return (Method)1 ret // else return method triplet address +1: movl $1, %eax + ret LGetMethodMiss: // cache miss, return nil @@ -670,13 +664,13 @@ LGetImpExit: LMsgSendReceiverOk: movl isa(%eax), %edx // class = self->isa CacheLookup WORD_RETURN, MSG_SEND, LMsgSendCacheMiss - movl $kFwdMsgSend, %edx // flag word-return for _objc_msgForward - jmp *%eax // goto *imp + xor %edx, %edx // set nonstret for msgForward_internal + jmp *%eax // cache miss: go search the method lists LMsgSendCacheMiss: MethodTableLookup WORD_RETURN, MSG_SEND - movl $kFwdMsgSend, %edx // flag word-return for _objc_msgForward + xor %edx, %edx // set nonstret for msgForward_internal jmp *%eax // goto *imp // message sent to nil: redirect to nil receiver, if any @@ -740,13 +734,13 @@ LMsgSendExit: // search the cache (class in %edx) CacheLookup WORD_RETURN, MSG_SENDSUPER, LMsgSendSuperCacheMiss - movl $kFwdMsgSend, %edx // flag word-return for _objc_msgForward + xor %edx, %edx // set nonstret for msgForward_internal jmp *%eax // goto *imp // cache miss: go search the method lists LMsgSendSuperCacheMiss: MethodTableLookup WORD_RETURN, MSG_SENDSUPER - movl $kFwdMsgSend, %edx // flag word-return for _objc_msgForward + xor %edx, %edx // set nonstret for msgForward_internal jmp *%eax // goto *imp // ignored selector: return self @@ -843,13 +837,13 @@ LMsgSendvArgsOK: LMsgSendFpretReceiverOk: movl isa(%eax), %edx // class = self->isa CacheLookup WORD_RETURN, MSG_SEND, LMsgSendFpretCacheMiss - movl $kFwdMsgSend, %edx // flag word-return for _objc_msgForward + xor %edx, %edx // set nonstret for msgForward_internal jmp *%eax // goto *imp // cache miss: go search the method lists LMsgSendFpretCacheMiss: MethodTableLookup WORD_RETURN, MSG_SEND - movl $kFwdMsgSend, %edx // flag word-return for _objc_msgForward + xor %edx, %edx // set nonstret for msgForward_internal jmp *%eax // goto *imp // message sent to nil: redirect to nil receiver, if any @@ -958,13 +952,13 @@ LMsgSendvFpretArgsOK: LMsgSendStretReceiverOk: movl isa(%eax), %edx // class = self->isa CacheLookup STRUCT_RETURN, MSG_SEND, LMsgSendStretCacheMiss - movl $kFwdMsgSendStret, %edx // flag struct-return for _objc_msgForward + movl $1, %edx // set stret for objc_msgForward jmp *%eax // goto *imp // cache miss: go search the method lists LMsgSendStretCacheMiss: MethodTableLookup STRUCT_RETURN, MSG_SEND - movl $kFwdMsgSendStret, %edx // flag struct-return for _objc_msgForward + movl $1, %edx // set stret for objc_msgForward jmp *%eax // goto *imp // message sent to nil: redirect to nil receiver, if any @@ -1031,13 +1025,13 @@ LMsgSendStretExit: // search the cache (class in %edx) CacheLookup STRUCT_RETURN, MSG_SENDSUPER, LMsgSendSuperStretCacheMiss - movl $kFwdMsgSendStret, %edx // flag struct-return for _objc_msgForward + movl $1, %edx // set stret for objc_msgForward jmp *%eax // goto *imp // cache miss: go search the method lists LMsgSendSuperStretCacheMiss: MethodTableLookup STRUCT_RETURN, MSG_SENDSUPER - movl $kFwdMsgSendStret, %edx // flag struct-return for _objc_msgForward + movl $1, %edx // set stret for objc_msgForward jmp *%eax // goto *imp LMsgSendSuperStretExit: @@ -1130,20 +1124,29 @@ __objc_forward_handler: .long 0 .private_extern __objc_forward_stret_handler __objc_forward_stret_handler: .long 0 + ENTRY __objc_msgForward_internal + .private_extern __objc_msgForward_internal + // Method cache version + + // THIS IS NOT A CALLABLE C FUNCTION + // Out-of-band register %edx is nonzero for stret, zero otherwise + + // Check return type (stret or not) + testl %edx, %edx + jnz __objc_msgForward_stret + jmp __objc_msgForward + + END_ENTRY _objc_msgForward_internal + ENTRY __objc_msgForward - - // Check return type (stret or not) - cmpl $kFwdMsgSendStret, %edx - je LMsgForwardStret + // Non-struct return version // Get PIC base into %edx call L__objc_msgForward$pic_base L__objc_msgForward$pic_base: popl %edx - // Non-struct return - // Call user handler, if any movl __objc_forward_handler-L__objc_msgForward$pic_base(%edx),%ecx testl %ecx, %ecx // if not NULL @@ -1185,10 +1188,12 @@ LMsgForwardError: pushl %eax pushl (self+4)(%ebp) CALL_EXTERN(___objc_error) // never returns - -LMsgForwardStret: - // Struct return + END_ENTRY __objc_msgForward + + + ENTRY __objc_msgForward_stret + // Struct return version // Get PIC base into %edx call L__objc_msgForwardStret$pic_base @@ -1237,7 +1242,7 @@ LMsgForwardStretError: pushl (self_stret+4)(%ebp) CALL_EXTERN(___objc_error) // never returns - END_ENTRY __objc_msgForward + END_ENTRY __objc_msgForward_stret ENTRY _method_invoke @@ -1260,3 +1265,5 @@ LMsgForwardStretError: jmp *%eax END_ENTRY _method_invoke_stret + +#endif diff --git a/runtime/Messengers.subproj/objc-msg-ppc.s b/runtime/Messengers.subproj/objc-msg-ppc.s index 43a6e78..17da0a0 100644 --- a/runtime/Messengers.subproj/objc-msg-ppc.s +++ b/runtime/Messengers.subproj/objc-msg-ppc.s @@ -20,6 +20,9 @@ * * @APPLE_LICENSE_HEADER_END@ */ + +#ifdef __ppc__ + /******************************************************************** * * objc-msg-ppc.s - PowerPC code to support objc messaging. @@ -194,7 +197,7 @@ LAZY_PIC_FUNCTION_STUB(mcount) * ********************************************************************/ -// In case the implementation is _objc_msgForward, indicate to it +// In case the implementation is _objc_msgForward_internal, indicate to it // whether the method was invoked as a word-return or struct-return. // The li instruction costs nothing because it fits into spare // processor cycles. We choose to make the MsgSend indicator non-zero @@ -732,7 +735,7 @@ LLoop_$0_$1: * If not found, returns NULL. * * NOTE: _cache_getMethod never returns any cache entry whose implementation - * is _objc_msgForward. It returns NULL instead. This prevents thread- + * is _objc_msgForward. It returns (Method)1 instead. This prevents thread- * safety and memory management bugs in _class_lookupMethodAndLoadCache. * See _class_lookupMethodAndLoadCache for details. * @@ -753,7 +756,9 @@ LLoop_$0_$1: cmplw r12, r5 ; check for _objc_msgForward mr r3, r2 ; optimistically get the return value bnelr ; Not _objc_msgForward, return the triplet address - + li r3, 1 ; Is _objc_msgForward, return (Method)1 + blr + LGetMethodMiss: li r3, 0 ; cache miss or _objc_msgForward, return nil blr @@ -1143,6 +1148,24 @@ __objc_forward_stret_handler: .long 0 ENTRY __objc_msgForward + // Non-stret version + li r11,kFwdMsgSend + b __objc_msgForward_internal + END_ENTRY _objc_msgForward + + ENTRY __objc_msgForward_stret + // Struct-return version + li r11,kFwdMsgSendStret + b __objc_msgForward_internal + END_ENTRY _objc_msgForward_stret + + + ENTRY __objc_msgForward_internal + // Method cache version + + // THIS IS NOT A CALLABLE C FUNCTION + // Out-of-band register %r11 is zero for stret, nonzero otherwise + ; do profiling when enabled CALL_MCOUNT @@ -1233,7 +1256,7 @@ LMsgForwardError: CALL_EXTERN(___objc_error) ; never returns trap - END_ENTRY __objc_msgForward + END_ENTRY __objc_msgForward_internal /******************************************************************** @@ -1466,3 +1489,5 @@ LMsgSendvStretSendIt: bctr END_ENTRY _method_invoke_stret + +#endif diff --git a/runtime/Messengers.subproj/objc-msg-ppc64.s b/runtime/Messengers.subproj/objc-msg-ppc64.s deleted file mode 100644 index 9f24607..0000000 --- a/runtime/Messengers.subproj/objc-msg-ppc64.s +++ /dev/null @@ -1,1434 +0,0 @@ -/* - * Copyright (c) 1999-2007 Apple Inc. All Rights Reserved. - * - * @APPLE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_LICENSE_HEADER_END@ - */ -/******************************************************************** - * objc-msg-ppc64.s - PowerPC code to support objc messaging. - * Based on objc-msg-ppc.s, copyright 1988-1996 NeXT Software, Inc. - ********************************************************************/ - -#define __OBJC2__ 1 - -#undef OBJC_ASM -#define OBJC_ASM -#include "objc-rtp.h" - -/******************************************************************** - * Data used by the ObjC runtime. - * - ********************************************************************/ - - .data -; Substitute receiver for messages sent to nil (usually also nil) -; id _objc_nilReceiver - .align 4 -.private_extern __objc_nilReceiver -__objc_nilReceiver: - .quad 0 - -; 8 bytes of zero, for floating-point zero return -L_zero: - .space 8 - -; _objc_entryPoints and _objc_exitPoints are used by method dispatch -; caching code to figure out whether any threads are actively -; in the cache for dispatching. The labels surround the asm code -; that do cache lookups. The tables are zero-terminated. -.private_extern _objc_entryPoints -_objc_entryPoints: - .quad __cache_getImp - .quad __cache_getMethod - .quad _objc_msgSend - .quad _objc_msgSend_stret - .quad _objc_msgSendSuper - .quad _objc_msgSendSuper_stret - .quad _objc_msgSend_rtp - .quad 0 - -.private_extern _objc_exitPoints -_objc_exitPoints: - .quad LGetImpExit - .quad LGetMethodExit - .quad LMsgSendExit - .quad LMsgSendStretExit - .quad LMsgSendSuperExit - .quad LMsgSendSuperStretExit - .quad _objc_msgSend_rtp_exit - .quad 0 - -/* - * Handcrafted dyld stubs for each external call. - * They should be converted into a local branch after linking. aB. - */ - -/* asm_help.h version is not what we want */ -#undef CALL_EXTERN - -#define CALL_EXTERN(name) bl L ## name ## $stub - -#define LAZY_PIC_FUNCTION_STUB(name) \ -.data @\ -.section __TEXT, __picsymbol_stub, symbol_stubs, pure_instructions, 32 @\ -L ## name ## $stub: @\ - .indirect_symbol name @\ - mflr r0 @\ - bcl 20,31,L0$ ## name @\ -L0$ ## name: @\ - mflr r11 @\ - addis r11,r11,ha16(L ## name ## $lazy_ptr-L0$ ## name) @\ - mtlr r0 @\ - ldu r12,lo16(L ## name ## $lazy_ptr-L0$ ## name)(r11) @\ - mtctr r12 @\ - bctr @\ -.data @\ -.lazy_symbol_pointer @\ -L ## name ## $lazy_ptr: @\ - .indirect_symbol name @\ - .quad dyld_stub_binding_helper - -; _class_lookupMethodAndLoadCache -LAZY_PIC_FUNCTION_STUB(__class_lookupMethodAndLoadCache) - -#if __OBJC2__ -; _objc_fixupMessageRef -LAZY_PIC_FUNCTION_STUB(__objc_fixupMessageRef) -#endif - -; __objc_error -LAZY_PIC_FUNCTION_STUB(___objc_error) /* No stub needed */ - -#if defined(PROFILE) -; mcount -LAZY_PIC_FUNCTION_STUB(mcount) -#endif /* PROFILE */ - - -/******************************************************************** - * - * Structure definitions. - * - ********************************************************************/ - -; objc_super parameter to sendSuper -#define RECEIVER 0 -#define CLASS 8 - -; Selected field offsets in class structure -#define ISA 0 -#if __OBJC2__ -# define CACHE 16 -#else -# define CACHE 64 -#endif - -; Method descriptor -#define METHOD_NAME 0 -#define METHOD_IMP 16 - -; Cache header -#define MASK 0 -#define OCCUPIED 4 -#define BUCKETS 8 // variable length array - -#if defined(OBJC_INSTRUMENTED) -; Cache instrumentation data, follows buckets -#define hitCount 0 -#define hitProbes hitCount + 4 -#define maxHitProbes hitProbes + 4 -#define missCount maxHitProbes + 4 -#define missProbes missCount + 4 -#define maxMissProbes missProbes + 4 -#define flushCount maxMissProbes + 4 -#define flushedEntries flushCount + 4 -#endif - -/******************************************************************** - * - * Constants. - * - ********************************************************************/ - -// In case the implementation is _objc_msgForward, indicate to it -// whether the method was invoked as a word-return or struct-return. -// The li instruction costs nothing because it fits into spare -// processor cycles. We choose to make the MsgSend indicator non-zero -// as r11 is already guaranteed non-zero for a cache hit (no li needed). - -#define kFwdMsgSend 1 -#define kFwdMsgSendStret 0 - - -/******************************************************************** - * - * Useful macros. Macros are used instead of subroutines, for speed. - * - ********************************************************************/ - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; -; LOAD_STATIC_WORD targetReg, symbolName, LOCAL_SYMBOL | EXTERNAL_SYMBOL -; -; Load the value of the named static data word. -; -; Takes: targetReg - the register, other than r0, to load -; symbolName - the name of the symbol -; LOCAL_SYMBOL - symbol name used as-is -; EXTERNAL_SYMBOL - symbol name gets nonlazy treatment -; -; Eats: r0 and targetReg -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -; Values to specify whether the symbols is plain or nonlazy -#define LOCAL_SYMBOL 0 -#define EXTERNAL_SYMBOL 1 - -.macro LOAD_STATIC_WORD - - mflr r0 - bcl 20,31,1f ; 31 is cr7[so] -1: mflr $0 - mtlr r0 -.if $2 == EXTERNAL_SYMBOL - addis $0,$0,ha16(L$1-1b) - ld $0,lo16(L$1-1b)($0) - ld $0,0($0) -.elseif $2 == LOCAL_SYMBOL - addis $0,$0,ha16($1-1b) - ld $0,lo16($1-1b)($0) -.else - !!! Unknown symbol type !!! -.endif - -.endmacro - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; -; LEA_STATIC_DATA targetReg, symbolName, LOCAL_SYMBOL | EXTERNAL_SYMBOL -; -; Load the address of the named static data. -; -; Takes: targetReg - the register, other than r0, to load -; symbolName - the name of the symbol -; LOCAL_SYMBOL - symbol is local to this module -; EXTERNAL_SYMBOL - symbol is imported from another module -; -; Eats: r0 and targetReg -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -.macro LEA_STATIC_DATA - mflr r0 - bcl 20,31,1f ; 31 is cr7[so] -1: mflr $0 - mtlr r0 -.if $2 == EXTERNAL_SYMBOL - addis $0,$0,ha16(L$1-1b) - ld $0,lo16(L$1-1b)($0) -.elseif $2 == LOCAL_SYMBOL - addis $0,$0,ha16($1-1b) - addi $0,$0,lo16($1-1b) -.else - !!! Unknown symbol type !!! -.endif - -.endmacro - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; -; ENTRY functionName -; -; Assembly directives to begin an exported function. -; We align on cache boundaries for these few functions. -; -; Takes: functionName - name of the exported function -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -.macro ENTRY - .text - .align 5 - .globl $0 -$0: -.endmacro - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; -; END_ENTRY functionName -; -; Assembly directives to end an exported function. Just a placeholder, -; a close-parenthesis for ENTRY, until it is needed for something. -; -; Takes: functionName - name of the exported function -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -.macro END_ENTRY -.endmacro - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; -; FixupMessageRef receiver, super, ref -; -; Look up a method and fix up a message ref. -; -; Takes: -; receiver = receiver register -; super = register address of objc_super2 struct or NULL -; ref = message ref register -; These arguments must use the REGx macros. Some combinations -; are disallowed. -; -; On exit: -; *ref is fixed up -; r12 is imp to call -; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - - ; $0 = receiver register - ; $1 = register address of objc_super2 struct, or NULL - ; $2 = message ref register - ; Returns imp in r12 and ctr. - ; 3,2,4 4,2,5 2,3,4 2,4,5 - ; 5<4 3<4 4<3,5<4 -#define REG2 2 -#define REG3 3 -#define REG4 4 -#define REG5 5 - - -.macro MR_REG3 -.if $0 == REG2 - mr r3, r2 -.elseif $0 == REG3 - ; mr r3, r3 -.elseif $0 == REG4 - mr r3, r4 -.elseif $0 == REG5 - mr r3, r5 -.else - error unknown register -.endif -.endmacro - -.macro MR_REG4 -.if $0 == REG2 - mr r4, r2 -.elseif $0 == REG3 - mr r4, r3 -.elseif $0 == REG4 - ; mr r4, r4 -.elseif $0 == REG5 - mr r4, r5 -.else - error unknown register -.endif -.endmacro - -.macro MR_REG5 -.if $0 == REG2 - mr r5, r2 -.elseif $0 == REG3 - mr r5, r3 -.elseif $0 == REG4 - mr r5, r4 -.elseif $0 == REG5 - ; mr r5, r5 -.else - error unknown register -.endif -.endmacro - -#if __OBJC2__ -.macro FixupMessageRef - ; Save lr - mflr r0 - std r0, 16(r1) - - ; Save parameter registers - std r3, 48(r1) - std r4, 56(r1) - std r5, 64(r1) - std r6, 72(r1) - std r7, 80(r1) - std r8, 88(r1) - std r9, 96(r1) - std r10, 104(r1) - - ; Save fp parameter registers - stfd f1, -104(r1) - stfd f2, -96(r1) - stfd f3, -88(r1) - stfd f4, -80(r1) - stfd f5, -72(r1) - stfd f6, -64(r1) - stfd f7, -56(r1) - stfd f8, -48(r1) - stfd f9, -40(r1) - stfd f10, -32(r1) - stfd f11, -24(r1) - stfd f12, -16(r1) - stfd f13, -8(r1) - - ; Push stack frame - stdu r1,-120-(13*8)(r1) ; must be 16-byte aligned - -.if REG5 != $1 & REG5 != $0 & REG4 != $0 - MR_REG5 $2 - MR_REG4 $1 - MR_REG3 $0 -.elseif REG3 != $1 & REG3 != $2 & REG4 != $2 - MR_REG3 $0 - MR_REG4 $1 - MR_REG5 $2 -.else - error register collision -.endif - - CALL_EXTERN(__objc_fixupMessageRef) - - ; Save returned IMP in r12 and ctr - mtctr r3 - mr r12, r3 - - ; Pop stack frame - ld r1,0(r1) - - ; Restore lr - ld r0,16(r1) - mtlr r0 - - ; Restore fp parameter registers - lfd f1, -104(r1) - lfd f2, -96(r1) - lfd f3, -88(r1) - lfd f4, -80(r1) - lfd f5, -72(r1) - lfd f6, -64(r1) - lfd f7, -56(r1) - lfd f8, -48(r1) - lfd f9, -40(r1) - lfd f10, -32(r1) - lfd f11, -24(r1) - lfd f12, -16(r1) - lfd f13, -8(r1) - - ; Restore parameter registers - ld r3, 48(r1) - ld r4, 56(r1) - ld r5, 64(r1) - ld r6, 72(r1) - ld r7, 80(r1) - ld r8, 88(r1) - ld r9, 96(r1) - ld r10, 104(r1) - -.endmacro -#endif - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; -; CacheLookup selectorRegister, cacheMissLabel -; -; Locate the implementation for a selector in a class method cache. -; -; Takes: -; $0 = register containing selector (r4 or r5 ONLY); -; cacheMissLabel = label to branch to iff method is not cached -; r12 = class whose cache is to be searched -; -; On exit: (found) method triplet in r2, imp in r12, r11 is non-zero -; (not found) jumps to cacheMissLabel -; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -.macro CacheLookup - -#if defined(OBJC_INSTRUMENTED) - ; when instrumented, we use r6 and r7 - std r6,72(r1) ; save r6 for use as cache pointer - std r7,80(r1) ; save r7 for use as probe count - li r7,0 ; no probes so far! -#endif - - ld r2,CACHE(r12) ; cache = class->cache - std r9,96(r1) ; save r9 - -#if defined(OBJC_INSTRUMENTED) - mr r6,r2 ; save cache pointer -#endif - - lwz r11,MASK(r2) ; mask = cache->mask - addi r0,r2,BUCKETS ; buckets = cache->buckets - sldi r11,r11,3 ; r11 = mask << 3 - and r9,$0,r11 ; bytes = sel & (mask<<3) - -#if defined(OBJC_INSTRUMENTED) - b LLoop_$0_$1 - -LMiss_$0_$1: - ; r6 = cache, r7 = probeCount - lwz r9,MASK(r6) ; entryCount = mask + 1 - addi r9,r9,1 ; - sldi r9,r9,2 ; tableSize = entryCount * sizeof(entry) - addi r9,r9,BUCKETS ; offset = buckets + tableSize - add r11,r6,r9 ; cacheData = &cache->buckets[mask+1] - ld r9,missCount(r11) ; cacheData->missCount += 1 - addi r9,r9,1 ; - std r9,missCount(r11) ; - ld r9,missProbes(r11) ; cacheData->missProbes += probeCount - add r9,r9,r7 ; - std r9,missProbes(r11) ; - ld r9,maxMissProbes(r11) ; if (probeCount > cacheData->maxMissProbes) - cmpld r7,r9 ; maxMissProbes = probeCount - ble .+8 ; - std r7,maxMissProbes(r11) ; - - ld r6,72(r1) ; restore r6 - ld r7,80(r1) ; restore r7 - - b $1 ; goto cacheMissLabel -#endif - -; search the cache -LLoop_$0_$1: -#if defined(OBJC_INSTRUMENTED) - addi r7,r7,1 ; probeCount += 1 -#endif - - ldx r2,r9,r0 ; method = buckets[bytes/8] - addi r9,r9,8 ; bytes += 8 - cmpldi r2,0 ; if (method == NULL) -#if defined(OBJC_INSTRUMENTED) - beq- LMiss_$0_$1 -#else - beq- $1 ; goto cacheMissLabel -#endif - - ld r12,METHOD_NAME(r2) ; name = method->method_name - and r9,r9,r11 ; bytes &= (mask<<3) - cmpld r12,$0 ; if (name != selector) - bne- LLoop_$0_$1 ; goto loop - -; cache hit, r2 == method triplet address -; Return triplet in r2 and imp in r12 - ld r12,METHOD_IMP(r2) ; imp = method->method_imp - -#if defined(OBJC_INSTRUMENTED) - ; r6 = cache, r7 = probeCount - lwz r9,MASK(r6) ; entryCount = mask + 1 - addi r9,r9,1 ; - sldi r9,r9,2 ; tableSize = entryCount * sizeof(entry) - addi r9,r9,BUCKETS ; offset = buckets + tableSize - add r11,r6,r9 ; cacheData = &cache->buckets[mask+1] - lwz r9,hitCount(r11) ; cache->hitCount += 1 - addi r9,r9,1 ; - stw r9,hitCount(r11) ; - lwz r9,hitProbes(r11) ; cache->hitProbes += probeCount - add r9,r9,r7 ; - stw r9,hitProbes(r11) ; - lwz r9,maxHitProbes(r11) ; if (probeCount > cache->maxMissProbes) - cmplw r7,r9 ;maxMissProbes = probeCount - ble .+8 ; - stw r7,maxHitProbes(r11) ; - - ld r6,72(r1) ; restore r6 - ld r7,80(r1) ; restore r7 -#endif - - ld r9,96(r1) ; restore r9 - -.endmacro - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; -; CacheLookup cache locking - 2001-11-12 -; The collecting cache mechanism precludes the need for a cache lock -; in objc_msgSend. The cost of the collecting cache is small: a few -; K of memory for uncollected caches, and less than 1 ms per collection. -; A large app will only run collection a few times. -; Using the code below to lock the cache almost doubles messaging time, -; costing several seconds of CPU across several minutes of operation. -; The code below probably could be improved, but almost all of the -; locking slowdown is in the sync and isync. -; -; 40 million message test times (G4 1x667): -; no lock 4.390u 0.030s 0:04.59 96.2% 0+0k 0+1io 0pf+0w -; with lock 9.120u 0.010s 0:09.83 92.8% 0+0k 0+0io 0pf+0w -; -;; LockCache mask_dest, cache -;.macro LockCache -; ; LOCKED mask is NEGATIVE -; lwarx $0, mask, $1 ; mask = reserve(cache->mask) -; cmpwi $0, 0 ; -; blt .-8 ; try again if mask < 0 -; neg r0, $0 ; -; stwcx. r0, mask, $1 ; cache->mask = -mask ($0 keeps +mask) -; bne .-20 ; try again if lost reserve -; isync ; flush prefetched instructions after locking -;.endmacro -; -;; UnlockCache (mask<<2), cache -;.macro UnlockCache -; sync ; finish previous instructions before unlocking -; srwi r0, $0, 2 ; r0 = (mask<<2) >> 2 -; stw r0, mask($1) ; cache->mask = +mask -;.endmacro -; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; -; -; MethodTableLookup WORD_RETURN | STRUCT_RETURN, MSG_SEND | MSG_SENDSUPER -; -; Takes: WORD_RETURN (r3 is first parameter) -; STRUCT_RETURN (r3 is structure return address, r4 is first parameter) -; MSG_SEND (first parameter is receiver) -; MSG_SENDSUPER (first parameter is address of objc_super structure) -; -; Eats: r0, r2, r11, r12 -; On exit: restores r9 saved by CacheLookup -; imp in ctr -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -; Values to specify to method lookup macros whether the return type of -; the method is an integer or structure. -#define WORD_RETURN 0 -#define STRUCT_RETURN 1 - -; Values to specify to method lookup macros whether the return type of -; the method is an integer or structure. -#define MSG_SEND 0 -#define MSG_SENDSUPER 1 - -.macro MethodTableLookup - mflr r0 ; save lr - std r0, 16(r1) ; - - std r3, 48(r1) ; save arguments - std r4, 56(r1) ; - std r5, 64(r1) ; - std r6, 72(r1) ; - std r7, 80(r1) ; - std r8, 88(r1) ; - ; r9 was saved by CacheLookup - std r10, 104(r1) ; - -; Save the FP parameter registers. -; We do not spill vector argument registers. This is -; harmless because vector parameters are unsupported. - stfd f1, -104(r1) ; - stfd f2, -96(r1) ; - stfd f3, -88(r1) ; - stfd f4, -80(r1) ; - stfd f5, -72(r1) ; - stfd f6, -64(r1) ; - stfd f7, -56(r1) ; - stfd f8, -48(r1) ; - stfd f9, -40(r1) ; - stfd f10, -32(r1) ; - stfd f11, -24(r1) ; - stfd f12, -16(r1) ; - stfd f13, -8(r1) ; - - stdu r1,-120-(13*8)(r1) ; grow the stack. Must be 16-byte-aligned. - -; Pass parameters to __class_lookupMethodAndLoadCache. First parameter is -; the class pointer. Second parameter is the selector. Where they come -; from depends on who called us. In the int return case, the selector is -; already in r4. -.if $0 == WORD_RETURN ; WORD_RETURN -.if $1 == MSG_SEND ; MSG_SEND - ld r3,ISA(r3) ; class = receiver->isa -.else ; MSG_SENDSUPER - ld r3,CLASS(r3) ; class = super->class -.endif - -.else ; STRUCT_RETURN -.if $1 == MSG_SEND ; MSG_SEND - ld r3,ISA(r4) ; class = receiver->isa -.else ; MSG_SENDSUPER - ld r3,CLASS(r4) ; class = super->class -.endif - mr r4,r5 ; selector = selector -.endif - - ; We code the call inline rather than using the CALL_EXTERN macro because - ; that leads to a lot of extra unnecessary and inefficient instructions. - CALL_EXTERN(__class_lookupMethodAndLoadCache) - - mr r12,r3 ; copy implementation to r12 - mtctr r3 ; copy imp to ctr - ld r1,0(r1) ; restore the stack pointer - ld r0,16(r1) ; - mtlr r0 ; restore return pc - -; Restore FP parameter registers - lfd f1, -104(r1) ; - lfd f2, -96(r1) ; - lfd f3, -88(r1) ; - lfd f4, -80(r1) ; - lfd f5, -72(r1) ; - lfd f6, -64(r1) ; - lfd f7, -56(r1) ; - lfd f8, -48(r1) ; - lfd f9, -40(r1) ; - lfd f10, -32(r1) ; - lfd f11, -24(r1) ; - lfd f12, -16(r1) ; - lfd f13, -8(r1) ; - - ld r3, 48(r1) ; restore parameter registers - ld r4, 56(r1) ; - ld r5, 64(r1) ; - ld r6, 72(r1) ; - ld r7, 80(r1) ; - ld r8, 88(r1) ; - ld r9, 96(r1) ; r9 was saved by CacheLookup - ld r10, 104(r1) ; - -.endmacro - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; -; CALL_MCOUNT -; -; Macro to call mcount function in profiled builds. -; -; NOTE: Makes sure to save/restore r11 and r12, even though they -; are not defined to be volatile, because they are used during -; forwarding. -; -; Takes: lr Callers return PC -; -; Eats: r0 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - - .macro CALL_MCOUNT -#if defined(PROFILE) - mflr r0 ; save return pc - std r0, 16(r1) ; - - stdu r1,-304(r1) ; push aligned areas, set stack link - - std r3, 112(r1) ; save all volatile registers - std r4, 120(r1) ; - std r5, 128(r1) ; - std r6, 136(r1) ; - std r7, 144(r1) ; - std r8, 152(r1) ; - std r9, 160(r1) ; - std r10,168(r1) ; - std r11,176(r1) ; save r11 and r12, too - std r12,184(r1) ; - - stfd f1, 192(r1) ; - stfd f2, 200(r1) ; - stfd f3, 208(r1) ; - stfd f4, 216(r1) ; - stfd f5, 224(r1) ; - stfd f6, 232(r1) ; - stfd f7, 240(r1) ; - stfd f8, 248(r1) ; - stfd f9, 256(r1) ; - stfd f10,264(r1) ; - stfd f11,272(r1) ; - stfd f12,280(r1) ; - stfd f13,288(r1) ; - - mr r3, r0 ; pass our callers address - - CALL_EXTERN(mcount) - - ld r3, 112(r1) ; restore all volatile registers - ld r4, 120(r1) ; - ld r5, 128(r1) ; - ld r6, 136(r1) ; - ld r7, 144(r1) ; - ld r8, 152(r1) ; - ld r9, 160(r1) ; - ld r10,168(r1) ; - ld r11,176(r1) ; restore r11 and r12, too - ld r12,184(r1) ; - - lfd f1, 192(r1) ; - lfd f2, 200(r1) ; - lfd f3, 208(r1) ; - lfd f4, 216(r1) ; - lfd f5, 224(r1) ; - lfd f6, 232(r1) ; - lfd f7, 240(r1) ; - lfd f8, 248(r1) ; - lfd f9, 256(r1) ; - lfd f10,264(r1) ; - lfd f11,272(r1) ; - lfd f12,280(r1) ; - lfd f13,288(r1) ; - - ld r1, 0(r1) ; restore the stack pointer - ld r0, 16(r1) ; - mtlr r0 ; restore return pc -#endif - .endmacro - - -/******************************************************************** - * Method _cache_getMethod(Class cls, SEL sel, IMP objc_msgForward_imp) - * - * On entry: r3 = class whose cache is to be searched - * r4 = selector to search for - * r5 = _objc_msgForward IMP - * - * If found, returns method triplet pointer. - * If not found, returns NULL. - * - * NOTE: _cache_getMethod never returns any cache entry whose implementation - * is _objc_msgForward. It returns NULL instead. This prevents thread- - * safety and memory management bugs in _class_lookupMethodAndLoadCache. - * See _class_lookupMethodAndLoadCache for details. - * - * _objc_msgForward is passed as a parameter because it's more efficient - * to do the (PIC) lookup once in the caller than repeatedly here. - ********************************************************************/ - - .private_extern __cache_getMethod - ENTRY __cache_getMethod -; do profiling if enabled - CALL_MCOUNT - -; do lookup - mr r12,r3 ; move class to r12 for CacheLookup - CacheLookup r4, LGetMethodMiss - -; cache hit, method triplet in r2 and imp in r12 - cmpld r12, r5 ; check for _objc_msgForward - mr r3, r2 ; optimistically get the return value - bnelr ; Not _objc_msgForward, return the triplet address - -LGetMethodMiss: - li r3, 0 ; cache miss or _objc_msgForward, return nil - blr - -LGetMethodExit: - END_ENTRY __cache_getMethod - - -/******************************************************************** - * IMP _cache_getImp(Class cls, SEL sel) - * - * On entry: r3 = class whose cache is to be searched - * r4 = selector to search for - * - * If found, returns method implementation. - * If not found, returns NULL. - ********************************************************************/ - - .private_extern __cache_getImp - ENTRY __cache_getImp -; do profiling if enabled - CALL_MCOUNT - -; do lookup - mr r12,r3 ; move class to r12 for CacheLookup - CacheLookup r4, LGetImpMiss - -; cache hit, method triplet in r2 and imp in r12 - mr r3, r12 ; return method imp address - blr - -LGetImpMiss: -; cache miss, return nil - li r3, 0 ; return nil - blr - -LGetImpExit: - END_ENTRY __cache_getImp - - -/******************************************************************** - * id objc_msgSend(id self, - * SEL op, - * ...); - * - * On entry: r3 is the message receiver, - * r4 is the selector - ********************************************************************/ - -; WARNING - This code may be copied as is to the Objective-C runtime pages. -; The code is copied by rtp_set_up_objc_msgSend() from the -; beginning to the blr marker just prior to the cache miss code. -; Do not add callouts, global variable accesses, or rearrange -; the code without updating rtp_set_up_objc_msgSend. - -; Absolute symbols bounding the runtime page version of objc_msgSend. -_objc_msgSend_rtp = 0xfffffffffffeff00 -_objc_msgSend_rtp_exit = 0xfffffffffffeff00+0x100 - - ENTRY _objc_msgSend -; check whether receiver is nil or selector is to be ignored - cmpldi r3,0 ; receiver nil? - not r11, r4 - xoris r11, r11, ((~kIgnore >> 16) & 0xffff) - beq- LMsgSendNilSelf ; if nil receiver, call handler or return nil - ld r12,ISA(r3) ; class = receiver->isa - cmpldi r11, (~kIgnore & 0xffff) - beqlr- ; if ignored selector, return self immediately - -; guaranteed non-nil entry point (disabled for now) -; .globl _objc_msgSendNonNil -; _objc_msgSendNonNil: - -; do profiling when enabled - CALL_MCOUNT - -; receiver is non-nil: search the cache -LMsgSendReceiverOk: - ; class is already in r12 - CacheLookup r4, LMsgSendCacheMiss - ; CacheLookup placed imp in r12 - mtctr r12 - ; r11 guaranteed non-zero on exit from CacheLookup with a hit - // li r11,kFwdMsgSend ; indicate word-return to _objc_msgForward - bctr ; goto *imp; - -; WARNING - The first six instructions of LMsgSendNilSelf are -; rewritten when objc_msgSend is copied to the runtime pages. -; These instructions must be maintained AS IS unless the code in -; rtp_set_up_objc_msgSend is also updated. -; * `mflr r0` must not be changed (not even to use a different register) -; * the load of _objc_nilReceiver value must remain six insns long -; * the value of _objc_nilReceiver must continue to be loaded into r11 - -; message sent to nil: redirect to nil receiver, if any -LMsgSendNilSelf: - ; DO NOT CHANGE THE NEXT SIX INSTRUCTIONS - see note above - mflr r0 ; save return address - bcl 20,31,1f ; 31 is cr7[so] -1: mflr r11 - addis r11,r11,ha16(__objc_nilReceiver-1b) - ld r11,lo16(__objc_nilReceiver-1b)(r11) - mtlr r0 ; restore return address - ; DO NOT CHANGE THE PREVIOUS SIX INSTRUCTIONS - see note above - - cmpldi r11,0 ; return nil if no new receiver - beq LMsgSendReturnZero - - mr r3,r11 ; send to new receiver - ld r12,ISA(r11) ; class = receiver->isa - b LMsgSendReceiverOk - -LMsgSendReturnZero: - li r3, 0 - li r4, 0 - ; fixme this breaks RTP - LEA_STATIC_DATA r11, L_zero, LOCAL_SYMBOL - lfd f1, 0(r11) - lfd f2, 0(r11) - -; WARNING - This blr marks the end of the copy to the ObjC runtime pages and -; also marks the beginning of the cache miss code. Do not move -; around without checking the ObjC runtime pages initialization code. - blr - -; cache miss: go search the method lists -LMsgSendCacheMiss: - MethodTableLookup WORD_RETURN, MSG_SEND - li r11,kFwdMsgSend ; indicate word-return to _objc_msgForward - bctr ; goto *imp; - -LMsgSendExit: - END_ENTRY _objc_msgSend - - -#if __OBJC2__ - ENTRY _objc_msgSend_fixup - - cmpldi r3, 0 - li r2, 0 - beq- LMsgSendFixupNilSelf - - ; r3 = receiver - ; r2 = 0 (not msgSend_super) - ; r4 = address of message ref - FixupMessageRef REG3, REG2, REG4 - - ; imp is in r12 and ctr - ; Load _cmd from the message_ref - ld r4, 8(r4) - ; Be ready for objc_msgForward - li r11, kFwdMsgSend - bctr - -LMsgSendFixupNilSelf: - li r3, 0 - li r4, 0 - LEA_STATIC_DATA r11, L_zero, LOCAL_SYMBOL - lfd f1, 0(r11) - lfd f2, 0(r11) - blr - - END_ENTRY _objc_msgSend_fixup - - - ENTRY _objc_msgSend_fixedup - ; Load _cmd from the message_ref - ld r4, 8(r4) - b _objc_msgSend - END_ENTRY _objc_msgSend_fixedup -#endif - - -/******************************************************************** - * - * double objc_msgSend_fpret(id self, SEL op, ...); - * - ********************************************************************/ - - ENTRY _objc_msgSend_fpret - b _objc_msgSend - END_ENTRY _objc_msgSend_fpret - -/******************************************************************** - * struct_type objc_msgSend_stret(id self, - * SEL op, - * ...); - * - * objc_msgSend_stret is the struct-return form of msgSend. - * The ABI calls for r3 to be used as the address of the structure - * being returned, with the parameters in the succeeding registers. - * - * On entry: r3 is the address where the structure is returned, - * r4 is the message receiver, - * r5 is the selector - ********************************************************************/ - - ENTRY _objc_msgSend_stret -; check whether receiver is nil - cmpldi r4,0 ; receiver nil? - beq LMsgSendStretNilSelf ; if so, call handler or just return - -; guaranteed non-nil entry point (disabled for now) -; .globl _objc_msgSendNonNil_stret -; _objc_msgSendNonNil_stret: - -; do profiling when enabled - CALL_MCOUNT - -; receiver is non-nil: search the cache -LMsgSendStretReceiverOk: - ld r12, ISA(r4) ; class = receiver->isa - CacheLookup r5, LMsgSendStretCacheMiss - ; CacheLookup placed imp in r12 - mtctr r12 - li r11,kFwdMsgSendStret ; indicate struct-return to _objc_msgForward - bctr ; goto *imp; - -; cache miss: go search the method lists -LMsgSendStretCacheMiss: - MethodTableLookup STRUCT_RETURN, MSG_SEND - li r11,kFwdMsgSendStret ; indicate struct-return to _objc_msgForward - bctr ; goto *imp; - -; message sent to nil: redirect to nil receiver, if any -LMsgSendStretNilSelf: - mflr r0 ; load new receiver - bcl 20,31,1f ; 31 is cr7[so] -1: mflr r11 - addis r11,r11,ha16(__objc_nilReceiver-1b) - ld r11,lo16(__objc_nilReceiver-1b)(r11) - mtlr r0 - - cmpldi r11,0 ; return nil if no new receiver - beqlr - - mr r4,r11 ; send to new receiver - b LMsgSendStretReceiverOk - -LMsgSendStretExit: - END_ENTRY _objc_msgSend_stret - - -#if __OBJC2__ - ENTRY _objc_msgSend_stret_fixup - - cmpldi r4, 0 - li r2, 0 - beqlr- ; return if nil receiver - - ; r4 = receiver - ; r2 = 0 (not msgSend_super) - ; r5 = address of message ref - FixupMessageRef REG4, REG2, REG5 - - ; imp is in r12 and ctr - ; Load _cmd from the message_ref - ld r5, 8(r5) - ; Be ready for objc_msgForward - li r11, kFwdMsgSendStret - bctr - - END_ENTRY _objc_msgSend_stret_fixup - - - ENTRY _objc_msgSend_stret_fixedup - ; Load _cmd from the message_ref - ld r5, 8(r5) - b _objc_msgSend_stret - END_ENTRY _objc_msgSend_stret_fixedup -#endif - - -/******************************************************************** - * id objc_msgSendSuper(struct objc_super *super, - * SEL op, - * ...); - * - * struct objc_super { - * id receiver; - * Class class; - * }; - ********************************************************************/ - - - ENTRY _objc_msgSendSuper -; do profiling when enabled - CALL_MCOUNT - -; check whether selector is to be ignored - not r11, r4 - xoris r11, r11, ((~kIgnore >> 16) & 0xffff) - ld r12,CLASS(r3) ; class = super->class - cmpldi r11, (~kIgnore & 0xffff) - beqlr- ; if ignored selector, return self immediately - -; search the cache - ; class is already in r12 - CacheLookup r4, LMsgSendSuperCacheMiss - ; CacheLookup placed imp in r12 - mtctr r12 - ld r3,RECEIVER(r3) ; receiver is the first arg - ; r11 guaranteed non-zero after cache hit - ; li r11,kFwdMsgSend ; indicate word-return to _objc_msgForward - bctr ; goto *imp; - -; cache miss: go search the method lists -LMsgSendSuperCacheMiss: - MethodTableLookup WORD_RETURN, MSG_SENDSUPER - ld r3,RECEIVER(r3) ; receiver is the first arg - li r11,kFwdMsgSend ; indicate word-return to _objc_msgForward - bctr ; goto *imp; - -; ignored selector: return self -LMsgSendSuperIgnored: - ld r3,RECEIVER(r3) - blr - -LMsgSendSuperExit: - END_ENTRY _objc_msgSendSuper - - -#if __OBJC2__ - ENTRY _objc_msgSendSuper2_fixup - - ld r2, RECEIVER(r3) - - ; r2 = receiver - ; r3 = address of objc_super2 - ; r4 = address of message ref - FixupMessageRef REG2, REG3, REG4 - - ; imp is in r12 and ctr - ; Load _cmd from the message_ref - ld r4, 8(r4) - ; Load receiver from objc_super2 - ld r3, RECEIVER(r3) - bctr - - END_ENTRY _objc_msgSendSuper2_fixup - - - ENTRY _objc_msgSendSuper2_fixedup - ; objc_super->class is superclass of the class to search - ld r11, CLASS(r3) ; cls = objc_super->class - ld r4, 8(r4) ; load _cmd from message_ref - ld r11, 8(r11) ; cls = cls->superclass - std r11, CLASS(r3) ; objc_super->class = cls - ; objc_super->class is now the class to search - b _objc_msgSendSuper - END_ENTRY _objc_msgSendSuper2_fixedup -#endif - - -/******************************************************************** - * struct_type objc_msgSendSuper_stret(objc_super *super, - * SEL op, - * ...); - * - * struct objc_super { - * id receiver; - * Class class; - * }; - * - * - * objc_msgSendSuper_stret is the struct-return form of msgSendSuper. - * The ABI calls for r3 to be used as the address of the structure - * being returned, with the parameters in the succeeding registers. - * - * On entry: r3 is the address to which to copy the returned structure, - * r4 is the address of the objc_super structure, - * r5 is the selector - ********************************************************************/ - - ENTRY _objc_msgSendSuper_stret -; do profiling when enabled - CALL_MCOUNT - -; search the cache - ld r12,CLASS(r4) ; class = super->class - CacheLookup r5, LMsgSendSuperStretCacheMiss - ; CacheLookup placed imp in r12 - mtctr r12 - ld r4,RECEIVER(r4) ; receiver is the first arg - li r11,kFwdMsgSendStret ; indicate struct-return to _objc_msgForward - bctr ; goto *imp; - -; cache miss: go search the method lists -LMsgSendSuperStretCacheMiss: - MethodTableLookup STRUCT_RETURN, MSG_SENDSUPER - ld r4,RECEIVER(r4) ; receiver is the first arg - li r11,kFwdMsgSendStret ; indicate struct-return to _objc_msgForward - bctr ; goto *imp; - -LMsgSendSuperStretExit: - END_ENTRY _objc_msgSendSuper_stret - - -#if __OBJC2__ - ENTRY _objc_msgSendSuper2_stret_fixup - - ld r2, RECEIVER(r4) - - ; r2 = receiver - ; r4 = address of objc_super2 - ; r5 = address of message ref - FixupMessageRef REG2, REG4, REG5 - - ; imp is in r12 and ctr - ; Load _cmd from the message_ref - ld r5, 8(r5) - ; Load receiver from objc_super2 - ld r4, RECEIVER(r4) - bctr - - END_ENTRY _objc_msgSendSuper2_stret_fixup - - - ENTRY _objc_msgSendSuper2_stret_fixedup - ; objc_super->class is superclass of the class to search - ld r11, CLASS(r4) ; cls = objc_super->class - ld r5, 8(r5) ; load _cmd from message_ref - ld r11, 8(r11) ; cls = cls->superclass - std r11, CLASS(r4) ; objc_super->class = cls - ; objc_super->class is now the class to search - b _objc_msgSendSuper_stret - END_ENTRY _objc_msgSendSuper2_stret_fixedup -#endif - - -/******************************************************************** - * - * Out-of-band parameter r11 indicates whether it was objc_msgSend or - * objc_msgSend_stret that triggered the message forwarding. The - * - * Iff r11 == kFwdMsgSend, it is the word-return (objc_msgSend) case, - * and the interface is: - * - * id _objc_msgForward(id self, - * SEL sel, - * ...); - * - * Iff r11 == kFwdMsgSendStret, it is the structure-return - * (objc_msgSend_stret) case, and the interface is: - * - * struct_type _objc_msgForward(id self, - * SEL sel, - * ...); - * - * There are numerous reasons why it is better to have one - * _objc_msgForward, rather than adding _objc_msgForward_stret. - * The best one is that _objc_msgForward is the method that - * gets cached when respondsToMethod returns false, and it - * wouldnt know which one to use. - * - * Sends the message to a method having the signature - * - * - forward:(SEL)sel :(marg_list)args; - * - * But the marg_list is prepended with the 13 double precision - * floating point registers that could be used as parameters into - * the method (fortunately, the same registers are used for either - * single or double precision floats). These registers are layed - * down by _objc_msgForward, and picked up by _objc_msgSendv. So - * the "marg_list" is actually: - * - * typedef struct objc_sendv_margs { - * double floatingPointArgs[13]; - * intptr_t linkageArea[6]; - * intptr_t registerArgs[8]; - * intptr_t stackArgs[variable]; - * }; - * - ********************************************************************/ - -; _FwdSel is @selector(forward::), set up in map_images(). -; ALWAYS dereference _FwdSel to get to "forward::" !! - .data - .align 3 - .private_extern _FwdSel -_FwdSel: .quad 0 - - .cstring - .align 3 -LUnkSelStr: .ascii "Does not recognize selector %s\0" - - .data - .align 3 - .private_extern __objc_forward_handler -__objc_forward_handler: .quad 0 - - .data - .align 3 - .private_extern __objc_forward_stret_handler -__objc_forward_stret_handler: .quad 0 - - ENTRY __objc_msgForward -; do profiling when enabled - CALL_MCOUNT - - ; Check return type (stret or not) - cmpldi r11, kFwdMsgSendStret - beq LMsgForwardStretSel - - ; Non-stret return - ; Call user handler, if any - LOAD_STATIC_WORD r12, __objc_forward_handler, LOCAL_SYMBOL - cmpldi r12, 0 - mtctr r12 - bnectr ; call _objc_forward_handler if not NULL - ; No user handler - mr r11, r3 ; r11 = receiver - mr r12, r4 ; r12 = SEL - b LMsgForwardSelCmp - -LMsgForwardStretSel: - ; Stret return - ; Call user handler, if any - LOAD_STATIC_WORD r12, __objc_forward_stret_handler, LOCAL_SYMBOL - cmpldi r12, 0 - mtctr r12 - bnectr ; call _objc_forward_stret_handler if not NULL - ; No user handler - mr r11, r4 ; r11 = receiver - mr r12, r5 ; r12 = SEL - -LMsgForwardSelCmp: - ; r11 is the receiver - ; r12 is the selector - - ; Die if forwarding "forward::" - LOAD_STATIC_WORD r2, _FwdSel, LOCAL_SYMBOL - cmpld r2, r12 - beq LMsgForwardError - - ; Save registers to margs - ; Link register - mflr r0 - std r0, 16(r1) - - ; GPR parameters - std r3, 48(r1) - std r4, 56(r1) - std r5, 64(r1) - std r6, 72(r1) - std r7, 80(r1) - std r8, 88(r1) - std r9, 96(r1) - std r10,104(r1) - - ; FP parameters - stfd f1, -104(r1) - stfd f2, -96(r1) - stfd f3, -88(r1) - stfd f4, -80(r1) - stfd f5, -72(r1) - stfd f6, -64(r1) - stfd f7, -56(r1) - stfd f8, -48(r1) - stfd f9, -40(r1) - stfd f10, -32(r1) - stfd f11, -24(r1) - stfd f12, -16(r1) - stfd f13, -8(r1) - - ; Call [receiver forward:sel :margs] - mr r3, r11 ; receiver - mr r4, r2 ; forward:: - mr r5, r12 ; sel - subi r6,r1,13*8 ; &margs (on stack) - - stdu r1,-120-(13*8)(r1) ; push stack frame - bl _objc_msgSend ; [self forward:sel :objc_sendv_margs] - addi r1,r1,120+13*8 ; pop stack frame - - ld r0,16(r1) ; restore lr - mtlr r0 ; - blr ; - - -LMsgForwardError: - ; Call __objc_error(receiver, "unknown selector %s", "forward::") - mr r3, r11 - LEA_STATIC_DATA r4, LUnkSelStr, LOCAL_SYMBOL - mr r5, r2 - CALL_EXTERN(___objc_error) ; never returns - trap - - END_ENTRY __objc_msgForward - - - ENTRY _method_invoke - - ld r12, METHOD_IMP(r4) - ld r4, METHOD_NAME(r4) - mtctr r12 - bctr - - END_ENTRY _method_invoke - - - ENTRY _method_invoke_stret - - ld r12, METHOD_IMP(r5) - ld r5, METHOD_NAME(r5) - mtctr r12 - bctr - - END_ENTRY _method_invoke_stret diff --git a/runtime/Messengers.subproj/objc-msg-stub-i386.s b/runtime/Messengers.subproj/objc-msg-stub-i386.s deleted file mode 100644 index c91ba5b..0000000 --- a/runtime/Messengers.subproj/objc-msg-stub-i386.s +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) 2004, 2006 Apple Inc. All rights reserved. - * - * @APPLE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_LICENSE_HEADER_END@ - */ - -/* - * Interposing support. - * When OBJC_ALLOW_INTERPOSING is set, calls to objc_msgSend_rtp - * jump to the ordinary messenger via this stub. If objc_msgSend - * itself is interposed, dyld will find and change this stub. - * This stub must be compiled into a separate linker module. - */ - - .data - .align 4, 0x90 -L_get_pc_thunk.edx: - movl (%esp,1), %edx - ret - - .data - .picsymbol_stub -L_objc_msgSend$stub: - .indirect_symbol _objc_msgSend - call L_get_pc_thunk.edx -1: - movl L_objc_msgSend$lz-1b(%edx),%ecx - jmp *%ecx -L_objc_msgSend$stub_binder: - lea L_objc_msgSend$lz-1b(%edx),%eax - pushl %eax - jmp dyld_stub_binding_helper - nop - - .data - .lazy_symbol_pointer -L_objc_msgSend$lz: - .indirect_symbol _objc_msgSend - .long L_objc_msgSend$stub_binder - - .text - .align 4, 0x90 - .private_extern _objc_msgSend_stub -_objc_msgSend_stub: - jmp L_objc_msgSend$stub diff --git a/runtime/Messengers.subproj/objc-msg-stub-ppc.s b/runtime/Messengers.subproj/objc-msg-stub-ppc.s deleted file mode 100644 index 8cc525b..0000000 --- a/runtime/Messengers.subproj/objc-msg-stub-ppc.s +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (c) 2004, 2006 Apple Inc. All rights reserved. - * - * @APPLE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_LICENSE_HEADER_END@ - */ - -/* - * Interposing support. - * When OBJC_ALLOW_INTERPOSING is set, calls to objc_msgSend_rtp - * jump to the ordinary messenger via this stub. If objc_msgSend - * itself is interposed, dyld will find and change this stub. - * This stub must be compiled into a separate linker module. - */ - - .data - .picsymbol_stub -L_objc_msgSend$stub: - .indirect_symbol _objc_msgSend - mflr r0 - bcl 20,31,1f -1: - mflr r11 - addis r11,r11,ha16(L_objc_msgSend$lazy_ptr-1b) - mtlr r0 - lwz r12,lo16(L_objc_msgSend$lazy_ptr-1b)(r11) - mtctr r12 - addi r11,r11,lo16(L_objc_msgSend$lazy_ptr-1b) - bctr - - .data - .lazy_symbol_pointer -L_objc_msgSend$lazy_ptr: - .indirect_symbol _objc_msgSend - .long dyld_stub_binding_helper - - .text - .align 4 - .private_extern _objc_msgSend_stub - -_objc_msgSend_stub: - b L_objc_msgSend$stub diff --git a/runtime/Messengers.subproj/objc-msg-stub-ppc64.s b/runtime/Messengers.subproj/objc-msg-stub-ppc64.s deleted file mode 100644 index 9376960..0000000 --- a/runtime/Messengers.subproj/objc-msg-stub-ppc64.s +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (c) 2004-2006 Apple Inc. All rights reserved. - * - * @APPLE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_LICENSE_HEADER_END@ - */ - -/* - * Interposing support. - * When OBJC_ALLOW_INTERPOSING is set, calls to objc_msgSend_rtp - * jump to the ordinary messenger via this stub. If objc_msgSend - * itself is interposed, dyld will find and change this stub. - * This stub must be compiled into a separate linker module. - */ - - .data - .section __TEXT, __picsymbol_stub, symbol_stubs, pure_instructions, 32 -L_objc_msgSend$stub: - .indirect_symbol _objc_msgSend - mflr r0 - bcl 20,31,1f -1: - mflr r11 - addis r11,r11,ha16(L_objc_msgSend$lazy_ptr-1b) - mtlr r0 - ldu r12,lo16(L_objc_msgSend$lazy_ptr-1b)(r11) - mtctr r12 - bctr - - .data - .lazy_symbol_pointer -L_objc_msgSend$lazy_ptr: - .indirect_symbol _objc_msgSend - .quad dyld_stub_binding_helper - - .text - .align 4 - .private_extern _objc_msgSend_stub - -_objc_msgSend_stub: - b L_objc_msgSend$stub diff --git a/runtime/Messengers.subproj/objc-msg-stub-x86_64.s b/runtime/Messengers.subproj/objc-msg-stub-x86_64.s deleted file mode 100644 index 1295567..0000000 --- a/runtime/Messengers.subproj/objc-msg-stub-x86_64.s +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2004-2006 Apple Inc. All rights reserved. - * - * @APPLE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_LICENSE_HEADER_END@ - */ - -/* - * Interposing support. - * When OBJC_ALLOW_INTERPOSING is set, calls to objc_msgSend_rtp - * jump to the ordinary messenger via this stub. If objc_msgSend - * itself is interposed, dyld will find and change this stub. - * This stub must be compiled into a separate linker module. - */ - -#warning x86_64 interposing stub not implemented - - .text - .align 2, 0x90 - .globl _objc_msgSend_stub -_objc_msgSend_stub: - jmp _objc_msgSend diff --git a/runtime/Messengers.subproj/objc-msg-stub.s b/runtime/Messengers.subproj/objc-msg-stub.s deleted file mode 100644 index 2e1859c..0000000 --- a/runtime/Messengers.subproj/objc-msg-stub.s +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2004-2006 Apple Inc. All rights reserved. - * - * @APPLE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_LICENSE_HEADER_END@ - */ - -#import "../objc-config.h" - -#if defined (__i386__) || defined (i386) - #include "objc-msg-stub-i386.s" -#elif defined (__ppc__) || defined(ppc) - #include "objc-msg-stub-ppc.s" -#elif defined (__ppc64__) || defined(ppc64) - #include "objc-msg-stub-ppc64.s" -#elif defined (__x86_64__) - #include "objc-msg-stub-x86_64.s" -#else - #error Architecture not supported -#endif diff --git a/runtime/Messengers.subproj/objc-msg-win32.m b/runtime/Messengers.subproj/objc-msg-win32.m new file mode 100644 index 0000000..7fcc38e --- /dev/null +++ b/runtime/Messengers.subproj/objc-msg-win32.m @@ -0,0 +1,505 @@ +#include "objc-private.h" + +// out-of-band parameter to objc_msgForward +#define kFwdMsgSend 1 +#define kFwdMsgSendStret 0 + +// objc_msgSend parameters +#define self 4 +#define super 4 +#define selector 8 +#define first_arg 12 + +// objc_msgSend_stret parameters +#define struct_addr 4 +#define self_stret 8 +#define super_stret 8 +#define selector_stret 12 + +// objc_super parameter to sendSuper +#define super_receiver 0 +#define super_class 4 + +// struct objc_class fields +#define isa 0 +#define cache 32 + +// struct objc_method fields +#define method_name 0 +#define method_imp 8 + +// struct objc_cache fields +#define mask 0 +#define occupied 4 +#define buckets 8 + +void *_objc_forward_handler = NULL; +void *_objc_forward_stret_handler = NULL; + +__declspec(naked) Method _cache_getMethod(Class cls, SEL sel, IMP objc_msgForward_imp) +{ + __asm { + mov ecx, selector[esp] + mov edx, self[esp] + +// CacheLookup WORD_RETURN, CACHE_GET + push edi + mov edi, cache[edx] + + push esi + mov esi, mask[edi] + mov edx, ecx + shr edx, 2 +SCAN: + and edx, esi + mov eax, buckets[edi][edx*4] + test eax, eax + je MISS + cmp ecx, method_name[eax] + je HIT + add edx, 1 + jmp SCAN + +MISS: + xor eax, eax + pop esi + pop edi + ret + +HIT: + mov ecx, 8+first_arg[esp] + cmp ecx, method_imp[eax] + je MISS + pop esi + pop edi + ret + } +} + +__declspec(naked) IMP _cache_getImp(Class cls, SEL sel) +{ + __asm { + mov ecx, selector[esp] + mov edx, self[esp] + +// CacheLookup WORD_RETURN, CACHE_GET + push edi + mov edi, cache[edx] + + push esi + mov esi, mask[edi] + mov edx, ecx + shr edx, 2 +SCAN: + and edx, esi + mov eax, buckets[edi][edx*4] + test eax, eax + je MISS + cmp ecx, method_name[eax] + je HIT + add edx, 1 + jmp SCAN + +MISS: + pop esi + pop edi + xor eax, eax + ret + +HIT: + pop esi + pop edi + mov eax, method_imp[eax] + ret + + } +} + + +OBJC_EXPORT __declspec(naked) id objc_msgSend(id a, SEL b, ...) +{ + __asm { + // load receiver and selector + mov ecx, selector[esp] + mov eax, self[esp] + +#if !defined(NO_GC) + // check whether selector is ignored +#error oops +#endif + + // check whether receiver is nil + test eax, eax + je NIL + + // receiver (in eax) is non-nil: search the cache + mov edx, isa[eax] + + // CacheLookup WORD_RETURN, MSG_SEND + push edi + mov edi, cache[edx] + push esi + mov esi, mask[edi] + mov edx, ecx + shr edx, 2 +SCAN: + and edx, esi + mov eax, buckets[edi][edx*4] + test eax, eax + je MISS + cmp ecx, method_name[eax] + je HIT + add edx, 1 + jmp SCAN + +HIT: + mov eax, method_imp[eax] + pop esi + pop edi + mov edx, kFwdMsgSend + jmp eax + + // cache miss: search method lists +MISS: + pop esi + pop edi + mov eax, self[esp] + mov eax, isa[eax] + + // MethodTableLookup WORD_RETURN, MSG_SEND + sub esp, 4 + push ecx + push eax + call _class_lookupMethodAndLoadCache + add esp, 12 + + mov edx, kFwdMsgSend + jmp eax + + // message send to nil: return zero +NIL: + // eax is already zero + mov edx, 0 + ret + } +} + + +OBJC_EXPORT __declspec(naked) double objc_msgSend_fpret(id a, SEL b, ...) +{ + __asm { + // load receiver and selector + mov ecx, selector[esp] + mov eax, self[esp] + +#if !defined(NO_GC) + // check whether selector is ignored +#error oops +#endif + + // check whether receiver is nil + test eax, eax + je NIL + + // receiver (in eax) is non-nil: search the cache + mov edx, isa[eax] + + // CacheLookup WORD_RETURN, MSG_SEND + push edi + mov edi, cache[edx] + push esi + mov esi, mask[edi] + mov edx, ecx + shr edx, 2 +SCAN: + and edx, esi + mov eax, buckets[edi][edx*4] + test eax, eax + je MISS + cmp ecx, method_name[eax] + je HIT + add edx, 1 + jmp SCAN + +HIT: + mov eax, method_imp[eax] + pop esi + pop edi + mov edx, kFwdMsgSend + jmp eax + + // cache miss: search method lists +MISS: + pop esi + pop edi + mov eax, self[esp] + mov eax, isa[eax] + + // MethodTableLookup WORD_RETURN, MSG_SEND + sub esp, 4 + push ecx + push eax + call _class_lookupMethodAndLoadCache + add esp, 12 + + mov edx, kFwdMsgSend + jmp eax + + // message send to nil: return zero +NIL: + fldz + ret + } +} + + +OBJC_EXPORT __declspec(naked) id objc_msgSendSuper(struct objc_super *a, SEL b, ...) +{ + __asm { + // load class and selector + mov eax, super[esp] + mov ecx, selector[esp] + mov edx, super_class[eax] + +#if !defined(NO_GC) + // check whether selector is ignored +#error oops +#endif + + // search the cache (class in edx) + // CacheLookup WORD_RETURN, MSG_SENDSUPER + push edi + mov edi, cache[edx] + push esi + mov esi, mask[edi] + mov edx, ecx + shr edx, 2 +SCAN: + and edx, esi + mov eax, buckets[edi][edx*4] + test eax, eax + je MISS + cmp ecx, method_name[eax] + je HIT + add edx, 1 + jmp SCAN + +HIT: + mov eax, method_imp[eax] + pop esi + pop edi + mov edx, super[esp] + mov edx, super_receiver[edx] + mov super[esp], edx + mov edx, kFwdMsgSend + jmp eax + + // cache miss: search method lists +MISS: + + pop esi + pop edi + mov edx, super[esp] + mov eax, super_receiver[edx] + mov super[esp], eax + mov eax, super_class[edx] + + // MethodTableLookup WORD_RETURN, MSG_SENDSUPER + sub esp, 4 + push ecx + push eax + call _class_lookupMethodAndLoadCache + add esp, 12 + + mov edx, kFwdMsgSend + jmp eax + } +} + + +OBJC_EXPORT __declspec(naked) void objc_msgSend_stret(void) +{ + __asm { + // load receiver and selector + mov ecx, selector_stret[esp] + mov eax, self_stret[esp] + +#if !defined(NO_GC) + // check whether selector is ignored +#error oops +#endif + + // check whether receiver is nil + test eax, eax + je NIL + + // receiver (in eax) is non-nil: search the cache + mov edx, isa[eax] + + // CacheLookup WORD_RETURN, MSG_SEND + push edi + mov edi, cache[edx] + push esi + mov esi, mask[edi] + mov edx, ecx + shr edx, 2 +SCAN: + and edx, esi + mov eax, buckets[edi][edx*4] + test eax, eax + je MISS + cmp ecx, method_name[eax] + je HIT + add edx, 1 + jmp SCAN + +HIT: + mov eax, method_imp[eax] + pop esi + pop edi + mov edx, kFwdMsgSendStret + jmp eax + + // cache miss: search method lists +MISS: + pop esi + pop edi + mov eax, self_stret[esp] + mov eax, isa[eax] + + // MethodTableLookup WORD_RETURN, MSG_SEND + sub esp, 4 + push ecx + push eax + call _class_lookupMethodAndLoadCache + add esp, 12 + + mov edx, kFwdMsgSendStret + jmp eax + + // message send to nil: return zero +NIL: + // eax is already zero + mov edx, 0 + ret + } +} + + +OBJC_EXPORT __declspec(naked) id objc_msgSendSuper_stret(struct objc_super *a, SEL b, ...) +{ + __asm { + // load class and selector + mov eax, super_stret[esp] + mov ecx, selector_stret[esp] + mov edx, super_class[eax] + +#if !defined(NO_GC) + // check whether selector is ignored +#error oops +#endif + + // search the cache (class in edx) + // CacheLookup WORD_RETURN, MSG_SENDSUPER + push edi + mov edi, cache[edx] + push esi + mov esi, mask[edi] + mov edx, ecx + shr edx, 2 +SCAN: + and edx, esi + mov eax, buckets[edi][edx*4] + test eax, eax + je MISS + cmp ecx, method_name[eax] + je HIT + add edx, 1 + jmp SCAN + +HIT: + mov eax, method_imp[eax] + pop esi + pop edi + mov edx, super[esp] + mov edx, super_receiver[edx] + mov super[esp], edx + mov edx, kFwdMsgSendStret + jmp eax + + // cache miss: search method lists +MISS: + + pop esi + pop edi + mov edx, super_stret[esp] + mov eax, super_receiver[edx] + mov super_stret[esp], eax + mov eax, super_class[edx] + + // MethodTableLookup WORD_RETURN, MSG_SENDSUPER + sub esp, 4 + push ecx + push eax + call _class_lookupMethodAndLoadCache + add esp, 12 + + mov edx, kFwdMsgSendStret + jmp eax + } +} + + +OBJC_EXPORT __declspec(naked) id _objc_msgForward(id a, SEL b, ...) +{ + __asm { + mov ecx, _objc_forward_handler + // forward:: support omitted here + jmp ecx + } +} + +OBJC_EXPORT __declspec(naked) id _objc_msgForward_stret(id a, SEL b, ...) +{ + __asm { + mov ecx, _objc_forward_stret_handler + // forward:: support omitted here + jmp ecx + } +} + + +__declspec(naked) id _objc_msgForward_internal(id a, SEL b, ...) +{ + __asm { + cmp edx, kFwdMsgSendStret + je STRET + jmp _objc_msgForward +STRET: + jmp _objc_msgForward_stret + } +} + + +OBJC_EXPORT __declspec(naked) void method_invoke(void) +{ + __asm { + mov ecx, selector[esp] + mov edx, method_name[ecx] + mov eax, method_imp[ecx] + mov selector[esp], edx + jmp eax + } +} + + +OBJC_EXPORT __declspec(naked) void method_invoke_stret(void) +{ + __asm { + mov ecx, selector_stret[esp] + mov edx, method_name[ecx] + mov eax, method_imp[ecx] + mov selector_stret[esp], edx + jmp eax + } +} diff --git a/runtime/Messengers.subproj/objc-msg-x86_64.s b/runtime/Messengers.subproj/objc-msg-x86_64.s index a74f421..da3c2f2 100644 --- a/runtime/Messengers.subproj/objc-msg-x86_64.s +++ b/runtime/Messengers.subproj/objc-msg-x86_64.s @@ -20,6 +20,9 @@ * * @APPLE_LICENSE_HEADER_END@ */ + +#ifdef __x86_64__ + /******************************************************************** ******************************************************************** ** @@ -116,8 +119,8 @@ _objc_exitPoints: // Cache header mask = 0 - occupied = 4 - buckets = 8 // variable length array + occupied = 8 + buckets = 16 // variable length array // typedef struct { // uint128_t floatingPointArgs[8]; // xmm0..xmm7 @@ -131,22 +134,6 @@ _objc_exitPoints: #define STACK_AREA (REG_AREA+6*8) -#if defined(OBJC_INSTRUMENTED) -// Cache instrumentation data, follows buckets - hitCount = 0 - hitProbes = hitCount + 4 - maxHitProbes = hitProbes + 4 - missCount = maxHitProbes + 4 - missProbes = missCount + 4 - maxMissProbes = missProbes + 4 - flushCount = maxMissProbes + 4 - flushedEntries = flushCount + 4 - -// Buckets in CacheHitHistogram and CacheMissHistogram - CACHE_HISTOGRAM_SIZE = 512 -#endif - - ////////////////////////////////////////////////////////////////////// // // ENTRY functionName @@ -176,25 +163,145 @@ $0: .macro END_ENTRY .endmacro -////////////////////////////////////////////////////////////////////// -// -// CALL_MCOUNTER -// -// Calls mcount() profiling routine. Must be called immediately on -// function entry, before any prologue executes. -// -////////////////////////////////////////////////////////////////////// -.macro CALL_MCOUNTER -#ifdef PROFILE - // Current stack contents: ret - pushq %rbp - movq %rsp,%rbp - // Current stack contents: ret, rbp - call mcount - movq %rbp,%rsp - popq %rbp -#endif +/* DWARF support + These macros work for objc_msgSend variants and others that call + CacheLookup/MethodTableLookup or SaveRegisters/RestoreRegisters + without otherwise building a frame or clobbering callee-save registers + + The macros build appropriate FDEs and tie them to the CIE. +*/ + +#define DW_CFA_offset 0x80 +#define DW_CFA_restore 0xc0 +#define DW_CFA_advance_loc4 0x4 +#define DW_CFA_same_value 0x8 +#define DW_CFA_def_cfa 0xc +#define DW_CFA_def_cfa_register 0xd +#define DW_CFA_def_cfa_offset 0xe +#define DW_CFA_offset_extended_sf 0x11 +#define DW_CFA_def_cfa_offset_sf 0x13 +#define DW_rax 0 +#define DW_rdx 1 +#define DW_rcx 2 +#define DW_rsi 4 +#define DW_rdi 5 +#define DW_rbp 6 +#define DW_rsp 7 +#define DW_r8 8 +#define DW_r9 9 +#define DW_r10 10 +#define DW_ra 16 +#define DW_xmm0 17 +#define DW_xmm1 18 +#define DW_xmm2 19 +#define DW_xmm3 20 +#define DW_xmm4 21 +#define DW_xmm5 22 +#define DW_xmm6 23 +#define DW_xmm7 24 +#define DW_a1 DW_rdi +#define DW_a2 DW_rsi +#define DW_a3 DW_rdx +#define DW_a4 DW_rcx +#define DW_a5 DW_r8 +#define DW_a6 DW_r9 + +// CIE +// 8-byte data multiplier +// 1-byte insn multiplier +// PC-relative everything +// No prologue + + .section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support +CIE: + .set L$set$0,LECIE1-LSCIE1 + .long L$set$0 # Length of Common Information Entry +LSCIE1: + .long 0 # CIE Identifier Tag + .byte 0x3 # CIE Version + .ascii "zPR\0" # CIE Augmentation: size + personality + FDE encoding + .byte 0x1 # uleb128 0x1; CIE Code Alignment Factor + .byte 0x78 # sleb128 -0x8; CIE Data Alignment Factor + .byte 0x10 # CIE RA Column + .byte 0x6 # uleb128 0x1; Augmentation size + // Personality augmentation + .byte 0x9b + .long ___objc_personality_v0+4@GOTPCREL + // FDE-encoding augmentation + .byte 0x10 + // Prefix instructions + // CFA is %rsp+8 + .byte DW_CFA_def_cfa + .byte DW_rsp + .byte 8 + // RA is at 0(%rsp) aka -8(CFA) + .byte DW_CFA_offset | DW_ra + .byte 1 + + .align 3 +LECIE1: + + +.macro EMIT_FDE + + .section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support + +// FDE header +.globl $0.eh +$0.eh: +LSFDE$0: + .set LLENFDE$0, LEFDE$0-LASFDE$0 + .long LLENFDE$0 # FDE Length +LASFDE$0: + .long LASFDE$0-CIE # FDE CIE offset + .quad LF0$0-. # FDE address start + .quad LLEN$0 # FDE address range + .byte 0x0 # uleb128 0x0; Augmentation size + + // DW_START: set by CIE + +.if $2 == 1 + + // pushq %rbp + .byte DW_CFA_advance_loc4 + .long LFLEN0$0+1 + .byte DW_CFA_def_cfa_offset + .byte 16 + .byte DW_CFA_offset | DW_rbp + .byte -16/-8 + // movq %rsp, %rbp + .byte DW_CFA_advance_loc4 + .long 3 + .byte DW_CFA_def_cfa_register + .byte DW_rbp + +.endif + + .align 3 +LEFDE$0: + .text + +.endmacro + + +.macro DW_START +LF0$0: +.endmacro + +.macro DW_FRAME +LF1$0: + .set LFLEN0$0, LF1$0-LF0$0 +.endmacro + +.macro DW_END + .set LLEN$0, .-LF0$0 + EMIT_FDE $0, LLEN$0, 1 +.endmacro + +.macro DW_END2 + .set LLEN$0, .-LF0$0 + EMIT_FDE $0, LLEN$0, 2 .endmacro @@ -213,53 +320,37 @@ $0: // %rsp is 16-byte aligned // ///////////////////////////////////////////////////////////////////// -/* - * old->ret 0 +208 - * 16 ->rbp -8 +200 - * a6 -16 +192 - * a5 -24 +184 - * a4 -32 +176 - * a3 -40 +168 - * a2 -48 +160 - * a1 -56 +152 - * rax -64 +144 - * r10 -72 +136 - * pad -80 +128 - * xmm7 -88 +112 - * xmm6 -104 +96 - * xmm5 -120 +80 - * xmm4 -136 +64 - * xmm3 -152 +48 - * xmm2 -168 +32 - * xmm1 -184 +16 - * new->xmm0 -200 +0 - */ + .macro SaveRegisters .if $0 == 0 - movq %a6, -16(%rsp) - movq %a5, -24(%rsp) movq %a4, -32(%rsp) + movq %a5, -24(%rsp) + movq %a6, -16(%rsp) .else // a4-a6 already saved by CacheLookup .endif - movq %a3, -40(%rsp) - movq %a2, -48(%rsp) - movq %a1, -56(%rsp) - movq %rax, -64(%rsp) // might be xmm parameter count - movq %r10, -72(%rsp) // fixme needed? - // movq pad, -80(%rsp) - - subq $$ 128+88, %rsp - - // stack is now 16-byte aligned - movdqa %xmm0, 0(%rsp) - movdqa %xmm1, 16(%rsp) - movdqa %xmm2, 32(%rsp) - movdqa %xmm3, 48(%rsp) - movdqa %xmm4, 64(%rsp) - movdqa %xmm5, 80(%rsp) - movdqa %xmm6, 96(%rsp) - movdqa %xmm7, 112(%rsp) + + DW_FRAME $1 + pushq %rbp + movq %rsp, %rbp + subq $$ 128+64, %rsp + + movdqa %xmm0, -192(%rbp) + movdqa %xmm1, -176(%rbp) + movdqa %xmm2, -160(%rbp) + movdqa %xmm3, -144(%rbp) + movdqa %xmm4, -128(%rbp) + movdqa %xmm5, -112(%rbp) + movdqa %xmm6, -96(%rbp) + movdqa %xmm7, -80(%rbp) + movq %r10, -64(%rbp) // fixme needed? + movq %rax, -56(%rbp) // might be xmm parameter count + movq %a1, -48(%rbp) + movq %a2, -40(%rbp) + movq %a3, -32(%rbp) + // movq %a4, -24(%rbp) + // movq %a5, -16(%rbp) + // movq %a6, -8(%rbp) .endmacro ///////////////////////////////////////////////////////////////////// @@ -269,7 +360,7 @@ $0: // Pops a stack frame pushed by SaveRegisters // // On entry: -// %rsp is unchanged since SaveRegisters +// %rbp unchanged since SaveRegisters // // On exit: // stack = ret @@ -277,39 +368,37 @@ $0: ///////////////////////////////////////////////////////////////////// .macro RestoreRegisters - movdqa 0(%rsp), %xmm0 - movdqa 16(%rsp), %xmm1 - movdqa 32(%rsp), %xmm2 - movdqa 48(%rsp), %xmm3 - movdqa 64(%rsp), %xmm4 - movdqa 80(%rsp), %xmm5 - movdqa 96(%rsp), %xmm6 - movdqa 112(%rsp), %xmm7 - - addq $$ 128+88, %rsp - - movq -16(%rsp), %a6 - movq -24(%rsp), %a5 - movq -32(%rsp), %a4 - movq -40(%rsp), %a3 - movq -48(%rsp), %a2 - movq -56(%rsp), %a1 - movq -64(%rsp), %rax - movq -72(%rsp), %r10 - // movq -80(%rsp), pad + movdqa -192(%rbp), %xmm0 + movdqa -176(%rbp), %xmm1 + movdqa -160(%rbp), %xmm2 + movdqa -144(%rbp), %xmm3 + movdqa -128(%rbp), %xmm4 + movdqa -112(%rbp), %xmm5 + movdqa -96(%rbp), %xmm6 + movdqa -80(%rbp), %xmm7 + movq -64(%rbp), %r10 + movq -56(%rbp), %rax + movq -48(%rbp), %a1 + movq -40(%rbp), %a2 + movq -32(%rbp), %a3 + movq -24(%rbp), %a4 + movq -16(%rbp), %a5 + movq -8(%rbp), %a6 + movq %rbp, %rsp + popq %rbp .endmacro ///////////////////////////////////////////////////////////////////// // // -// CacheLookup selectorRegister, cacheMissLabel, name +// CacheLookup selectorRegister, cacheMissLabel // // Locate the implementation for a selector in a class method cache. // // Takes: // $0 = register containing selector (%a1 or %a2 ONLY) -// cacheMissLabel = label to branch to iff method is not cached +// $1 = if method is not cached then jmp LCacheMiss$1 // %r11 = class whose cache is to be searched // stack = ret // @@ -328,16 +417,9 @@ $0: movq %a5, -24(%rsp) movq %a6, -16(%rsp) - movq cache(%r11), %a4 // cache = class->cache - -#if defined(OBJC_INSTRUMENTED) - pushl %ebx // save non-volatile register - pushl %eax // save cache pointer - xorl %ebx, %ebx // probeCount = 0 -#endif + movq cache(%r11), %a5 // cache = class->cache - leaq buckets(%a4), %a5 // buckets = &cache->buckets - movl mask(%a4), %a6d + movl mask(%a5), %a6d shlq $$3, %a6 // %a6 = cache->mask << 3 mov $0, %a4 // bytes = sel andq %a6, %a4 // bytes &= (mask << 3) @@ -345,20 +427,13 @@ $0: // search the receiver's cache // r11 = method (soon) // a4 = bytes -// a5 = buckets +// a5 = cache // a6 = mask << 3 // $0 = sel LMsgSendProbeCache_$1: -#if defined(OBJC_INSTRUMENTED) - addl $$1, %ebx // probeCount += 1 -#endif - movq (%a5, %a4, 1), %r11 // method = buckets[bytes/8] + movq buckets(%a5, %a4), %r11 // method = cache->buckets[bytes/8] testq %r11, %r11 // if (method == NULL) -#if defined(OBJC_INSTRUMENTED) - je LMsgSendCacheMiss_$1 -#else - je $1 // goto cacheMissLabel -#endif + je LCacheMiss$1 // goto cacheMissLabel addq $$8, %a4 // bytes += 8 andq %a6, %a4 // bytes &= (mask << 3) @@ -366,110 +441,18 @@ LMsgSendProbeCache_$1: jne LMsgSendProbeCache_$1 // goto loop // cache hit, r11 = method triplet -#if defined(OBJC_INSTRUMENTED) - jmp LMsgSendInstrumentCacheHit_$1 -LMsgSendCacheHit2_$1: -#endif // restore saved registers movq -32(%rsp), %a4 movq -24(%rsp), %a5 movq -16(%rsp), %a6 - // Done. Only instrumentation follows. - -#if defined(OBJC_INSTRUMENTED) - jmp LMsgSendCacheDone_$1 - -LMsgSendInstrumentCacheHit_$1: - popl %edx // retrieve cache pointer - movl mask(%edx), %esi // mask = cache->mask - testl %esi, %esi // a mask of zero is only for the... - je LMsgSendHitInstrumentDone_$1 // ... emptyCache, do not record anything - - // locate and update the CacheInstrumentation structure - addl $$1, %esi // entryCount = mask + 1 - shll $$2, %esi // tableSize = entryCount * sizeof(entry) - addl $buckets, %esi // offset = buckets + tableSize - addl %edx, %esi // cacheData = &cache->buckets[mask+1] - - movl hitCount(%esi), %edi - addl $$1, %edi - movl %edi, hitCount(%esi) // cacheData->hitCount += 1 - movl hitProbes(%esi), %edi - addl %ebx, %edi - movl %edi, hitProbes(%esi) // cacheData->hitProbes += probeCount - movl maxHitProbes(%esi), %edi// if (cacheData->maxHitProbes < probeCount) - cmpl %ebx, %edi - jge LMsgSendMaxHitProbeOK_$1 - movl %ebx, maxHitProbes(%esi)// cacheData->maxHitProbes = probeCount -LMsgSendMaxHitProbeOK_$1: - - // update cache hit probe histogram - cmpl $CACHE_HISTOGRAM_SIZE, %ebx // pin probeCount to max index - jl LMsgSendHitHistoIndexSet_$1 - movl $(CACHE_HISTOGRAM_SIZE-1), %ebx -LMsgSendHitHistoIndexSet_$1: - LEA_STATIC_DATA %esi, _CacheHitHistogram, EXTERNAL_SYMBOL - shll $$2, %ebx // convert probeCount to histogram index - addl %ebx, %esi // calculate &CacheHitHistogram[probeCount<<2] - movl 0(%esi), %edi // get current tally - addl $$1, %edi // - movl %edi, 0(%esi) // tally += 1 -LMsgSendHitInstrumentDone_$1: - popl %ebx // restore non-volatile register - jmp LMsgSendCacheHit2_$1 - - -LMsgSendCacheMiss_$1: - popl %edx // retrieve cache pointer - movl mask(%edx), %esi // mask = cache->mask - testl %esi, %esi // a mask of zero is only for the... - je LMsgSendMissInstrumentDone_$1 // ... emptyCache, do not record anything - - // locate and update the CacheInstrumentation structure - addl $$1, %esi // entryCount = mask + 1 - shll $$2, %esi // tableSize = entryCount * sizeof(entry) - addl $buckets, %esi // offset = buckets + tableSize - addl %edx, %esi // cacheData = &cache->buckets[mask+1] - - movl missCount(%esi), %edi // - addl $$1, %edi // - movl %edi, missCount(%esi) // cacheData->missCount += 1 - movl missProbes(%esi), %edi // - addl %ebx, %edi // - movl %edi, missProbes(%esi) // cacheData->missProbes += probeCount - movl maxMissProbes(%esi), %edi// if (cacheData->maxMissProbes < probeCount) - cmpl %ebx, %edi // - jge LMsgSendMaxMissProbeOK_$1 // - movl %ebx, maxMissProbes(%esi)// cacheData->maxMissProbes = probeCount -LMsgSendMaxMissProbeOK_$1: - - // update cache miss probe histogram - cmpl $CACHE_HISTOGRAM_SIZE, %ebx // pin probeCount to max index - jl LMsgSendMissHistoIndexSet_$1 - movl $(CACHE_HISTOGRAM_SIZE-1), %ebx -LMsgSendMissHistoIndexSet_$1: - LEA_STATIC_DATA %esi, _CacheMissHistogram, EXTERNAL_SYMBOL - shll $$2, %ebx // convert probeCount to histogram index - addl %ebx, %esi // calculate &CacheMissHistogram[probeCount<<2] - movl 0(%esi), %edi // get current tally - addl $$1, %edi // - movl %edi, 0(%esi) // tally += 1 -LMsgSendMissInstrumentDone_$1: - popl %ebx // restore non-volatile register - jmp $0 - -LMsgSendCacheDone_$1: -#endif - - .endmacro ///////////////////////////////////////////////////////////////////// // -// MethodTableLookup classRegister, selectorRegister +// MethodTableLookup classRegister, selectorRegister, fn // // Takes: $0 = class to search (%a1 or %a2 or %r11 ONLY) // $1 = selector to search for (%a2 or %a3 ONLY) @@ -482,7 +465,7 @@ LMsgSendCacheDone_$1: ///////////////////////////////////////////////////////////////////// .macro MethodTableLookup - SaveRegisters 1 + SaveRegisters 1, $2 // _class_lookupMethodAndLoadCache(class, selector) movq $0, %a1 @@ -492,49 +475,53 @@ LMsgSendCacheDone_$1: // IMP is now in %rax movq %rax, %r11 - RestoreRegisters + RestoreRegisters $2 .endmacro /******************************************************************** - * Method _cache_getMethod(Class cls, SEL sel, IMP objc_msgForward_imp) + * Method _cache_getMethod(Class cls, SEL sel, IMP msgForward_internal_imp) * * On entry: a1 = class whose cache is to be searched * a2 = selector to search for - * a3 = _objc_msgForward IMP + * a3 = _objc_msgForward_internal IMP * * If found, returns method triplet pointer. * If not found, returns NULL. * * NOTE: _cache_getMethod never returns any cache entry whose implementation - * is _objc_msgForward. It returns NULL instead. This prevents thread- - * safety and memory management bugs in _class_lookupMethodAndLoadCache. + * is _objc_msgForward_internal. It returns 1 instead. This prevents thread- + * thread-safety and memory management bugs in _class_lookupMethodAndLoadCache. * See _class_lookupMethodAndLoadCache for details. * - * _objc_msgForward is passed as a parameter because it's more efficient - * to do the (PIC) lookup once in the caller than repeatedly here. + * _objc_msgForward_internal is passed as a parameter because it's more + * efficient to do the (PIC) lookup once in the caller than repeatedly here. ********************************************************************/ ENTRY __cache_getMethod + DW_START __cache_getMethod // do lookup movq %a1, %r11 // move class to r11 for CacheLookup - CacheLookup %a2, LGetMethodMiss + CacheLookup %a2, __cache_getMethod // cache hit, method triplet in %r11 - cmpq method_imp(%r11), %a3 // if (imp == _objc_msgForward) - je LGetMethodMiss // return nil + cmpq method_imp(%r11), %a3 // if (imp==_objc_msgForward_internal) + je 1f // return (Method)1 movq %r11, %rax // return method triplet address ret +1: movq $1, %rax + ret -LGetMethodMiss: +LCacheMiss__cache_getMethod: // cache miss, return nil xorq %rax, %rax // erase %rax ret LGetMethodExit: - END_ENTRY __cache_getMethod + DW_END2 __cache_getMethod + END_ENTRY __cache_getMethod /******************************************************************** @@ -548,22 +535,24 @@ LGetMethodExit: ********************************************************************/ ENTRY __cache_getImp + DW_START __cache_getImp // do lookup movq %a1, %r11 // move class to r11 for CacheLookup - CacheLookup %a2, LGetImpMiss + CacheLookup %a2, __cache_getImp // cache hit, method triplet in %r11 movq method_imp(%r11), %rax // return method imp address ret -LGetImpMiss: +LCacheMiss__cache_getImp: // cache miss, return nil xorq %rax, %rax // erase %rax ret LGetImpExit: - END_ENTRY __cache_getImp + DW_END2 __cache_getImp + END_ENTRY __cache_getImp /******************************************************************** @@ -573,7 +562,7 @@ LGetImpExit: ********************************************************************/ ENTRY _objc_msgSend - CALL_MCOUNTER + DW_START _objc_msgSend // check whether selector is ignored cmpq $ kIgnore, %a2 @@ -586,15 +575,17 @@ LGetImpExit: // receiver (in %a1) is non-nil: search the cache LMsgSendReceiverOk: movq isa(%a1), %r11 // class = self->isa - CacheLookup %a2, LMsgSendCacheMiss + CacheLookup %a2, _objc_msgSend // CacheLookup placed method in r11 movq method_imp(%r11), %r11 + cmp %r11, %r11 // set nonstret (eq) for forwarding jmp *%r11 // goto *imp // cache miss: go search the method lists -LMsgSendCacheMiss: - MethodTableLookup isa(%a1), %a2 +LCacheMiss_objc_msgSend: + MethodTableLookup isa(%a1), %a2, _objc_msgSend // MethodTableLookup placed IMP in r11 + cmp %r11, %r11 // set nonstret (eq) for forwarding jmp *%r11 // goto *imp // message sent to nil: redirect to nil receiver, if any @@ -615,15 +606,24 @@ LMsgSendReturnSelf: ret LMsgSendExit: + DW_END _objc_msgSend END_ENTRY _objc_msgSend #if __OBJC2__ ENTRY _objc_msgSend_fixup + DW_START _objc_msgSend_fixup testq %a1, %a1 je LMsgSendFixupNilSelf - SaveRegisters 0 + SaveRegisters 0, _objc_msgSend_fixup + + // Dereference obj/isa/cache to crash before _objc_fixupMessageRef + movq 8(%a2), %r11 // selector + movq isa(%a1), %a6 // isa = *receiver + movq cache(%a6), %a5 // cache = *isa + movq mask(%a5), %a4 // *cache + // a1 = receiver // a2 = address of message ref movq %a2, %a3 @@ -631,11 +631,13 @@ LMsgSendExit: // __objc_fixupMessageRef(receiver, 0, ref) call __objc_fixupMessageRef movq %rax, %r11 - RestoreRegisters + + RestoreRegisters _objc_msgSend_fixup // imp is in r11 // Load _cmd from the message_ref movq 8(%a2), %a2 + cmp %r11, %r11 // set nonstret (eq) for forwarding jmp *%r11 LMsgSendFixupNilSelf: @@ -646,7 +648,8 @@ LMsgSendFixupNilSelf: xorps %xmm1, %xmm1 ret - END_ENTRY _objc_msgSend_fixup + DW_END _objc_msgSend_fixup + END_ENTRY _objc_msgSend_fixup ENTRY _objc_msgSend_fixedup @@ -668,7 +671,7 @@ LMsgSendFixupNilSelf: ********************************************************************/ ENTRY _objc_msgSendSuper - CALL_MCOUNTER + DW_START _objc_msgSendSuper // check whether selector is ignored cmpq $ kIgnore, %a2 @@ -676,17 +679,19 @@ LMsgSendFixupNilSelf: // search the cache (objc_super in %a1) movq class(%a1), %r11 // class = objc_super->class - CacheLookup %a2, LMsgSendSuperCacheMiss + CacheLookup %a2, _objc_msgSendSuper // CacheLookup placed method in r11 movq method_imp(%r11), %r11 movq receiver(%a1), %a1 // load real receiver + cmp %r11, %r11 // set nonstret (eq) for forwarding jmp *%r11 // goto *imp // cache miss: go search the method lists -LMsgSendSuperCacheMiss: - MethodTableLookup class(%a1), %a2 +LCacheMiss_objc_msgSendSuper: + MethodTableLookup class(%a1), %a2, _objc_msgSendSuper // MethodTableLookup placed IMP in r11 movq receiver(%a1), %a1 // load real receiver + cmp %r11, %r11 // set nonstret (eq) for forwarding jmp *%r11 // goto *imp LMsgSendSuperReturnSelf: @@ -694,12 +699,14 @@ LMsgSendSuperReturnSelf: ret LMsgSendSuperExit: + DW_END _objc_msgSendSuper END_ENTRY _objc_msgSendSuper #if __OBJC2__ ENTRY _objc_msgSendSuper2_fixup + DW_START _objc_msgSendSuper2_fixup - SaveRegisters 0 + SaveRegisters 0, _objc_msgSendSuper2_fixup // a1 = address of objc_super2 // a2 = address of message ref movq %a2, %a3 @@ -708,16 +715,18 @@ LMsgSendSuperExit: // __objc_fixupMessageRef(receiver, objc_super, ref) call __objc_fixupMessageRef movq %rax, %r11 - RestoreRegisters + RestoreRegisters _objc_msgSendSuper2_fixup // imp is in r11 // Load _cmd from the message_ref movq 8(%a2), %a2 // Load receiver from objc_super2 movq receiver(%a1), %a1 + cmp %r11, %r11 // set nonstret (eq) for forwarding jmp *%r11 - END_ENTRY _objc_msgSendSuper2_fixup + DW_END _objc_msgSendSuper2_fixup + END_ENTRY _objc_msgSendSuper2_fixup ENTRY _objc_msgSendSuper2_fixedup @@ -729,6 +738,16 @@ LMsgSendSuperExit: // objc_super->class is now the class to search jmp _objc_msgSendSuper END_ENTRY _objc_msgSendSuper2_fixedup + + + ENTRY _objc_msgSendSuper2 + // objc_super->class is superclass of class to search + movq class(%a1), %r11 // cls = objc_super->class + movq 8(%r11), %r11 // cls = cls->superclass + movq %r11, class(%a1) + // objc_super->class is now the class to search + jmp _objc_msgSendSuper + END_ENTRY _objc_msgSendSuper2 #endif @@ -740,7 +759,7 @@ LMsgSendSuperExit: ********************************************************************/ ENTRY _objc_msgSend_fpret - CALL_MCOUNTER + DW_START _objc_msgSend_fpret // check whether selector is ignored cmpq $ kIgnore, %a2 @@ -753,15 +772,17 @@ LMsgSendSuperExit: // receiver (in %a1) is non-nil: search the cache LMsgSendFpretReceiverOk: movq isa(%a1), %r11 // class = self->isa - CacheLookup %a2, LMsgSendFpretCacheMiss + CacheLookup %a2, _objc_msgSend_fpret // CacheLookup placed method in r11 movq method_imp(%r11), %r11 + cmp %r11, %r11 // set nonstret (eq) for forwarding jmp *%r11 // goto *imp // cache miss: go search the method lists -LMsgSendFpretCacheMiss: - MethodTableLookup isa(%a1), %a2 +LCacheMiss_objc_msgSend_fpret: + MethodTableLookup isa(%a1), %a2, _objc_msgSend_fpret // MethodTableLookup placed IMP in r11 + cmp %r11, %r11 // set nonstret (eq) for forwarding jmp *%r11 // goto *imp // message sent to nil: redirect to nil receiver, if any @@ -781,15 +802,24 @@ LMsgSendFpretReturnZero: ret LMsgSendFpretExit: + DW_END _objc_msgSend_fpret END_ENTRY _objc_msgSend_fpret #if __OBJC2__ ENTRY _objc_msgSend_fpret_fixup + DW_START _objc_msgSend_fpret_fixup testq %a1, %a1 je LMsgSendFpretFixupNilSelf - SaveRegisters 0 + SaveRegisters 0, _objc_msgSend_fpret_fixup + + // Dereference obj/isa/cache to crash before _objc_fixupMessageRef + movq 8(%a2), %r11 // selector + movq isa(%a1), %a6 // isa = *receiver + movq cache(%a6), %a5 // cache = *isa + movq mask(%a5), %a4 // *cache + // a1 = receiver // a2 = address of message ref movq %a2, %a3 @@ -797,11 +827,13 @@ LMsgSendFpretExit: // __objc_fixupMessageRef(receiver, 0, ref) call __objc_fixupMessageRef movq %rax, %r11 - RestoreRegisters + + RestoreRegisters _objc_msgSend_fpret_fixup // imp is in r11 // Load _cmd from the message_ref movq 8(%a2), %a2 + cmp %r11, %r11 // set nonstret (eq) for forwarding jmp *%r11 LMsgSendFpretFixupNilSelf: @@ -814,7 +846,8 @@ LMsgSendFpretFixupNilSelf: xorps %xmm1, %xmm1 ret - END_ENTRY _objc_msgSend_fpret_fixup + DW_END _objc_msgSend_fpret_fixup + END_ENTRY _objc_msgSend_fpret_fixup ENTRY _objc_msgSend_fpret_fixedup @@ -833,7 +866,7 @@ LMsgSendFpretFixupNilSelf: ********************************************************************/ ENTRY _objc_msgSend_fp2ret - CALL_MCOUNTER + DW_START _objc_msgSend_fp2ret // check whether selector is ignored cmpq $ kIgnore, %a2 @@ -846,15 +879,17 @@ LMsgSendFpretFixupNilSelf: // receiver (in %a1) is non-nil: search the cache LMsgSendFp2retReceiverOk: movq isa(%a1), %r11 // class = self->isa - CacheLookup %a2, LMsgSendFp2retCacheMiss + CacheLookup %a2, _objc_msgSend_fp2ret // CacheLookup placed method in r11 movq method_imp(%r11), %r11 + cmp %r11, %r11 // set nonstret (eq) for forwarding jmp *%r11 // goto *imp // cache miss: go search the method lists -LMsgSendFp2retCacheMiss: - MethodTableLookup isa(%a1), %a2 +LCacheMiss_objc_msgSend_fp2ret: + MethodTableLookup isa(%a1), %a2, _objc_msgSend_fp2ret // MethodTableLookup placed IMP in r11 + cmp %r11, %r11 // set nonstret (eq) for forwarding jmp *%r11 // goto *imp // message sent to nil: redirect to nil receiver, if any @@ -875,15 +910,24 @@ LMsgSendFp2retReturnZero: ret LMsgSendFp2retExit: + DW_END _objc_msgSend_fp2ret END_ENTRY _objc_msgSend_fp2ret #if __OBJC2__ ENTRY _objc_msgSend_fp2ret_fixup + DW_START _objc_msgSend_fp2ret_fixup testq %a1, %a1 je LMsgSendFp2retFixupNilSelf - SaveRegisters 0 + SaveRegisters 0, _objc_msgSend_fp2ret_fixup + + // Dereference obj/isa/cache to crash before _objc_fixupMessageRef + movq 8(%a2), %r11 // selector + movq isa(%a1), %a6 // isa = *receiver + movq cache(%a6), %a5 // cache = *isa + movq mask(%a5), %a4 // *cache + // a1 = receiver // a2 = address of message ref movq %a2, %a3 @@ -891,11 +935,13 @@ LMsgSendFp2retExit: // __objc_fixupMessageRef(receiver, 0, ref) call __objc_fixupMessageRef movq %rax, %r11 - RestoreRegisters + + RestoreRegisters _objc_msgSend_fp2ret_fixup // imp is in r11 // Load _cmd from the message_ref movq 8(%a2), %a2 + cmp %r11, %r11 // set nonstret (eq) for forwarding jmp *%r11 LMsgSendFp2retFixupNilSelf: @@ -909,7 +955,8 @@ LMsgSendFp2retFixupNilSelf: xorps %xmm1, %xmm1 ret - END_ENTRY _objc_msgSend_fp2ret_fixup + DW_END _objc_msgSend_fp2ret_fixup + END_ENTRY _objc_msgSend_fp2ret_fixup ENTRY _objc_msgSend_fp2ret_fixedup @@ -934,7 +981,7 @@ LMsgSendFp2retFixupNilSelf: ********************************************************************/ ENTRY _objc_msgSend_stret - CALL_MCOUNTER + DW_START _objc_msgSend_stret // check whether receiver is nil testq %a2, %a2 @@ -943,19 +990,18 @@ LMsgSendFp2retFixupNilSelf: // receiver (in %a2) is non-nil: search the cache LMsgSendStretReceiverOk: movq isa(%a2), %r11 // class = self->isa - CacheLookup %a3, LMsgSendStretCacheMiss + CacheLookup %a3, _objc_msgSend_stret // CacheLookup placed method in %r11 movq method_imp(%r11), %r11 -LMsgSendStretCallImp: - cmpq %r11, L_objc_msgForward(%rip) // if imp == _objc_msgForward - je __objc_msgForward_stret // call struct-returning fwd - jmp *%r11 // else goto *imp + test %r11, %r11 // set stret (ne) for forward; r11!=0 + jmp *%r11 // goto *imp // cache miss: go search the method lists -LMsgSendStretCacheMiss: - MethodTableLookup isa(%a2), %a3 +LCacheMiss_objc_msgSend_stret: + MethodTableLookup isa(%a2), %a3, _objc_msgSend_stret // MethodTableLookup placed IMP in r11 - jmp LMsgSendStretCallImp + test %r11, %r11 // set stret (ne) for forward; r11!=0 + jmp *%r11 // goto *imp // message sent to nil: redirect to nil receiver, if any LMsgSendStretNilSelf: @@ -965,15 +1011,24 @@ LMsgSendStretNilSelf: ret // else just return LMsgSendStretExit: + DW_END _objc_msgSend_stret END_ENTRY _objc_msgSend_stret #if __OBJC2__ ENTRY _objc_msgSend_stret_fixup + DW_START _objc_msgSend_stret_fixup testq %a2, %a2 je LMsgSendStretFixupNilSelf - SaveRegisters 0 + SaveRegisters 0, _objc_msgSend_stret_fixup + + // Dereference obj/isa/cache to crash before _objc_fixupMessageRef + movq 8(%a3), %r11 // selector + movq isa(%a2), %a6 // isa = *receiver + movq cache(%a6), %a5 // cache = *isa + movq mask(%a5), %a4 // *cache + // a2 = receiver // a3 = address of message ref movq %a2, %a1 @@ -981,19 +1036,20 @@ LMsgSendStretExit: // __objc_fixupMessageRef(receiver, 0, ref) call __objc_fixupMessageRef movq %rax, %r11 - RestoreRegisters + + RestoreRegisters _objc_msgSend_stret_fixup // imp is in r11 // Load _cmd from the message_ref movq 8(%a3), %a3 - cmpq %r11, L_objc_msgForward(%rip) // if imp == _objc_msgForward - je __objc_msgForward_stret // call struct-returning fwd - jmp *%r11 // else goto *imp + test %r11, %r11 // set stret (ne) for forward; r11!=0 + jmp *%r11 // goto *imp LMsgSendStretFixupNilSelf: ret - END_ENTRY _objc_msgSend_stret_fixup + DW_END _objc_msgSend_stret_fixup + END_ENTRY _objc_msgSend_stret_fixup ENTRY _objc_msgSend_stret_fixedup @@ -1024,50 +1080,52 @@ LMsgSendStretFixupNilSelf: ********************************************************************/ ENTRY _objc_msgSendSuper_stret - CALL_MCOUNTER + DW_START _objc_msgSendSuper_stret // search the cache (objc_super in %a2) movq class(%a2), %r11 // class = objc_super->class - CacheLookup %a3, LMsgSendSuperStretCacheMiss + CacheLookup %a3, _objc_msgSendSuper_stret // CacheLookup placed method in %r11 movq method_imp(%r11), %r11 -LMsgSendSuperStretCallImp: - movq receiver(%a2), %a2 // load real receiver - cmpq %r11, L_objc_msgForward(%rip) // if imp == _objc_msgForward - je __objc_msgForward_stret // call struct-returning fwd - jmp *%r11 // else goto *imp + movq receiver(%a2), %a2 // load real receiver + test %r11, %r11 // set stret (ne) for forward; r11!=0 + jmp *%r11 // goto *imp // cache miss: go search the method lists -LMsgSendSuperStretCacheMiss: - MethodTableLookup class(%a2), %a3 +LCacheMiss_objc_msgSendSuper_stret: + MethodTableLookup class(%a2), %a3, _objc_msgSendSuper_stret // MethodTableLookup placed IMP in r11 - jmp LMsgSendSuperStretCallImp + movq receiver(%a2), %a2 // load real receiver + test %r11, %r11 // set stret (ne) for forward; r11!=0 + jmp *%r11 // goto *imp LMsgSendSuperStretExit: + DW_END _objc_msgSendSuper_stret END_ENTRY _objc_msgSendSuper_stret #if __OBJC2__ ENTRY _objc_msgSendSuper2_stret_fixup + DW_START _objc_msgSendSuper2_stret_fixup - SaveRegisters 0 + SaveRegisters 0, _objc_msgSendSuper2_stret_fixup // a2 = address of objc_super2 // a3 = address of message ref movq receiver(%a2), %a1 // __objc_fixupMessageRef(receiver, objc_super, ref) call __objc_fixupMessageRef movq %rax, %r11 - RestoreRegisters + RestoreRegisters _objc_msgSendSuper2_stret_fixup // imp is in r11 // Load _cmd from the message_ref movq 8(%a3), %a3 // Load receiver from objc_super2 movq receiver(%a2), %a2 - cmpq %r11, L_objc_msgForward(%rip) // if imp == _objc_msgForward - je __objc_msgForward_stret // call struct-returning fwd - jmp *%r11 // else goto *imp + test %r11, %r11 // set stret (ne) for forward; r11!=0 + jmp *%r11 // goto *imp - END_ENTRY _objc_msgSendSuper2_stret_fixup + DW_END _objc_msgSendSuper2_stret_fixup + END_ENTRY _objc_msgSendSuper2_stret_fixup ENTRY _objc_msgSendSuper2_stret_fixedup @@ -1079,6 +1137,16 @@ LMsgSendSuperStretExit: // objc_super->class is now the class to search jmp _objc_msgSendSuper_stret END_ENTRY _objc_msgSendSuper2_stret_fixedup + + + ENTRY _objc_msgSendSuper2_stret + // objc_super->class is superclass of class to search + movq class(%a2), %r11 // cls = objc_super->class + movq 8(%r11), %r11 // cls = cls->superclass + movq %r11, class(%a2) + // objc_super->class is now the class to search + jmp _objc_msgSendSuper_stret + END_ENTRY _objc_msgSendSuper2_stret #endif @@ -1109,12 +1177,22 @@ __objc_forward_handler: .quad 0 .private_extern __objc_forward_stret_handler __objc_forward_stret_handler: .quad 0 - // GrP fixme don't know how to cmpq reg, _objc_msgForward -L_objc_msgForward: .quad __objc_msgForward - ENTRY __objc_msgForward + ENTRY __objc_msgForward_internal + .private_extern __objc_msgForward_internal + // Method cache version + + // THIS IS NOT A CALLABLE C FUNCTION + // Out-of-band condition register is NE for stret, EQ otherwise. - // Non-struct return only! + jne __objc_msgForward_stret + jmp __objc_msgForward + + END_ENTRY __objc_msgForward_internal + + + ENTRY __objc_msgForward + // Non-stret version // Call user handler, if any movq __objc_forward_handler(%rip), %r11 @@ -1189,7 +1267,8 @@ LMsgForwardError: ENTRY __objc_msgForward_stret - + // Struct-return version + // Call user handler, if any movq __objc_forward_stret_handler(%rip), %r11 testq %r11, %r11 // if (handler == NULL) @@ -1277,3 +1356,135 @@ LMsgForwardStretError: jmp *%r11 END_ENTRY _method_invoke_stret + + +/******************************************************************** + * + * id vtable_prototype(id self, message_ref *msg, ...) + * + * This code is copied to create vtable trampolines. + * The instruction following LvtableIndex is modified to + * insert each vtable index. + * + * This code is placed in its own section to prevent dtrace from + * instrumenting it. Otherwise, dtrace would insert an INT3, the + * code would be copied, and the copied INT3 would cause a crash. + * + ********************************************************************/ + +.macro VTABLE /* byte-offset, name */ + + .align 2 + .private_extern _$1 +_$1: + test %a1, %a1 + je LvtableReturnZero_$1 // nil check + movq 8(%a2), %a2 // load _cmd (fixme schedule?) + movq 0(%a1), %r10 // load isa + movq 24(%r10), %r11 // load vtable +LvtableIndex_$1: + movq $0 (%r11), %r10 // load imp (DO NOT CHANGE) + jmp *%r10 +LvtableReturnZero_$1: + // integer registers only; not used for fpret / stret / etc + movq $$0, %rax + movq $$0, %rdx + ret +LvtableEnd_$1: + nop + +.endmacro + + .section __TEXT,__objc_codegen,regular + VTABLE 0x7fff, vtable_prototype + + .data + .align 2 + .private_extern _vtable_prototype_size +_vtable_prototype_size: + .long LvtableEnd_vtable_prototype - _vtable_prototype + + .private_extern _vtable_prototype_index_offset +_vtable_prototype_index_offset: + .long LvtableIndex_vtable_prototype - _vtable_prototype + + +/******************************************************************** + * + * id vtable_ignored(id self, message_ref *msg, ...) + * + * Vtable trampoline for GC-ignored selectors. Immediately returns self. + * + ********************************************************************/ + + .text + .align 2 + .private_extern _vtable_ignored +_vtable_ignored: + movq %a1, %rax + ret + + +/******************************************************************** + * + * id objc_msgSend_vtable(id self, message_ref *msg, ...) + * + * Built-in expansions of vtable_prototype for the default vtable. + * + ********************************************************************/ + + .text + + .align 4 + .private_extern _defaultVtableTrampolineDescriptors +_defaultVtableTrampolineDescriptors: + // objc_trampoline_header + .short 16 // headerSize + .short 8 // descSize + .long 16 // descCount + .quad 0 // next + + // objc_trampoline_descriptor[16] +.macro TDESC /* n */ +L_tdesc$0: + .long _objc_msgSend_vtable$0 - L_tdesc$0 + .long (1<<0) + (1<<2) // MESSAGE and VTABLE +.endmacro + + TDESC 0 + TDESC 1 + TDESC 2 + TDESC 3 + TDESC 4 + TDESC 5 + TDESC 6 + TDESC 7 + TDESC 8 + TDESC 9 + TDESC 10 + TDESC 11 + TDESC 12 + TDESC 13 + TDESC 14 + TDESC 15 + + // trampoline code + .align 4 + VTABLE 0*8, objc_msgSend_vtable0 + VTABLE 1*8, objc_msgSend_vtable1 + VTABLE 2*8, objc_msgSend_vtable2 + VTABLE 3*8, objc_msgSend_vtable3 + VTABLE 4*8, objc_msgSend_vtable4 + VTABLE 5*8, objc_msgSend_vtable5 + VTABLE 6*8, objc_msgSend_vtable6 + VTABLE 7*8, objc_msgSend_vtable7 + VTABLE 8*8, objc_msgSend_vtable8 + VTABLE 9*8, objc_msgSend_vtable9 + VTABLE 10*8, objc_msgSend_vtable10 + VTABLE 11*8, objc_msgSend_vtable11 + VTABLE 12*8, objc_msgSend_vtable12 + VTABLE 13*8, objc_msgSend_vtable13 + VTABLE 14*8, objc_msgSend_vtable14 + VTABLE 15*8, objc_msgSend_vtable15 + +#endif diff --git a/runtime/OldClasses.subproj/List.h b/runtime/OldClasses.subproj/List.h index 71f5706..ace45a7 100644 --- a/runtime/OldClasses.subproj/List.h +++ b/runtime/OldClasses.subproj/List.h @@ -32,9 +32,9 @@ #ifndef _OBJC_LIST_H_ #define _OBJC_LIST_H_ -#if defined(__LP64__) +#if defined(__OBJC2__) -#warning class List unavailable in 64-bit Objective-C +#warning class List unavailable #else diff --git a/runtime/OldClasses.subproj/List.m b/runtime/OldClasses.subproj/List.m index 4ed5a01..9669055 100644 --- a/runtime/OldClasses.subproj/List.m +++ b/runtime/OldClasses.subproj/List.m @@ -27,7 +27,7 @@ Responsibility: Bertrand Serlet */ -#ifndef __LP64__ +#ifndef __OBJC2__ #import #import diff --git a/runtime/Protocol.h b/runtime/Protocol.h index 5b1c56e..1b133b8 100644 --- a/runtime/Protocol.h +++ b/runtime/Protocol.h @@ -28,7 +28,7 @@ #ifndef _OBJC_PROTOCOL_H_ #define _OBJC_PROTOCOL_H_ -#import +#include /* Warning: All of these methods will disappear in 64-bit. */ diff --git a/runtime/Protocol.m b/runtime/Protocol.m index 4b6ab62..43d5567 100644 --- a/runtime/Protocol.m +++ b/runtime/Protocol.m @@ -32,8 +32,8 @@ #include #define OLD 1 -#import "objc-private.h" #import "Protocol.h" +#import "objc-private.h" /* some forward declarations */ diff --git a/runtime/error.h b/runtime/error.h index 1b7dbdf..49d4ae1 100644 --- a/runtime/error.h +++ b/runtime/error.h @@ -30,10 +30,10 @@ All rights reserved. */ -#if defined(__LP64__) +#if defined(__OBJC2__) -// This header contains definitions for Libstreams, which will never be 64-bit. -#warning objc/error.h is unavailable in 64-bit. +// This header contains definitions for Libstreams. +#warning objc/error.h is unavailable. #endif @@ -43,7 +43,7 @@ #define _OBJC_ERROR_H_ #include -#import +#include typedef struct _NXHandler { /* a node in the handler chain */ diff --git a/runtime/hashtable.h b/runtime/hashtable.h new file mode 100644 index 0000000..7f62780 --- /dev/null +++ b/runtime/hashtable.h @@ -0,0 +1,2 @@ +#include + diff --git a/runtime/hashtable2.h b/runtime/hashtable2.h index fda0728..de52196 100644 --- a/runtime/hashtable2.h +++ b/runtime/hashtable2.h @@ -33,8 +33,9 @@ #warning The API in this header is obsoleted by NSHashtable.h #endif -#import +#include #include +#include /************************************************************************* * Hash tables of arbitrary data @@ -177,6 +178,9 @@ For the following prototypes, free is defined as NXReallyFree. OBJC_EXPORT const NXHashTablePrototype NXPtrStructKeyPrototype; OBJC_EXPORT const NXHashTablePrototype NXStrStructKeyPrototype; + +#if !__OBJC2__ && !TARGET_OS_WIN32 + /************************************************************************* * Unique strings and buffers *************************************************************************/ @@ -212,4 +216,6 @@ OBJC_EXPORT char *NXCopyStringBufferFromZone(const char *buffer, void *z); /* given a buffer, allocates a new string copy of buffer. Buffer should be \0 terminated; returned string is \0 terminated. */ +#endif + #endif /* _OBJC_LITTLE_HASHTABLE_H_ */ diff --git a/runtime/hashtable2.m b/runtime/hashtable2.m index d05b28e..89a31ab 100644 --- a/runtime/hashtable2.m +++ b/runtime/hashtable2.m @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999-2006 Apple Inc. All Rights Reserved. + * Copyright (c) 1999-2008 Apple Inc. All Rights Reserved. * * @APPLE_LICENSE_HEADER_START@ * @@ -26,12 +26,8 @@ Created by Bertrand Serlet, Feb 89 */ - -#include -#include - -#import "objc-private.h" -#import "hashtable2.h" +#include "objc-private.h" +#include "hashtable2.h" /* In order to improve efficiency, buckets contain a pointer to an array or directly the data when the array size is 1 */ typedef union { @@ -54,16 +50,34 @@ typedef struct { static unsigned log2u (unsigned x) { return (x<2) ? 0 : log2u (x>>1)+1; }; -static unsigned exp2m1 (unsigned x) { return (1 << x) - 1; }; - #define PTRSIZE sizeof(void *) -#define ALLOCTABLE(z) ((NXHashTable *) malloc_zone_malloc (z,sizeof (NXHashTable))) -#define ALLOCBUCKETS(z,nb)((HashBucket *) malloc_zone_calloc (z, nb, sizeof (HashBucket))) -#define ALLOCPAIRS(z,nb) ((const void **) malloc_zone_calloc (z, nb, sizeof (void *))) - -/* iff necessary this modulo can be optimized since the nbBuckets is of the form 2**n-1 */ -#define BUCKETOF(table, data) (((HashBucket *)table->buckets)+((*table->prototype->hash)(table->info, data) % table->nbBuckets)) +#ifdef NO_ZONES +# define DEFAULT_ZONE NULL +# define ZONE_FROM_PTR(p) NULL +# define ALLOCTABLE(z) ((NXHashTable *) malloc (sizeof (NXHashTable))) +# define ALLOCBUCKETS(z,nb)((HashBucket *) calloc (nb, sizeof (HashBucket))) +# define ALLOCPAIRS(z,nb) ((const void **) calloc (nb, sizeof (void *))) +#else +# define DEFAULT_ZONE malloc_default_zone() +# define ZONE_FROM_PTR(p) malloc_zone_from_ptr(p) +# define ALLOCTABLE(z) ((NXHashTable *) malloc_zone_malloc (z,sizeof (NXHashTable))) +# define ALLOCBUCKETS(z,nb)((HashBucket *) malloc_zone_calloc (z, nb, sizeof (HashBucket))) +# define ALLOCPAIRS(z,nb) ((const void **) malloc_zone_calloc (z, nb, sizeof (void *))) +#endif + +#ifdef NO_MOD + /* nbBuckets must be a power of 2 */ +# define BUCKETOF(table, data) (((HashBucket *)table->buckets)+((*table->prototype->hash)(table->info, data) & (table->nbBuckets-1))) +# define GOOD_CAPACITY(c) (c <= 1 ? 1 : 1 << (log2u (c-1)+1)) +# define MORE_CAPACITY(b) (b*2) +#else + /* iff necessary this modulo can be optimized since the nbBuckets is of the form 2**n-1 */ +# define BUCKETOF(table, data) (((HashBucket *)table->buckets)+((*table->prototype->hash)(table->info, data) % table->nbBuckets)) + static unsigned exp2m1 (unsigned x) { return (1 << x) - 1; }; +# define GOOD_CAPACITY(c) (exp2m1 (log2u (c)+1)) +# define MORE_CAPACITY(b) (b*2+1) +#endif #define ISEQUAL(table, data1, data2) ((data1 == data2) || (*table->prototype->isEqual)(table->info, data1, data2)) /* beware of double evaluation */ @@ -98,11 +112,11 @@ static NXHashTable *prototypes NOBSS = NULL; static void bootstrap (void) { free(malloc(8)); - prototypes = ALLOCTABLE (malloc_default_zone()); + prototypes = ALLOCTABLE (DEFAULT_ZONE); prototypes->prototype = &protoPrototype; prototypes->count = 1; prototypes->nbBuckets = 1; /* has to be 1 so that the right bucket is 0 */ - prototypes->buckets = ALLOCBUCKETS(malloc_default_zone(), 1); + prototypes->buckets = ALLOCBUCKETS(DEFAULT_ZONE, 1); prototypes->info = NULL; ((HashBucket *) prototypes->buckets)[0].count = 1; ((HashBucket *) prototypes->buckets)[0].elements.one = &protoPrototype; @@ -119,7 +133,7 @@ int NXPtrIsEqual (const void *info, const void *data1, const void *data2) { *************************************************************************/ NXHashTable *NXCreateHashTable (NXHashTablePrototype prototype, unsigned capacity, const void *info) { - return NXCreateHashTableFromZone(prototype, capacity, info, malloc_default_zone()); + return NXCreateHashTableFromZone(prototype, capacity, info, DEFAULT_ZONE); } NXHashTable *NXCreateHashTableFromZone (NXHashTablePrototype prototype, unsigned capacity, const void *info, void *z) { @@ -138,8 +152,7 @@ NXHashTable *NXCreateHashTableFromZone (NXHashTablePrototype prototype, unsigned proto = NXHashGet (prototypes, &prototype); if (! proto) { proto - = (NXHashTablePrototype *) malloc_zone_malloc (malloc_default_zone(), - sizeof (NXHashTablePrototype)); + = (NXHashTablePrototype *) malloc(sizeof (NXHashTablePrototype)); bcopy ((const char*)&prototype, (char*)proto, sizeof (NXHashTablePrototype)); (void) NXHashInsert (prototypes, proto); proto = NXHashGet (prototypes, &prototype); @@ -149,7 +162,7 @@ NXHashTable *NXCreateHashTableFromZone (NXHashTablePrototype prototype, unsigned }; }; table->prototype = proto; table->count = 0; table->info = info; - table->nbBuckets = exp2m1 (log2u (capacity)+1); + table->nbBuckets = GOOD_CAPACITY(capacity); table->buckets = ALLOCBUCKETS(z, table->nbBuckets); return table; } @@ -167,7 +180,7 @@ static void freeBucketPairs (void (*freeProc)(const void *info, void *data), Has (*freeProc) (info, (void *) *pairs); pairs ++; }; - free (bucket.elements.many); + free ((void*)bucket.elements.many); }; static void freeBuckets (NXHashTable *table, int freeObjects) { @@ -214,19 +227,19 @@ BOOL NXCompareHashTables (NXHashTable *table1, NXHashTable *table2) { } NXHashTable *NXCopyHashTable (NXHashTable *table) { - NXHashTable *new; + NXHashTable *newt; NXHashState state = NXInitHashState (table); void *data; - void *z = malloc_zone_from_ptr(table); + void *z = ZONE_FROM_PTR(table); - new = ALLOCTABLE(z); - new->prototype = table->prototype; new->count = 0; - new->info = table->info; - new->nbBuckets = table->nbBuckets; - new->buckets = ALLOCBUCKETS(z, new->nbBuckets); + newt = ALLOCTABLE(z); + newt->prototype = table->prototype; newt->count = 0; + newt->info = table->info; + newt->nbBuckets = table->nbBuckets; + newt->buckets = ALLOCBUCKETS(z, newt->nbBuckets); while (NXNextHashState (table, &state, &data)) - (void) NXHashInsert (new, data); - return new; + NXHashInsert (newt, data); + return newt; } unsigned NXCountHashTable (NXHashTable *table) { @@ -280,7 +293,7 @@ __private_extern__ void _NXHashRehashToCapacity (NXHashTable *table, unsigned ne NXHashTable *old; NXHashState state; void *aux; - void *z = malloc_zone_from_ptr(table); + void *z = ZONE_FROM_PTR(table); old = ALLOCTABLE(z); old->prototype = table->prototype; old->count = table->count; @@ -298,15 +311,15 @@ __private_extern__ void _NXHashRehashToCapacity (NXHashTable *table, unsigned ne } static void _NXHashRehash (NXHashTable *table) { - _NXHashRehashToCapacity (table, table->nbBuckets*2 + 1); + _NXHashRehashToCapacity (table, MORE_CAPACITY(table->nbBuckets)); } void *NXHashInsert (NXHashTable *table, const void *data) { HashBucket *bucket = BUCKETOF(table, data); unsigned j = bucket->count; const void **pairs; - const void **new; - void *z = malloc_zone_from_ptr(table); + const void **newt; + void *z = ZONE_FROM_PTR(table); if (! j) { bucket->count++; bucket->elements.one = data; @@ -319,10 +332,10 @@ void *NXHashInsert (NXHashTable *table, const void *data) { bucket->elements.one = data; return (void *) old; }; - new = ALLOCPAIRS(z, 2); - new[1] = bucket->elements.one; - *new = data; - bucket->count++; bucket->elements.many = new; + newt = ALLOCPAIRS(z, 2); + newt[1] = bucket->elements.one; + *newt = data; + bucket->count++; bucket->elements.many = newt; table->count++; if (table->count > table->nbBuckets) _NXHashRehash (table); return NULL; @@ -338,11 +351,11 @@ void *NXHashInsert (NXHashTable *table, const void *data) { pairs ++; }; /* we enlarge this bucket; and put new data in front */ - new = ALLOCPAIRS(z, bucket->count+1); - if (bucket->count) bcopy ((const char*)bucket->elements.many, (char*)(new+1), bucket->count * PTRSIZE); - *new = data; - free (bucket->elements.many); - bucket->count++; bucket->elements.many = new; + newt = ALLOCPAIRS(z, bucket->count+1); + if (bucket->count) bcopy ((const char*)bucket->elements.many, (char*)(newt+1), bucket->count * PTRSIZE); + *newt = data; + free ((void*)bucket->elements.many); + bucket->count++; bucket->elements.many = newt; table->count++; if (table->count > table->nbBuckets) _NXHashRehash (table); return NULL; @@ -352,8 +365,8 @@ void *NXHashInsertIfAbsent (NXHashTable *table, const void *data) { HashBucket *bucket = BUCKETOF(table, data); unsigned j = bucket->count; const void **pairs; - const void **new; - void *z = malloc_zone_from_ptr(table); + const void **newt; + void *z = ZONE_FROM_PTR(table); if (! j) { bucket->count++; bucket->elements.one = data; @@ -363,10 +376,10 @@ void *NXHashInsertIfAbsent (NXHashTable *table, const void *data) { if (j == 1) { if (ISEQUAL(table, data, bucket->elements.one)) return (void *) bucket->elements.one; - new = ALLOCPAIRS(z, 2); - new[1] = bucket->elements.one; - *new = data; - bucket->count++; bucket->elements.many = new; + newt = ALLOCPAIRS(z, 2); + newt[1] = bucket->elements.one; + *newt = data; + bucket->count++; bucket->elements.many = newt; table->count++; if (table->count > table->nbBuckets) _NXHashRehash (table); return (void *) data; @@ -379,11 +392,11 @@ void *NXHashInsertIfAbsent (NXHashTable *table, const void *data) { pairs ++; }; /* we enlarge this bucket; and put new data in front */ - new = ALLOCPAIRS(z, bucket->count+1); - if (bucket->count) bcopy ((const char*)bucket->elements.many, (char*)(new+1), bucket->count * PTRSIZE); - *new = data; - free (bucket->elements.many); - bucket->count++; bucket->elements.many = new; + newt = ALLOCPAIRS(z, bucket->count+1); + if (bucket->count) bcopy ((const char*)bucket->elements.many, (char*)(newt+1), bucket->count * PTRSIZE); + *newt = data; + free ((void*)bucket->elements.many); + bucket->count++; bucket->elements.many = newt; table->count++; if (table->count > table->nbBuckets) _NXHashRehash (table); return (void *) data; @@ -393,8 +406,8 @@ void *NXHashRemove (NXHashTable *table, const void *data) { HashBucket *bucket = BUCKETOF(table, data); unsigned j = bucket->count; const void **pairs; - const void **new; - void *z = malloc_zone_from_ptr(table); + const void **newt; + void *z = ZONE_FROM_PTR(table); if (! j) return NULL; if (j == 1) { @@ -412,7 +425,7 @@ void *NXHashRemove (NXHashTable *table, const void *data) { bucket->elements.one = pairs[0]; data = pairs[1]; } else return NULL; - free (pairs); + free ((void*)pairs); table->count--; bucket->count--; return (void *) data; }; @@ -420,14 +433,14 @@ void *NXHashRemove (NXHashTable *table, const void *data) { if (ISEQUAL(table, data, *pairs)) { data = *pairs; /* we shrink this bucket */ - new = (bucket->count-1) + newt = (bucket->count-1) ? ALLOCPAIRS(z, bucket->count-1) : NULL; if (bucket->count-1 != j) - bcopy ((const char*)bucket->elements.many, (char*)new, PTRSIZE*(bucket->count-j-1)); + bcopy ((const char*)bucket->elements.many, (char*)newt, PTRSIZE*(bucket->count-j-1)); if (j) - bcopy ((const char*)(bucket->elements.many + bucket->count-j), (char*)(new+bucket->count-j-1), PTRSIZE*j); - free (bucket->elements.many); - table->count--; bucket->count--; bucket->elements.many = new; + bcopy ((const char*)(bucket->elements.many + bucket->count-j), (char*)(newt+bucket->count-j-1), PTRSIZE*j); + free ((void*)bucket->elements.many); + table->count--; bucket->count--; bucket->elements.many = newt; return (void *) data; }; pairs ++; @@ -536,6 +549,8 @@ const NXHashTablePrototype NXStrStructKeyPrototype = { * *************************************************************************/ +#if !__OBJC2__ && !TARGET_OS_WIN32 + /* the implementation could be made faster at the expense of memory if the size of the strings were kept around */ static NXHashTable *uniqueStrings = NULL; @@ -546,7 +561,7 @@ static int accessUniqueString = 0; static char *z = NULL; static size_t zSize = 0; -static mutex_t lock = (mutex_t)0; +static mutex_t lock = MUTEX_INITIALIZER; static const char *CopyIntoReadOnly (const char *str) { size_t len = strlen (str) + 1; @@ -558,12 +573,7 @@ static const char *CopyIntoReadOnly (const char *str) { return new; } - if (! lock) { - lock = (mutex_t)mutex_alloc (); - mutex_init (lock); - }; - - mutex_lock (lock); + mutex_lock (&lock); if (zSize < len) { zSize = CHUNK_SIZE *((len + CHUNK_SIZE - 1) / CHUNK_SIZE); /* not enough room, we try to allocate. If no room left, too bad */ @@ -574,7 +584,7 @@ static const char *CopyIntoReadOnly (const char *str) { bcopy (str, new, len); z += len; zSize -= len; - mutex_unlock (lock); + mutex_unlock (&lock); return new; }; @@ -622,10 +632,15 @@ NXAtom NXUniqueStringWithLength (const char *buffer, int length) { }; char *NXCopyStringBufferFromZone (const char *str, void *z) { +#ifdef NO_ZONES + return strdup(str); +#else return strcpy ((char *) malloc_zone_malloc(z, strlen (str) + 1), str); +#endif }; char *NXCopyStringBuffer (const char *str) { - return NXCopyStringBufferFromZone(str, malloc_default_zone()); + return strdup(str); }; +#endif diff --git a/runtime/lookupa.h b/runtime/lookupa.h deleted file mode 100644 index 0b27db6..0000000 --- a/runtime/lookupa.h +++ /dev/null @@ -1,24 +0,0 @@ -/* ------------------------------------------------------------------------------- -By Bob Jenkins, September 1996. -lookupa.h, a hash function for table lookup, same function as lookup.c. -Use this code in any way you wish. Public Domain. It has no warranty. -Source is http://burtleburtle.net/bob/c/lookupa.h ------------------------------------------------------------------------------- -*/ - -#ifndef STANDARD -#include "standard.h" -#endif - -#ifndef LOOKUPA -#define LOOKUPA - -#define CHECKSTATE 8 -#define hashsize(n) ((ub4)1<<(n)) -#define hashmask(n) (hashsize(n)-1) - -ub4 lookup(/*_ ub1 *k, ub4 length, ub4 level _*/); -void checksum(/*_ ub1 *k, ub4 length, ub4 *state _*/); - -#endif /* LOOKUPA */ diff --git a/runtime/lookupa.m b/runtime/lookupa.m deleted file mode 100644 index ae86708..0000000 --- a/runtime/lookupa.m +++ /dev/null @@ -1,244 +0,0 @@ -/* --------------------------------------------------------------------- -lookupa.c, by Bob Jenkins, December 1996. Same as lookup2.c -Use this code however you wish. Public Domain. No warranty. -Source is http://burtleburtle.net/bob/c/lookupa.c --------------------------------------------------------------------- -*/ -#ifndef STANDARD -#include "standard.h" -#endif -#ifndef LOOKUPA -#include "lookupa.h" -#endif - -/* --------------------------------------------------------------------- -mix -- mix 3 32-bit values reversibly. -For every delta with one or two bit set, and the deltas of all three - high bits or all three low bits, whether the original value of a,b,c - is almost all zero or is uniformly distributed, -* If mix() is run forward or backward, at least 32 bits in a,b,c - have at least 1/4 probability of changing. -* If mix() is run forward, every bit of c will change between 1/3 and - 2/3 of the time. (Well, 22/100 and 78/100 for some 2-bit deltas.) -mix() was built out of 36 single-cycle latency instructions in a - structure that could supported 2x parallelism, like so: - a -= b; - a -= c; x = (c>>13); - b -= c; a ^= x; - b -= a; x = (a<<8); - c -= a; b ^= x; - c -= b; x = (b>>13); - ... - Unfortunately, superscalar Pentiums and Sparcs can't take advantage - of that parallelism. They've also turned some of those single-cycle - latency instructions into multi-cycle latency instructions. Still, - this is the fastest good hash I could find. There were about 2^^68 - to choose from. I only looked at a billion or so. --------------------------------------------------------------------- -*/ -#define mix(a,b,c) \ -{ \ - a -= b; a -= c; a ^= (c>>13); \ - b -= c; b -= a; b ^= (a<<8); \ - c -= a; c -= b; c ^= (b>>13); \ - a -= b; a -= c; a ^= (c>>12); \ - b -= c; b -= a; b ^= (a<<16); \ - c -= a; c -= b; c ^= (b>>5); \ - a -= b; a -= c; a ^= (c>>3); \ - b -= c; b -= a; b ^= (a<<10); \ - c -= a; c -= b; c ^= (b>>15); \ -} - -/* --------------------------------------------------------------------- -lookup() -- hash a variable-length key into a 32-bit value - k : the key (the unaligned variable-length array of bytes) - len : the length of the key, counting by bytes - level : can be any 4-byte value -Returns a 32-bit value. Every bit of the key affects every bit of -the return value. Every 1-bit and 2-bit delta achieves avalanche. -About 6len+35 instructions. - -The best hash table sizes are powers of 2. There is no need to do -mod a prime (mod is sooo slow!). If you need less than 32 bits, -use a bitmask. For example, if you need only 10 bits, do - h = (h & hashmask(10)); -In which case, the hash table should have hashsize(10) elements. - -If you are hashing n strings (ub1 **)k, do it like this: - for (i=0, h=0; i= 12) - { - a += (k[0] +((ub4)k[1]<<8) +((ub4)k[2]<<16) +((ub4)k[3]<<24)); - b += (k[4] +((ub4)k[5]<<8) +((ub4)k[6]<<16) +((ub4)k[7]<<24)); - c += (k[8] +((ub4)k[9]<<8) +((ub4)k[10]<<16)+((ub4)k[11]<<24)); - mix(a,b,c); - k += 12; len -= 12; - } - - /*------------------------------------- handle the last 11 bytes */ - c += length; - switch(len) /* all the case statements fall through */ - { - case 11: c+=((ub4)k[10]<<24); - case 10: c+=((ub4)k[9]<<16); - case 9 : c+=((ub4)k[8]<<8); - /* the first byte of c is reserved for the length */ - case 8 : b+=((ub4)k[7]<<24); - case 7 : b+=((ub4)k[6]<<16); - case 6 : b+=((ub4)k[5]<<8); - case 5 : b+=k[4]; - case 4 : a+=((ub4)k[3]<<24); - case 3 : a+=((ub4)k[2]<<16); - case 2 : a+=((ub4)k[1]<<8); - case 1 : a+=k[0]; - /* case 0: nothing left to add */ - } - mix(a,b,c); - /*-------------------------------------------- report the result */ - return c; -} - - -/* --------------------------------------------------------------------- -mixc -- mixc 8 4-bit values as quickly and thoroughly as possible. -Repeating mix() three times achieves avalanche. -Repeating mix() four times eliminates all funnels and all - characteristics stronger than 2^{-11}. --------------------------------------------------------------------- -*/ -#define mixc(a,b,c,d,e,f,g,h) \ -{ \ - a^=b<<11; d+=a; b+=c; \ - b^=c>>2; e+=b; c+=d; \ - c^=d<<8; f+=c; d+=e; \ - d^=e>>16; g+=d; e+=f; \ - e^=f<<10; h+=e; f+=g; \ - f^=g>>4; a+=f; g+=h; \ - g^=h<<8; b+=g; h+=a; \ - h^=a>>9; c+=h; a+=b; \ -} - -/* --------------------------------------------------------------------- -checksum() -- hash a variable-length key into a 256-bit value - k : the key (the unaligned variable-length array of bytes) - len : the length of the key, counting by bytes - state : an array of CHECKSTATE 4-byte values (256 bits) -The state is the checksum. Every bit of the key affects every bit of -the state. There are no funnels. About 112+6.875len instructions. - -If you are hashing n strings (ub1 **)k, do it like this: - for (i=0; i<8; ++i) state[i] = 0x9e3779b9; - for (i=0, h=0; i= 32) - { - a += (k[0] +(k[1]<<8) +(k[2]<<16) +(k[3]<<24)); - b += (k[4] +(k[5]<<8) +(k[6]<<16) +(k[7]<<24)); - c += (k[8] +(k[9]<<8) +(k[10]<<16)+(k[11]<<24)); - d += (k[12]+(k[13]<<8)+(k[14]<<16)+(k[15]<<24)); - e += (k[16]+(k[17]<<8)+(k[18]<<16)+(k[19]<<24)); - f += (k[20]+(k[21]<<8)+(k[22]<<16)+(k[23]<<24)); - g += (k[24]+(k[25]<<8)+(k[26]<<16)+(k[27]<<24)); - h += (k[28]+(k[29]<<8)+(k[30]<<16)+(k[31]<<24)); - mixc(a,b,c,d,e,f,g,h); - mixc(a,b,c,d,e,f,g,h); - mixc(a,b,c,d,e,f,g,h); - mixc(a,b,c,d,e,f,g,h); - k += 32; len -= 32; - } - - /*------------------------------------- handle the last 31 bytes */ - h += length; - switch(len) - { - case 31: h+=(k[30]<<24); - case 30: h+=(k[29]<<16); - case 29: h+=(k[28]<<8); - case 28: g+=(k[27]<<24); - case 27: g+=(k[26]<<16); - case 26: g+=(k[25]<<8); - case 25: g+=k[24]; - case 24: f+=(k[23]<<24); - case 23: f+=(k[22]<<16); - case 22: f+=(k[21]<<8); - case 21: f+=k[20]; - case 20: e+=(k[19]<<24); - case 19: e+=(k[18]<<16); - case 18: e+=(k[17]<<8); - case 17: e+=k[16]; - case 16: d+=(k[15]<<24); - case 15: d+=(k[14]<<16); - case 14: d+=(k[13]<<8); - case 13: d+=k[12]; - case 12: c+=(k[11]<<24); - case 11: c+=(k[10]<<16); - case 10: c+=(k[9]<<8); - case 9 : c+=k[8]; - case 8 : b+=(k[7]<<24); - case 7 : b+=(k[6]<<16); - case 6 : b+=(k[5]<<8); - case 5 : b+=k[4]; - case 4 : a+=(k[3]<<24); - case 3 : a+=(k[2]<<16); - case 2 : a+=(k[1]<<8); - case 1 : a+=k[0]; - } - mixc(a,b,c,d,e,f,g,h); - mixc(a,b,c,d,e,f,g,h); - mixc(a,b,c,d,e,f,g,h); - mixc(a,b,c,d,e,f,g,h); - - /*-------------------------------------------- report the result */ - state[0]=a; state[1]=b; state[2]=c; state[3]=d; - state[4]=e; state[5]=f; state[6]=g; state[7]=h; -} diff --git a/runtime/maptable.h b/runtime/maptable.h index b83cd94..c289f4a 100644 --- a/runtime/maptable.h +++ b/runtime/maptable.h @@ -29,12 +29,11 @@ #ifndef _OBJC_MAPTABLE_H_ #define _OBJC_MAPTABLE_H_ - #ifndef _OBJC_PRIVATE_H_ #warning the API in this header is obsolete #endif -#import +#include /*************** Definitions ***************/ diff --git a/runtime/maptable.m b/runtime/maptable.m index 4437df5..2816a85 100644 --- a/runtime/maptable.m +++ b/runtime/maptable.m @@ -30,10 +30,9 @@ #include #include -#import "objc-private.h" -#import "maptable.h" -#import "Object.h" -#import "hashtable2.h" +#include "objc-private.h" +#include "maptable.h" +#include "hashtable2.h" /****** Macros and utilities ****************************/ @@ -438,9 +437,21 @@ const NXMapTablePrototype NXStrValueMapPrototype = { }; -#if !__LP64__ +#if !__OBJC2__ && !TARGET_OS_WIN32 + +/* This only works with class Object, which is unavailable. */ + +/* Method prototypes */ +@interface DoesNotExist ++ class; ++ initialize; +- (id)description; +- (const char *)UTF8String; +- (unsigned long)hash; +- (BOOL)isEqual:(id)object; +- free; +@end -/* This only works with class Object, which is unavailable in 64-bit. */ static unsigned _mapObjectHash(NXMapTable *table, const void *key) { return [(id)key hash]; } diff --git a/runtime/message.h b/runtime/message.h index b18ad0f..bca4941 100644 --- a/runtime/message.h +++ b/runtime/message.h @@ -21,10 +21,15 @@ * @APPLE_LICENSE_HEADER_END@ */ -#import -#import +#ifndef _OBJC_MESSAGE_H +#define _OBJC_MESSAGE_H +#include +#include + +#ifndef OBJC_SUPER +#define OBJC_SUPER struct objc_super { id receiver; #if !defined(__cplusplus) && !__OBJC2__ @@ -34,6 +39,7 @@ struct objc_super { #endif /* super_class is the first class to search */ }; +#endif /* Basic Messaging Primitives @@ -111,6 +117,27 @@ OBJC_EXPORT void method_invoke_stret(id receiver, Method m, ...) AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER; +/* Message Forwarding Primitives + * Use these functions to forward a message as if the receiver did not + * respond to it. + * + * The receiver must not be nil. + * + * class_getMethodImplementation() may return (IMP)_objc_msgForward. + * class_getMethodImplementation_stret() may return (IMP)_objc_msgForward_stret + * + * These functions must be cast to an appropriate function pointer type + * before being called. + * + * Before Mac OS X 10.6, _objc_msgForward must not be called directly + * but may be compared to other IMP values. + */ +OBJC_EXPORT id _objc_msgForward(id receiver, SEL sel, ...) + AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER; +OBJC_EXPORT void _objc_msgForward_stret(id receiver, SEL sel, ...) + AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER; + + /* Variable-argument Messaging Primitives * * Use these functions to call methods with a list of arguments, such @@ -171,3 +198,5 @@ OBJC_EXPORT double objc_msgSendv_fpret(id self, SEL op, unsigned arg_size, marg_ ( marg_getValue(margs, offset, type) = (value) ) #endif + +#endif diff --git a/runtime/objc-api.h b/runtime/objc-api.h index 5acebfe..8761509 100644 --- a/runtime/objc-api.h +++ b/runtime/objc-api.h @@ -26,6 +26,7 @@ #define _OBJC_OBJC_API_H_ #include +#include /* * OBJC_API_VERSION 0 or undef: Tiger and earlier API only @@ -48,11 +49,23 @@ # endif #endif -#if !defined(OBJC_EXPORT) +#if !defined(OBJC_EXTERN) # if defined(__cplusplus) -# define OBJC_EXPORT extern "C" +# define OBJC_EXTERN extern "C" +# else +# define OBJC_EXTERN extern +# endif +#endif + +#if !defined(OBJC_EXPORT) +# if TARGET_OS_WIN32 +# if defined(BUILDING_OBJC) +# define OBJC_EXPORT OBJC_EXTERN __declspec(dllexport) +# else +# define OBJC_EXPORT OBJC_EXTERN __declspec(dllimport) +# endif # else -# define OBJC_EXPORT extern +# define OBJC_EXPORT OBJC_EXTERN # endif #endif @@ -60,4 +73,12 @@ # define OBJC_IMPORT extern #endif +#ifndef __DARWIN_NULL +#define __DARWIN_NULL NULL +#endif + +#if !defined(OBJC_INLINE) +# define OBJC_INLINE __inline +#endif + #endif diff --git a/runtime/objc-auto-dump.h b/runtime/objc-auto-dump.h new file mode 100644 index 0000000..9b531d2 --- /dev/null +++ b/runtime/objc-auto-dump.h @@ -0,0 +1,53 @@ +// +// objc-auto-dump.h +// objc +// The raw dump file format +// See objc-gdb.h for the primitive. +// +// Created by Blaine Garst on 12/8/08. +// Copyright 2008 Apple, Inc. All rights reserved. +// + + +/* + * Raw file format definitions + */ + +// must be unique in first letter... +// RAW FORMAT +#define HEADER "dumpster" +#define THREAD 't' +#define LOCAL 'l' +#define NODE 'n' +#define REGISTER 'r' +#define ROOT 'g' +#define WEAK 'w' +#define CLASS 'c' +#define END 'e' + +#define SixtyFour 1 +#define Little 2 + +/* + +Raw format, not that anyone should really care. Most programs should use the cooked file reader. + + * +
:= 'd' 'u' 'm' 'p' 's' 't' 'e' 'r' ; the HEADER string + := SixtyFour? + Little? ; architecture + := | | | | + := * ; the triple + := 'r' longLength [bytes] ; the register bank + := 't' longLength [bytes] ; the stack + := 'l' [long] ; a thread local node + := 'g' longAddress longValue + := 'n' longAddress longSize intLayout longRefcount longIsa? + := 'w' longAddress longValue + := 'c' longAddress + := intLength [bytes] ; no null byte + := intLength [bytes] ; including 0 byte at end + := intLength [bytes] ; including 0 byte at end + := 'e' + + */ + diff --git a/runtime/objc-auto-dump.m b/runtime/objc-auto-dump.m new file mode 100644 index 0000000..43b0ada --- /dev/null +++ b/runtime/objc-auto-dump.m @@ -0,0 +1,218 @@ +/* + * Copyright (c) 2008 Apple Inc. All Rights Reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#import +#import +#import +#import "objc-auto-dump.h" +#import "objc-private.h" +#import + +/* + * Utilities + */ + +static char myType() { + char type = 0; + if (sizeof(void *) == 8) type |= SixtyFour; +#if __LITTLE_ENDIAN__ + type |= Little; +#endif + return type; +} + +/* + * Sigh, a mutable set. + */ + +typedef struct { + long *items; + long count; + long capacity; +} pointer_set_t; + +static pointer_set_t *new_pointer_set() { + pointer_set_t *result = malloc_zone_malloc(_objc_internal_zone(), sizeof(pointer_set_t)); + result->items = calloc(64, sizeof(long)); + result->count = 0; + result->capacity = 63; // last valid ptr, also mask + return result; +} + +static void pointer_set_grow(pointer_set_t *set); + +static void pointer_set_add(pointer_set_t *set, long ptr) { + long hash = ptr & set->capacity; + while (1) { + if (!set->items[hash]) { + set->items[hash] = ptr; + ++set->count; + if (set->count*3 > set->capacity*2) + pointer_set_grow(set); + return; + } + if (set->items[hash] == ptr) return; + hash = (hash + 1) & set->capacity; + } +} + +static void pointer_set_grow(pointer_set_t *set) { + long oldCapacity = set->capacity; + long *oldItems = set->items; + long i; + set->count = 0; + set->capacity = 2*(oldCapacity+1)-1; + set->items = malloc_zone_calloc(_objc_internal_zone(), 2*(oldCapacity+1), sizeof(long)); + for (i = 0; i < oldCapacity; ++i) + if (oldItems[i]) pointer_set_add(set, oldItems[i]); + free(oldItems); +} + +static void pointer_set_iterate(pointer_set_t *set, void (^block)(long item)) { + long i; + for (i = 0; i < set->capacity; ++i) + if (set->items[i]) block(set->items[i]); +} + +static void pointer_set_dispose(pointer_set_t *set) { + free(set->items); + free(set); +} + +/* + Quickly dump heap to a named file in a pretty raw format. + */ +__private_extern__ BOOL _objc_dumpHeap(auto_zone_t *zone, const char *filename) { + // just write interesting info to disk + int fd = secure_open(filename, O_WRONLY|O_CREAT, geteuid()); + if (fd < 0) return NO; + FILE *fp = fdopen(fd, "w"); + if (fp == NULL) { + return NO; + } + + fwrite(HEADER, strlen(HEADER), 1, fp); + char type = myType(); + fwrite(&type, 1, 1, fp); + + // for each thread... + + // do registers first + void (^dump_registers)(const void *, unsigned long) = ^(const void *base, unsigned long byte_size) { + char type = REGISTER; + fwrite(&type, 1, 1, fp); + //fwrite(REGISTER, strlen(REGISTER), 1, fp); + fwrite(&byte_size, sizeof(byte_size), 1, fp); + fwrite(base, byte_size, 1, fp); + }; + + // then stacks + void (^dump_stack)(const void *, unsigned long) = ^(const void *base, unsigned long byte_size) { + char type = THREAD; + fwrite(&type, 1, 1, fp); + //fwrite(THREAD, strlen(THREAD), 1, fp); + fwrite(&byte_size, sizeof(byte_size), 1, fp); + fwrite(base, byte_size, 1, fp); + }; + + // then locals + void (^dump_local)(const void *, unsigned long, unsigned int, unsigned long) = + ^(const void *address, unsigned long size, unsigned int layout, unsigned long refcount) { + // just write the value - rely on it showing up again as a node later + char type = LOCAL; + fwrite(&type, 1, 1, fp); + fwrite(&address, sizeof(address), 1, fp); + }; + + + + // roots + void (^dump_root)(const void **) = ^(const void **address) { + char type = ROOT; + fwrite(&type, 1, 1, fp); + // write the address so that we can catch misregistered globals + fwrite(&address, sizeof(address), 1, fp); + // write content, even (?) if zero + fwrite(address, sizeof(*address), 1, fp); + }; + + // the nodes + pointer_set_t *classes = new_pointer_set(); + void (^dump_node)(const void *, unsigned long, unsigned int, unsigned long) = + ^(const void *address, unsigned long size, unsigned int layout, unsigned long refcount) { + char type = NODE; + fwrite(&type, 1, 1, fp); + fwrite(&address, sizeof(address), 1, fp); + fwrite(&size, sizeof(size), 1, fp); + fwrite(&layout, sizeof(layout), 1, fp); + fwrite(&refcount, sizeof(refcount), 1, fp); + if ((layout & AUTO_UNSCANNED) != AUTO_UNSCANNED) { + // now the nodes unfiltered content + fwrite(address, size, 1, fp); + } + if ((layout & AUTO_OBJECT) == AUTO_OBJECT) { + long theClass = *(long *)address; + if (theClass) pointer_set_add(classes, theClass); + } + }; + + // weak + void (^dump_weak)(const void **, const void *) = ^(const void **address, const void *item) { + char type = WEAK; + fwrite(&type, 1, 1, fp); + fwrite(&address, sizeof(address), 1, fp); + fwrite(&item, sizeof(item), 1, fp); + }; + + auto_zone_dump(zone, dump_stack, dump_registers, dump_local, dump_root, dump_node, dump_weak); + + pointer_set_iterate(classes, ^(long class) { + char type = CLASS; + fwrite(&type, 1, 1, fp); + fwrite(&class, sizeof(class), 1, fp); // write address so that we can map it from node isa's + // classname (for grins) + const char *className = class_getName((Class)class); + unsigned int length = (int)strlen(className); + fwrite(&length, sizeof(length), 1, fp); // n + fwrite(className, length, 1, fp); // n bytes + // strong layout + const char *layout = class_getIvarLayout((Class)class); + length = layout ? (int)strlen(layout)+1 : 0; // format is ending with <0><0> + fwrite(&length, sizeof(length), 1, fp); // n + fwrite(layout, length, 1, fp); // n bytes + // weak layout + layout = class_getWeakIvarLayout((Class)class); + length = layout ? (int)strlen(layout)+1 : 0; // format is ending with <0><0> + fwrite(&length, sizeof(length), 1, fp); // n + fwrite(layout, length, 1, fp); // n bytes + }); + + { + // end + char type = END; + fwrite(&type, 1, 1, fp); + fclose(fp); + pointer_set_dispose(classes); + } + return YES; +} diff --git a/runtime/objc-auto.h b/runtime/objc-auto.h index 002019b..dbd8465 100644 --- a/runtime/objc-auto.h +++ b/runtime/objc-auto.h @@ -24,14 +24,42 @@ #ifndef _OBJC_AUTO_H_ #define _OBJC_AUTO_H_ -#import -#include -#include +#include #include +#include +#include +#include #include +#include + +#if !TARGET_OS_WIN32 +#include +#include +#else +# define WINVER 0x0501 // target Windows XP and later +# define _WIN32_WINNT 0x0501 // target Windows XP and later +# define WIN32_LEAN_AND_MEAN +// workaround: windef.h typedefs BOOL as int +# define BOOL WINBOOL +# include +# undef BOOL +#endif + + +/* GC is unsupported on some architectures. */ + +#if TARGET_OS_EMBEDDED || TARGET_OS_WIN32 +# define OBJC_NO_GC 1 +#endif + +#ifdef OBJC_NO_GC +# define OBJC_GC_EXPORT static +#else +# define OBJC_GC_EXPORT OBJC_EXPORT +#endif -/* Collection utilities */ +/* objc_collect() options */ enum { // choose one OBJC_RATIO_COLLECTION = (0 << 0), // run "ratio" generational collections, then a full @@ -43,37 +71,50 @@ enum { OBJC_WAIT_UNTIL_DONE = (1 << 4), // wait (when possible) for collection to end before returning (when collector is running on dedicated thread) }; -OBJC_EXPORT void objc_collect(unsigned long options); -OBJC_EXPORT BOOL objc_collectingEnabled(void); +/* objc_clear_stack() options */ +enum { + OBJC_CLEAR_RESIDENT_STACK = (1 << 0) +}; + + +/* Collection utilities */ + +OBJC_GC_EXPORT void objc_collect(unsigned long options); +OBJC_GC_EXPORT BOOL objc_collectingEnabled(void); /* GC configuration */ /* Tells collector to wait until specified bytes have been allocated before trying to collect again. */ -OBJC_EXPORT void objc_setCollectionThreshold(size_t threshold); +OBJC_GC_EXPORT void objc_setCollectionThreshold(size_t threshold); /* Tells collector to run a full collection for every ratio generational collections. */ -OBJC_EXPORT void objc_setCollectionRatio(size_t ratio); +OBJC_GC_EXPORT void objc_setCollectionRatio(size_t ratio); /* Tells collector to start collecting on dedicated thread */ -OBJC_EXPORT void objc_startCollectorThread(void); +OBJC_GC_EXPORT void objc_startCollectorThread(void); +/* Atomic update, with write barrier. */ +OBJC_GC_EXPORT BOOL objc_atomicCompareAndSwapPtr(id predicate, id replacement, volatile id *objectLocation) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_NA); +/* "Barrier" version also includes memory barrier. */ +OBJC_GC_EXPORT BOOL objc_atomicCompareAndSwapPtrBarrier(id predicate, id replacement, volatile id *objectLocation) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_NA); // atomic update of a global variable -OBJC_EXPORT BOOL objc_atomicCompareAndSwapGlobal(id predicate, id replacement, volatile id *objectLocation); -OBJC_EXPORT BOOL objc_atomicCompareAndSwapGlobalBarrier(id predicate, id replacement, volatile id *objectLocation); +OBJC_GC_EXPORT BOOL objc_atomicCompareAndSwapGlobal(id predicate, id replacement, volatile id *objectLocation); +OBJC_GC_EXPORT BOOL objc_atomicCompareAndSwapGlobalBarrier(id predicate, id replacement, volatile id *objectLocation); // atomic update of an instance variable -OBJC_EXPORT BOOL objc_atomicCompareAndSwapInstanceVariable(id predicate, id replacement, volatile id *objectLocation); -OBJC_EXPORT BOOL objc_atomicCompareAndSwapInstanceVariableBarrier(id predicate, id replacement, volatile id *objectLocation); +OBJC_GC_EXPORT BOOL objc_atomicCompareAndSwapInstanceVariable(id predicate, id replacement, volatile id *objectLocation); +OBJC_GC_EXPORT BOOL objc_atomicCompareAndSwapInstanceVariableBarrier(id predicate, id replacement, volatile id *objectLocation); + /* Write barriers. Used by the compiler. */ -OBJC_EXPORT id objc_assign_strongCast(id val, id *dest); -OBJC_EXPORT id objc_assign_global(id val, id *dest); -OBJC_EXPORT id objc_assign_ivar(id value, id dest, ptrdiff_t offset); -OBJC_EXPORT void *objc_memmove_collectable(void *dst, const void *src, size_t size); +OBJC_GC_EXPORT id objc_assign_strongCast(id val, id *dest); +OBJC_GC_EXPORT id objc_assign_global(id val, id *dest); +OBJC_GC_EXPORT id objc_assign_ivar(id value, id dest, ptrdiff_t offset); +OBJC_GC_EXPORT void *objc_memmove_collectable(void *dst, const void *src, size_t size); -OBJC_EXPORT id objc_read_weak(id *location); -OBJC_EXPORT id objc_assign_weak(id value, id *location); +OBJC_GC_EXPORT id objc_read_weak(id *location); +OBJC_GC_EXPORT id objc_assign_weak(id value, id *location); // @@ -81,36 +122,108 @@ OBJC_EXPORT id objc_assign_weak(id value, id *location); // /* Tells runtime to issue finalize calls on the main thread only. */ -OBJC_EXPORT void objc_finalizeOnMainThread(Class cls) +OBJC_GC_EXPORT void objc_finalizeOnMainThread(Class cls) AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER_BUT_DEPRECATED; -/* ask if object is scheduled for finalization. Safe only when called from within a finalizer. */ -OBJC_EXPORT BOOL objc_is_finalized(void *ptr); - -enum { - OBJC_CLEAR_RESIDENT_STACK = (1 << 0) -}; +/* Returns true if object has been scheduled for finalization. Can be used to avoid operations that may lead to resurrection, which are fatal. */ +OBJC_GC_EXPORT BOOL objc_is_finalized(void *ptr); /* Stack management */ -OBJC_EXPORT void objc_clear_stack(unsigned long options); +OBJC_GC_EXPORT void objc_clear_stack(unsigned long options); // // Obsolete. Present only until all uses can be migrated to newer API. // -OBJC_EXPORT BOOL objc_collecting_enabled(void); -OBJC_EXPORT void objc_set_collection_threshold(size_t threshold); -OBJC_EXPORT void objc_set_collection_ratio(size_t ratio); -OBJC_EXPORT void objc_start_collector_thread(void); +OBJC_GC_EXPORT BOOL objc_collecting_enabled(void); +OBJC_GC_EXPORT void objc_set_collection_threshold(size_t threshold); +OBJC_GC_EXPORT void objc_set_collection_ratio(size_t ratio); +OBJC_GC_EXPORT void objc_start_collector_thread(void); /* Memory management */ OBJC_EXPORT id objc_allocate_object(Class cls, int extra); -enum { - OBJC_GENERATIONAL = (1 << 0) -}; +/* Register/unregister the current thread with the garbage collector. */ +OBJC_GC_EXPORT void objc_registerThreadWithCollector(); +OBJC_GC_EXPORT void objc_unregisterThreadWithCollector(); + +/* To be called from code which must only execute on a registered thread. */ +/* If the calling thread is unregistered then an error message is emitted and the thread is implicitly registered. */ +OBJC_GC_EXPORT void objc_assertRegisteredThreadWithCollector(); + +#ifdef OBJC_NO_GC + +/* Non-GC versions */ + +static OBJC_INLINE void objc_collect(unsigned long options) { } +static OBJC_INLINE BOOL objc_collectingEnabled(void) { return NO; } +static OBJC_INLINE void objc_setCollectionThreshold(size_t threshold) { } +static OBJC_INLINE void objc_setCollectionRatio(size_t ratio) { } +static OBJC_INLINE void objc_startCollectorThread(void) { } + +#if TARGET_OS_WIN32 +static OBJC_INLINE BOOL objc_atomicCompareAndSwapPtr(id predicate, id replacement, volatile id *objectLocation) + { void *original = InterlockedCompareExchangePointer((void * volatile *)objectLocation, (void *)replacement, (void *)predicate); return (original == predicate); } + +static OBJC_INLINE BOOL objc_atomicCompareAndSwapPtrBarrier(id predicate, id replacement, volatile id *objectLocation) + { void *original = InterlockedCompareExchangePointer((void * volatile *)objectLocation, (void *)replacement, (void *)predicate); return (original == predicate); } +#else +static OBJC_INLINE BOOL objc_atomicCompareAndSwapPtr(id predicate, id replacement, volatile id *objectLocation) + { return OSAtomicCompareAndSwapPtr((void *)predicate, (void *)replacement, (void * volatile *)objectLocation); } + +static OBJC_INLINE BOOL objc_atomicCompareAndSwapPtrBarrier(id predicate, id replacement, volatile id *objectLocation) + { return OSAtomicCompareAndSwapPtrBarrier((void *)predicate, (void *)replacement, (void * volatile *)objectLocation); } +#endif + +static OBJC_INLINE BOOL objc_atomicCompareAndSwapGlobal(id predicate, id replacement, volatile id *objectLocation) + { return objc_atomicCompareAndSwapPtr(predicate, replacement, objectLocation); } + +static OBJC_INLINE BOOL objc_atomicCompareAndSwapGlobalBarrier(id predicate, id replacement, volatile id *objectLocation) + { return objc_atomicCompareAndSwapPtrBarrier(predicate, replacement, objectLocation); } + +static OBJC_INLINE BOOL objc_atomicCompareAndSwapInstanceVariable(id predicate, id replacement, volatile id *objectLocation) + { return objc_atomicCompareAndSwapPtr(predicate, replacement, objectLocation); } + +static OBJC_INLINE BOOL objc_atomicCompareAndSwapInstanceVariableBarrier(id predicate, id replacement, volatile id *objectLocation) + { return objc_atomicCompareAndSwapPtrBarrier(predicate, replacement, objectLocation); } -OBJC_EXPORT void objc_collect_if_needed(unsigned long options); +static OBJC_INLINE id objc_assign_strongCast(id val, id *dest) + { return (*dest = val); } + +static OBJC_INLINE id objc_assign_global(id val, id *dest) + { return (*dest = val); } + +static OBJC_INLINE id objc_assign_ivar(id val, id dest, ptrdiff_t offset) + { return (*(id*)((char *)dest+offset) = val); } + +static OBJC_INLINE void *objc_memmove_collectable(void *dst, const void *src, size_t size) + { return memmove(dst, src, size); } + +static OBJC_INLINE id objc_read_weak(id *location) + { return *location; } + +static OBJC_INLINE id objc_assign_weak(id value, id *location) + { return (*location = value); } + + +static OBJC_INLINE void objc_finalizeOnMainThread(Class cls) { } +static OBJC_INLINE BOOL objc_is_finalized(void *ptr) { return NO; } +static OBJC_INLINE void objc_clear_stack(unsigned long options) { } + +static OBJC_INLINE BOOL objc_collecting_enabled(void) { return NO; } +static OBJC_INLINE void objc_set_collection_threshold(size_t threshold) { } +static OBJC_INLINE void objc_set_collection_ratio(size_t ratio) { } +static OBJC_INLINE void objc_start_collector_thread(void) { } + +OBJC_EXPORT id class_createInstance(Class cls, size_t extraBytes); +static OBJC_INLINE id objc_allocate_object(Class cls, int extra) + { return class_createInstance(cls, extra); } + +static OBJC_INLINE void objc_registerThreadWithCollector() { } +static OBJC_INLINE void objc_unregisterThreadWithCollector() { } +static OBJC_INLINE void objc_assertRegisteredThreadWithCollector() { } + +#endif #endif diff --git a/runtime/objc-auto.m b/runtime/objc-auto.m index e0eee46..f702091 100644 --- a/runtime/objc-auto.m +++ b/runtime/objc-auto.m @@ -21,42 +21,42 @@ * @APPLE_LICENSE_HEADER_END@ */ +#import "objc-auto.h" + +#ifndef OBJC_NO_GC + #import #import #import +#import #import #import #import #import #import +#import + +#import +#include #define OLD 1 #import "objc-private.h" -#import "auto_zone.h" -#import "objc-auto.h" +#import "objc-references.h" #import "objc-rtp.h" #import "maptable.h" +#import "message.h" +#import "objc-gdb.h" + static auto_zone_t *gc_zone_init(void); +static void gc_block_init(void); +static void registeredClassTableInit(void); __private_extern__ BOOL UseGC NOBSS = NO; -static BOOL RecordAllocations = NO; static BOOL MultiThreadedGC = NO; static BOOL WantsMainThreadFinalization = NO; -static BOOL NeedsMainThreadFinalization = NO; - -static struct { - auto_zone_foreach_object_t foreach; - auto_zone_cursor_t cursor; - size_t cursor_size; - volatile BOOL finished; - volatile BOOL started; - pthread_mutex_t mutex; - pthread_cond_t condition; -} BatchFinalizeBlock; - __private_extern__ auto_zone_t *gc_zone = NULL; @@ -64,6 +64,13 @@ __private_extern__ auto_zone_t *gc_zone = NULL; __private_extern__ id (*objc_assign_ivar_internal)(id, id, ptrdiff_t) = objc_assign_ivar; +/* Method prototypes */ +@interface DoesNotExist +- (const char *)UTF8String; +- (id)description; +@end + + /*********************************************************************** * Utility exports * Called by various libraries. @@ -100,17 +107,36 @@ void objc_finalizeOnMainThread(Class cls) { } } +// stack based data structure queued if/when there is main-thread-only finalization work TBD +typedef struct BatchFinalizeBlock { + auto_zone_foreach_object_t foreach; + auto_zone_cursor_t cursor; + size_t cursor_size; + volatile BOOL finished; + volatile BOOL started; + struct BatchFinalizeBlock *next; +} BatchFinalizeBlock_t; + +// The Main Thread Finalization Work Queue Head +static struct { + pthread_mutex_t mutex; + pthread_cond_t condition; + BatchFinalizeBlock_t *head; + BatchFinalizeBlock_t *tail; +} MainThreadWorkQ; + void objc_startCollectorThread(void) { static int didOnce = 0; + if (!UseGC) return; if (!didOnce) { didOnce = 1; - // pretend we're done to start out with. - BatchFinalizeBlock.started = YES; - BatchFinalizeBlock.finished = YES; - pthread_mutex_init(&BatchFinalizeBlock.mutex, NULL); - pthread_cond_init(&BatchFinalizeBlock.condition, NULL); + // initialize the batch finalization queue + MainThreadWorkQ.head = NULL; + MainThreadWorkQ.tail = NULL; + pthread_mutex_init(&MainThreadWorkQ.mutex, NULL); + pthread_cond_init(&MainThreadWorkQ.condition, NULL); auto_collect_multithreaded(gc_zone); MultiThreadedGC = YES; } @@ -127,7 +153,9 @@ void objc_collect(unsigned long options) { BOOL onMainThread = pthread_main_np() ? YES : NO; if (MultiThreadedGC || onMainThread) { + // while we're here, sneak off and do some finalization work (if any) if (MultiThreadedGC && onMainThread) batchFinalizeOnMainThread(); + // now on with our normally scheduled programming auto_collection_mode_t amode = AUTO_COLLECT_RATIO_COLLECTION; switch (options & 0x3) { case OBJC_RATIO_COLLECTION: amode = AUTO_COLLECT_RATIO_COLLECTION; break; @@ -140,44 +168,10 @@ void objc_collect(unsigned long options) { auto_collect(gc_zone, amode, NULL); } else { - objc_msgSend(objc_getClass("NSGarbageCollector"), @selector(_callOnMainThread:withArgs:), objc_collect, (void *)options); - } -} - -// SPI -// 0 - exhaustively NSGarbageCollector.m -// - from AppKit /Developer/Applications/Xcode.app/Contents/MacOS/Xcode via idleTimer -// GENERATIONAL -// - from autoreleasepool -// - several other places -void objc_collect_if_needed(unsigned long options) { - if (!UseGC) return; - BOOL onMainThread = pthread_main_np() ? YES : NO; - - if (MultiThreadedGC || onMainThread) { - auto_collection_mode_t mode; - if (options & OBJC_GENERATIONAL) { - mode = AUTO_COLLECT_IF_NEEDED | AUTO_COLLECT_RATIO_COLLECTION; - } - else { - mode = AUTO_COLLECT_EXHAUSTIVE_COLLECTION; - } - if (MultiThreadedGC && onMainThread) batchFinalizeOnMainThread(); - auto_collect(gc_zone, mode, NULL); - } - else { // XXX could be optimized (e.g. ask auto for threshold check, if so, set ASKING if not already ASKING,... - objc_msgSend(objc_getClass("NSGarbageCollector"), @selector(_callOnMainThread:withArgs:), objc_collect_if_needed, (void *)options); + dispatch_async(dispatch_get_main_queue(), ^{ objc_collect(options); }); } } -// NEVER USED. -size_t objc_numberAllocated(void) -{ - auto_statistics_t stats; - stats.version = 0; - auto_zone_statistics(gc_zone, &stats); - return stats.malloc_statistics.blocks_in_use; -} // USED BY CF & ONE OTHER BOOL objc_isAuto(id object) @@ -190,11 +184,28 @@ BOOL objc_collectingEnabled(void) { return UseGC; } + BOOL objc_collecting_enabled(void) // Old naming { return UseGC; } +BOOL objc_dumpHeap(char *filenamebuffer, unsigned long length) { + static int counter = 0; + ++counter; + char buffer[1024]; + sprintf(buffer, OBJC_HEAP_DUMP_FILENAME_FORMAT, getpid(), counter); + if (!_objc_dumpHeap(gc_zone, buffer)) return NO; + if (filenamebuffer) { + unsigned long blen = strlen(buffer); + if (blen < length) + strncpy(filenamebuffer, buffer, blen+1); + else if (length > 0) + filenamebuffer[0] = 0; // give some answer + } + return YES; +} + /*********************************************************************** * Memory management. @@ -250,7 +261,7 @@ __private_extern__ id objc_assign_ivar_gc(id value, id base, ptrdiff_t offset) if (!auto_zone_set_write_barrier(gc_zone, (char *)base + offset, value)) { __private_extern__ void objc_assign_ivar_error(id base, ptrdiff_t offset); - _objc_inform("GC: %p + %d isn't in the auto_zone, break on objc_assign_ivar_error to debug.\n", base, offset); + _objc_inform("GC: %p + %tu isn't in the auto_zone, break on objc_assign_ivar_error to debug.\n", base, offset); objc_assign_ivar_error(base, offset); } } @@ -303,12 +314,12 @@ id objc_assign_ivar_generic(id value, id dest, ptrdiff_t offset) } } -#if defined(__ppc__) || defined(__i386__) || defined(__x86_64__) +#if defined(__ppc__) || defined(__i386__) // PPC write barriers are in objc-auto-ppc.s // write_barrier_init conditionally stomps those to jump to the _impl versions. -// These 3 functions are defined in objc-auto-i386.s and objc-auto-x86_64.s as +// These 3 functions are defined in objc-auto-i386.s as // the non-GC variants. Under GC, rtp_init stomps them with jumps to // objc_assign_*_gc. @@ -319,7 +330,7 @@ id objc_assign_strongCast(id value, id *dest) { return objc_assign_strongCast_ge id objc_assign_global(id value, id *dest) { return objc_assign_global_generic(value, dest); } id objc_assign_ivar(id value, id dest, ptrdiff_t offset) { return objc_assign_ivar_generic(value, dest, offset); } -// not (defined(__ppc__)) && not defined(__i386__) && not defined(__x86_64__) +// not (defined(__ppc__)) && not defined(__i386__) #endif @@ -332,30 +343,54 @@ void *objc_memmove_collectable(void *dst, const void *src, size_t size) } } +BOOL objc_atomicCompareAndSwapPtr(id predicate, id replacement, volatile id *objectLocation) { + const BOOL issueMemoryBarrier = NO; + if (UseGC) + return auto_zone_atomicCompareAndSwapPtr(gc_zone, (void *)predicate, (void *)replacement, (void * volatile *)objectLocation, issueMemoryBarrier); + else + return OSAtomicCompareAndSwapPtr((void *)predicate, (void *)replacement, (void * volatile *)objectLocation); +} + +BOOL objc_atomicCompareAndSwapPtrBarrier(id predicate, id replacement, volatile id *objectLocation) { + const BOOL issueMemoryBarrier = YES; + if (UseGC) + return auto_zone_atomicCompareAndSwapPtr(gc_zone, (void *)predicate, (void *)replacement, (void * volatile *)objectLocation, issueMemoryBarrier); + else + return OSAtomicCompareAndSwapPtrBarrier((void *)predicate, (void *)replacement, (void * volatile *)objectLocation); +} + BOOL objc_atomicCompareAndSwapGlobal(id predicate, id replacement, volatile id *objectLocation) { + const BOOL isGlobal = YES; + const BOOL issueMemoryBarrier = NO; if (UseGC) - return auto_zone_atomicCompareAndSwap(gc_zone, (void *)predicate, (void *)replacement, (void * volatile *)objectLocation, YES, NO); + return auto_zone_atomicCompareAndSwap(gc_zone, (void *)predicate, (void *)replacement, (void * volatile *)objectLocation, isGlobal, issueMemoryBarrier); else return OSAtomicCompareAndSwapPtr((void *)predicate, (void *)replacement, (void * volatile *)objectLocation); } BOOL objc_atomicCompareAndSwapGlobalBarrier(id predicate, id replacement, volatile id *objectLocation) { + const BOOL isGlobal = YES; + const BOOL issueMemoryBarrier = YES; if (UseGC) - return auto_zone_atomicCompareAndSwap(gc_zone, (void *)predicate, (void *)replacement, (void * volatile *)objectLocation, YES, YES); + return auto_zone_atomicCompareAndSwap(gc_zone, (void *)predicate, (void *)replacement, (void * volatile *)objectLocation, isGlobal, issueMemoryBarrier); else return OSAtomicCompareAndSwapPtrBarrier((void *)predicate, (void *)replacement, (void * volatile *)objectLocation); } BOOL objc_atomicCompareAndSwapInstanceVariable(id predicate, id replacement, volatile id *objectLocation) { + const BOOL isGlobal = NO; + const BOOL issueMemoryBarrier = NO; if (UseGC) - return auto_zone_atomicCompareAndSwap(gc_zone, (void *)predicate, (void *)replacement, (void * volatile *)objectLocation, NO, NO); + return auto_zone_atomicCompareAndSwap(gc_zone, (void *)predicate, (void *)replacement, (void * volatile *)objectLocation, isGlobal, issueMemoryBarrier); else return OSAtomicCompareAndSwapPtr((void *)predicate, (void *)replacement, (void * volatile *)objectLocation); } BOOL objc_atomicCompareAndSwapInstanceVariableBarrier(id predicate, id replacement, volatile id *objectLocation) { + const BOOL isGlobal = NO; + const BOOL issueMemoryBarrier = YES; if (UseGC) - return auto_zone_atomicCompareAndSwap(gc_zone, (void *)predicate, (void *)replacement, (void * volatile *)objectLocation, NO, YES); + return auto_zone_atomicCompareAndSwap(gc_zone, (void *)predicate, (void *)replacement, (void * volatile *)objectLocation, isGlobal, issueMemoryBarrier); else return OSAtomicCompareAndSwapPtrBarrier((void *)predicate, (void *)replacement, (void * volatile *)objectLocation); } @@ -385,6 +420,24 @@ void* objc_assign_strongCast_CF(void* value, void **slot) return value; } +__private_extern__ void gc_fixup_weakreferences(id newObject, id oldObject) { + // fix up weak references if any. + const unsigned char *weakLayout = (const unsigned char *)class_getWeakIvarLayout(newObject->isa); + if (weakLayout) { + void **newPtr = (void **)newObject, **oldPtr = (void **)oldObject; + unsigned char byte; + while ((byte = *weakLayout++)) { + unsigned skips = (byte >> 4); + unsigned weaks = (byte & 0x0F); + newPtr += skips, oldPtr += skips; + while (weaks--) { + *newPtr = NULL; + auto_assign_weak_reference(gc_zone, auto_read_weak_reference(gc_zone, oldPtr), newPtr, NULL); + ++newPtr, ++oldPtr; + } + } + } +} /*********************************************************************** * Weak ivar support @@ -408,6 +461,50 @@ id objc_assign_weak(id value, id *location) { return value; } +/* Associative Reference Support. */ + +id objc_getAssociatedObject(id object, void *key) { + if (UseGC) { + return auto_zone_get_associative_ref(gc_zone, object, key); + } else { + return _object_get_associative_reference(object, key); + } +} + +void objc_setAssociatedObject(id object, void *key, id value, objc_AssociationPolicy policy) { + if (UseGC) { + if ((policy & OBJC_ASSOCIATION_COPY_NONATOMIC) == OBJC_ASSOCIATION_COPY_NONATOMIC) { + value = objc_msgSend(value, @selector(copy)); + } + auto_zone_set_associative_ref(gc_zone, object, key, value); + } else { + // Note, creates a retained reference in non-GC. + _object_set_associative_reference(object, key, value, policy); + } +} + +void objc_removeAssociatedObjects(id object) { + if (UseGC) { + auto_zone_erase_associative_refs(gc_zone, object); + } else { + if (_class_instancesHaveAssociatedObjects(object->isa)) _object_remove_assocations(object); + } +} + +BOOL class_instancesHaveAssociatedObjects(Class cls) { + return _class_instancesHaveAssociatedObjects(cls); +} + +id objc_getAssociatedProperties(id object, Class dataClass) { + id data = objc_getAssociatedObject(object, dataClass); + if (data == nil) { + // FIXME: Need to make this atomic. + data = objc_msgSend(dataClass, @selector(new)); + objc_setAssociatedObject(object, dataClass, data, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + objc_msgSend(data, @selector(release)); + } + return data; +} /*********************************************************************** * Testing tools @@ -449,29 +546,9 @@ static vm_address_t _stack_resident_base() { return stack_resident_base; } -static __attribute__((noinline)) void* _get_stack_pointer() { -#if defined(__i386__) || defined(__ppc__) || defined(__ppc64__) || defined(__x86_64__) - return __builtin_frame_address(0); -#else - return NULL; -#endif -} - void objc_clear_stack(unsigned long options) { if (!UseGC) return; - if (options & OBJC_CLEAR_RESIDENT_STACK) { - // clear just the pages of stack that are currently resident. - vm_address_t stack_resident_base = _stack_resident_base(); - vm_address_t stack_top = (vm_address_t)_get_stack_pointer() - 2 * sizeof(void*); - bzero((void*)stack_resident_base, (stack_top - stack_resident_base)); - } else { - // clear the entire unused stack, regardless of whether it's pages are resident or not. - pthread_t self = pthread_self(); - size_t stack_size = pthread_get_stacksize_np(self); - vm_address_t stack_base = (vm_address_t)pthread_get_stackaddr_np(self) - stack_size; - vm_address_t stack_top = (vm_address_t)_get_stack_pointer() - 2 * sizeof(void*); - bzero((void*)stack_base, stack_top - stack_base); - } + auto_zone_clear_stack(gc_zone, 0); } /*********************************************************************** @@ -484,14 +561,17 @@ static IMP _NSObject_finalize = NULL; static void *finalizing_object; static const char *__crashreporter_info__; -static void finalizeOneObject(void *obj, void *sel) { + +// finalize a single object without fuss +// When there are no main-thread-only classes this is used directly +// Otherwise, it is used indirectly by smarter code that knows main-thread-affinity requirements +static void finalizeOneObject(void *obj, void *ignored) { id object = (id)obj; - SEL selector = (SEL)sel; finalizing_object = obj; __crashreporter_info__ = object_getClassName(obj); /// call -finalize method. - objc_msgSend(object, selector); + objc_msgSend(object, @selector(finalize)); // Call C++ destructors, if any. object_cxxDestruct(object); @@ -499,42 +579,53 @@ static void finalizeOneObject(void *obj, void *sel) { __crashreporter_info__ = NULL; } -static void finalizeOneMainThreadOnlyObject(void *obj, void *sel) { +// finalize object only if it is a main-thread-only object. +// Called only from the main thread. +static void finalizeOneMainThreadOnlyObject(void *obj, void *arg) { id object = (id)obj; Class cls = object->isa; if (cls == NULL) { _objc_fatal("object with NULL ISA passed to finalizeOneMainThreadOnlyObject: %p\n", obj); } if (_class_shouldFinalizeOnMainThread(cls)) { - finalizeOneObject(obj, sel); + finalizeOneObject(obj, NULL); } } -static void finalizeOneAnywhereObject(void *obj, void *sel) { +// finalize one object only if it is not a main-thread-only object +// called from any other thread than the main thread +// Important: if a main-thread-only object is passed, return that fact in the needsMain argument +static void finalizeOneAnywhereObject(void *obj, void *needsMain) { id object = (id)obj; Class cls = object->isa; + bool *needsMainThreadWork = needsMain; if (cls == NULL) { _objc_fatal("object with NULL ISA passed to finalizeOneAnywhereObject: %p\n", obj); } if (!_class_shouldFinalizeOnMainThread(cls)) { - finalizeOneObject(obj, sel); + finalizeOneObject(obj, NULL); } else { - NeedsMainThreadFinalization = YES; + *needsMainThreadWork = true; } } - -static void batchFinalize(auto_zone_t *zone, +// Utility workhorse. +// Set up the expensive @try block and ask the collector to hand the next object to +// our finalizeAnObject function. +// Track and return a boolean that records whether or not any main thread work is necessary. +// (When we know that there are no main thread only objects then the boolean isn't even computed) +static bool batchFinalize(auto_zone_t *zone, auto_zone_foreach_object_t foreach, auto_zone_cursor_t cursor, size_t cursor_size, - void (*finalize)(void *, void*)) + void (*finalizeAnObject)(void *, void*)) { + bool needsMainThreadWork = false; for (;;) { @try { - foreach(cursor, finalize, @selector(finalize)); + foreach(cursor, finalizeAnObject, &needsMainThreadWork); // non-exceptional return means finalization is complete. break; } @catch (id exception) { @@ -544,78 +635,93 @@ static void batchFinalize(auto_zone_t *zone, objc_exception_during_finalize_error(); } } + return needsMainThreadWork; } - -static void batchFinalizeOnMainThread(void) { - pthread_mutex_lock(&BatchFinalizeBlock.mutex); - if (BatchFinalizeBlock.started) { - // main thread got here already - pthread_mutex_unlock(&BatchFinalizeBlock.mutex); +// Called on main thread-only. +// Pick up work from global queue. +// called parasitically by anyone requesting a collection +// called explicitly when there is known to be main thread only finalization work +// In both cases we are on the main thread +// Guard against recursion by something called from a finalizer +static void batchFinalizeOnMainThread() { + pthread_mutex_lock(&MainThreadWorkQ.mutex); + if (!MainThreadWorkQ.head || MainThreadWorkQ.head->started) { + // No work or we're already here + pthread_mutex_unlock(&MainThreadWorkQ.mutex); return; } - BatchFinalizeBlock.started = YES; - pthread_mutex_unlock(&BatchFinalizeBlock.mutex); - - batchFinalize(gc_zone, BatchFinalizeBlock.foreach, BatchFinalizeBlock.cursor, BatchFinalizeBlock.cursor_size, finalizeOneMainThreadOnlyObject); - // signal the collector thread that finalization has finished. - pthread_mutex_lock(&BatchFinalizeBlock.mutex); - BatchFinalizeBlock.finished = YES; - pthread_cond_signal(&BatchFinalizeBlock.condition); - pthread_mutex_unlock(&BatchFinalizeBlock.mutex); + while (MainThreadWorkQ.head) { + BatchFinalizeBlock_t *bfb = MainThreadWorkQ.head; + bfb->started = YES; + pthread_mutex_unlock(&MainThreadWorkQ.mutex); + + batchFinalize(gc_zone, bfb->foreach, bfb->cursor, bfb->cursor_size, finalizeOneMainThreadOnlyObject); + // signal the collector thread(s) that finalization has finished. + pthread_mutex_lock(&MainThreadWorkQ.mutex); + bfb->finished = YES; + pthread_cond_broadcast(&MainThreadWorkQ.condition); + MainThreadWorkQ.head = bfb->next; + } + MainThreadWorkQ.tail = NULL; + pthread_mutex_unlock(&MainThreadWorkQ.mutex); } + +// Knowing that we possibly have main thread only work to do, first process everything +// that is not main-thread-only. If we discover main thread only work, queue a work block +// to the main thread that will do just the main thread only work. Wait for it. +// Called from a non main thread. static void batchFinalizeOnTwoThreads(auto_zone_t *zone, auto_zone_foreach_object_t foreach, auto_zone_cursor_t cursor, size_t cursor_size) { // First, lets get rid of everything we can on this thread, then ask main thread to help if needed - NeedsMainThreadFinalization = NO; char cursor_copy[cursor_size]; memcpy(cursor_copy, cursor, cursor_size); - batchFinalize(zone, foreach, cursor_copy, cursor_size, finalizeOneAnywhereObject); + bool needsMainThreadFinalization = batchFinalize(zone, foreach, (auto_zone_cursor_t)cursor_copy, cursor_size, finalizeOneAnywhereObject); - if (! NeedsMainThreadFinalization) + if (! needsMainThreadFinalization) return; // no help needed // set up the control block. Either our ping of main thread with _callOnMainThread will get to it, or - // an objc_collect_if_needed() will get to it. Either way, this block will be processed on the main thread. - pthread_mutex_lock(&BatchFinalizeBlock.mutex); - BatchFinalizeBlock.foreach = foreach; - BatchFinalizeBlock.cursor = cursor; - BatchFinalizeBlock.cursor_size = cursor_size; - BatchFinalizeBlock.started = NO; - BatchFinalizeBlock.finished = NO; - pthread_mutex_unlock(&BatchFinalizeBlock.mutex); + // an objc_collect(if_needed) will get to it. Either way, this block will be processed on the main thread. + BatchFinalizeBlock_t bfb; + bfb.foreach = foreach; + bfb.cursor = cursor; + bfb.cursor_size = cursor_size; + bfb.started = NO; + bfb.finished = NO; + bfb.next = NULL; + pthread_mutex_lock(&MainThreadWorkQ.mutex); + if (MainThreadWorkQ.tail) { + + // link to end so that ordering of finalization is preserved. + MainThreadWorkQ.tail->next = &bfb; + MainThreadWorkQ.tail = &bfb; + } + else { + MainThreadWorkQ.head = &bfb; + MainThreadWorkQ.tail = &bfb; + } + pthread_mutex_unlock(&MainThreadWorkQ.mutex); //printf("----->asking main thread to finalize\n"); - objc_msgSend(objc_getClass("NSGarbageCollector"), @selector(_callOnMainThread:withArgs:), batchFinalizeOnMainThread, &BatchFinalizeBlock); + dispatch_async(dispatch_get_main_queue(), ^{ batchFinalizeOnMainThread(); }); // wait for the main thread to finish finalizing instances of classes marked CLS_FINALIZE_ON_MAIN_THREAD. - pthread_mutex_lock(&BatchFinalizeBlock.mutex); - while (!BatchFinalizeBlock.finished) pthread_cond_wait(&BatchFinalizeBlock.condition, &BatchFinalizeBlock.mutex); - pthread_mutex_unlock(&BatchFinalizeBlock.mutex); + pthread_mutex_lock(&MainThreadWorkQ.mutex); + while (!bfb.finished) pthread_cond_wait(&MainThreadWorkQ.condition, &MainThreadWorkQ.mutex); + pthread_mutex_unlock(&MainThreadWorkQ.mutex); //printf("<------ main thread finalize done\n"); } -static void objc_will_grow(auto_zone_t *zone, auto_heap_growth_info_t info) { - if (MultiThreadedGC) { - //printf("objc_will_grow %d\n", info); - - if (auto_zone_is_collecting(gc_zone)) { - ; - } - else { - auto_collect(gc_zone, AUTO_COLLECT_RATIO_COLLECTION, NULL); - } - } -} - // collector calls this with garbage ready +// thread collectors, too, so this needs to be thread-safe static void BatchInvalidate(auto_zone_t *zone, auto_zone_foreach_object_t foreach, auto_zone_cursor_t cursor, @@ -633,19 +739,26 @@ static void BatchInvalidate(auto_zone_t *zone, } + +/* + * Zombie support + * Collector calls into this system when it finds resurrected objects. + * This keeps them pitifully alive and leaked, even if they reference garbage. + */ + // idea: keep a side table mapping resurrected object pointers to their original Class, so we don't // need to smash anything. alternatively, could use associative references to track against a secondary // object with information about the resurrection, such as a stack crawl, etc. static Class _NSResurrectedObjectClass; static NXMapTable *_NSResurrectedObjectMap = NULL; -static OBJC_DECLARE_LOCK(_NSResurrectedObjectLock); +static pthread_mutex_t _NSResurrectedObjectLock = PTHREAD_MUTEX_INITIALIZER; static Class resurrectedObjectOriginalClass(id object) { Class originalClass; - OBJC_LOCK(&_NSResurrectedObjectLock); + pthread_mutex_lock(&_NSResurrectedObjectLock); originalClass = (Class) NXMapGet(_NSResurrectedObjectMap, object); - OBJC_UNLOCK(&_NSResurrectedObjectLock); + pthread_mutex_unlock(&_NSResurrectedObjectLock); return originalClass; } @@ -658,9 +771,9 @@ static id _NSResurrectedObject_instanceMethod(id self, SEL name) { static void _NSResurrectedObject_finalize(id self, SEL _cmd) { Class originalClass; - OBJC_LOCK(&_NSResurrectedObjectLock); + pthread_mutex_lock(&_NSResurrectedObjectLock); originalClass = (Class) NXMapRemove(_NSResurrectedObjectMap, self); - OBJC_UNLOCK(&_NSResurrectedObjectLock); + pthread_mutex_unlock(&_NSResurrectedObjectLock); if (originalClass) _objc_inform("**resurrected** object %p of class %s being finalized\n", self, class_getName(originalClass)); _NSObject_finalize(self, _cmd); } @@ -690,9 +803,9 @@ static void resurrectZombie(auto_zone_t *zone, void *ptr) { Class cls = object->isa; if (cls != _NSResurrectedObjectClass) { // remember the original class for this instance. - OBJC_LOCK(&_NSResurrectedObjectLock); + pthread_mutex_lock(&_NSResurrectedObjectLock); NXMapInsert(_NSResurrectedObjectMap, ptr, cls); - OBJC_UNLOCK(&_NSResurrectedObjectLock); + pthread_mutex_unlock(&_NSResurrectedObjectLock); object->isa = _NSResurrectedObjectClass; } } @@ -714,44 +827,45 @@ static char* objc_name_for_address(auto_zone_t *zone, vm_address_t base, vm_addr * Collection support **********************************************************************/ +static BOOL objc_isRegisteredClass(Class candidate); + static const unsigned char *objc_layout_for_address(auto_zone_t *zone, void *address) { Class cls = *(Class *)address; + if (!objc_isRegisteredClass(cls)) return NULL; return (const unsigned char *)class_getIvarLayout(cls); } static const unsigned char *objc_weak_layout_for_address(auto_zone_t *zone, void *address) { Class cls = *(Class *)address; + if (!objc_isRegisteredClass(cls)) return NULL; return (const unsigned char *)class_getWeakIvarLayout(cls); } -/*********************************************************************** -* Initialization -**********************************************************************/ +__private_extern__ void gc_register_datasegment(uintptr_t base, size_t size) { + auto_zone_register_datasegment(gc_zone, (void*)base, size); +} -// Always called by _objcInit, even if GC is off. -__private_extern__ void gc_init(BOOL on) -{ - UseGC = on; +__private_extern__ void gc_unregister_datasegment(uintptr_t base, size_t size) { + auto_zone_unregister_datasegment(gc_zone, (void*)base, size); +} - if (PrintGC) { - _objc_inform("GC: is %s", on ? "ON" : "OFF"); - } - if (UseGC) { - // Add GC state to crash log reports - _objc_inform_on_crash("garbage collection is ON"); +/*********************************************************************** +* Initialization +**********************************************************************/ - // Set up the GC zone - gc_zone = gc_zone_init(); - - // no NSObject until Foundation calls objc_collect_init() - _NSObject_finalize = &_objc_msgForward; +static void objc_will_grow(auto_zone_t *zone, auto_heap_growth_info_t info) { + if (MultiThreadedGC) { + //printf("objc_will_grow %d\n", info); - } else { - auto_zone_start_monitor(false); - auto_zone_set_class_list((int (*)(void **, int))objc_getClassList); + if (auto_zone_is_collecting(gc_zone)) { + ; + } + else { + auto_collect(gc_zone, AUTO_COLLECT_RATIO_COLLECTION, NULL); + } } } @@ -777,13 +891,68 @@ static auto_zone_t *gc_zone_init(void) } +/* should be defined in /usr/local/include/libdispatch_private.h. */ +extern void (*dispatch_begin_thread_4GC)(void); +extern void (*dispatch_end_thread_4GC)(void); + +void objc_registerThreadWithCollector() +{ + if (UseGC) auto_zone_register_thread(gc_zone); +} + +void objc_unregisterThreadWithCollector() +{ + if (UseGC) auto_zone_unregister_thread(gc_zone); +} + +void objc_assertRegisteredThreadWithCollector() +{ + if (UseGC) auto_zone_assert_thread_registered(gc_zone); +} + +// Always called by _objcInit, even if GC is off. +__private_extern__ void gc_init(BOOL on) +{ + UseGC = on; + + if (PrintGC) { + _objc_inform("GC: is %s", on ? "ON" : "OFF"); + } + + if (UseGC) { + // Add GC state to crash log reports + _objc_inform_on_crash("garbage collection is ON"); + + // Set up the GC zone + gc_zone = gc_zone_init(); + + // no NSObject until Foundation calls objc_collect_init() + _NSObject_finalize = &_objc_msgForward_internal; + + // set up the registered classes list + registeredClassTableInit(); + + // tell Blocks to use collectable memory. CF will cook up the classes separately. + gc_block_init(); + + // tell libdispatch to register its threads with the GC. + dispatch_begin_thread_4GC = objc_registerThreadWithCollector; + dispatch_end_thread_4GC = objc_unregisterThreadWithCollector; + } else { + auto_zone_start_monitor(false); + auto_zone_set_class_list((int (*)(void **, int))objc_getClassList); + } +} + + + // Called by Foundation to install auto's interruption callback. malloc_zone_t *objc_collect_init(int (*callback)(void)) { // Find NSObject's finalize method now that Foundation is loaded. // fixme only look for the base implementation, not a category's _NSObject_finalize = class_getMethodImplementation(objc_getClass("NSObject"), @selector(finalize)); - if (_NSObject_finalize == &_objc_msgForward) { + if (_NSObject_finalize == &_objc_msgForward /* not _internal! */) { _objc_fatal("GC: -[NSObject finalize] unimplemented!"); } @@ -793,27 +962,191 @@ malloc_zone_t *objc_collect_init(int (*callback)(void)) return (malloc_zone_t *)gc_zone; } +/* + * Support routines for the Block implementation + */ + +// The Block runtime now needs to sometimes allocate a Block that is an Object - namely +// when it neesd to have a finalizer which, for now, is only if there are C++ destructors +// in the helper function. Hence the isObject parameter. +// Under GC a -copy message should allocate a refcount 0 block, ergo the isOne parameter. +static void *block_gc_alloc5(const unsigned long size, const bool isOne, const bool isObject) { + auto_memory_type_t type = isObject ? (AUTO_OBJECT|AUTO_MEMORY_SCANNED) : AUTO_MEMORY_SCANNED; + return auto_zone_allocate_object(gc_zone, size, type, isOne, false); +} + +// The Blocks runtime keeps track of everything above 1 and so it only calls +// up to the collector to tell it about the 0->1 transition and then the 1->0 transition +static void block_gc_setHasRefcount(const void *block, const bool hasRefcount) { + if (hasRefcount) + auto_zone_retain(gc_zone, (void *)block); + else + auto_zone_release(gc_zone, (void *)block); +} + +static void block_gc_memmove(void *dst, void *src, unsigned long size) { + auto_zone_write_barrier_memmove(gc_zone, dst, src, (size_t)size); +} +// Initialize the Block subsystem iff running under GC. +static void gc_block_init(void) { + // set up the callout functions that enable _Block_copy to do the right thing under GC + _Block_use_GC( + block_gc_alloc5, + block_gc_setHasRefcount, + (void (*)(void *, void **))objc_assign_strongCast_gc, + (void (*)(const void *, void *))objc_assign_weak, + block_gc_memmove + ); +} /*********************************************************************** -* Debugging +* Track classes. +* In addition to the global class hashtable (set) indexed by name, we +* also keep one based purely by pointer when running under Garbage Collection. +* This allows the background collector to race against objects recycled from TLC. +* Specifically, the background collector can read the admin byte and see that +* a thread local object is an object, get scheduled out, and the TLC recovers it, +* linking it into the cache, then the background collector reads the isa field and +* finds linkage info. By qualifying all isa fields read we avoid this. **********************************************************************/ -/* This is non-deadlocking with respect to malloc's locks EXCEPT: - * %ls, %a, %A formats - * more than 8 args - */ -static void objc_debug_printf(const char *format, ...) -{ - va_list ap; - va_start(ap, format); - vfprintf(stderr, format, ap); - va_end(ap); +// This is a self-contained hash table of all classes. The first two elements contain the (size-1) and count. +static volatile Class *AllClasses = nil; + +#define SHIFT 3 +#define INITIALSIZE 512 +#define REMOVED -1 + +// Allocate the side table. +static void registeredClassTableInit() { + assert(UseGC); + // allocate a collectable (refcount 0) zeroed hunk of unscanned memory + uintptr_t *table = (uintptr_t *)auto_zone_allocate_object(gc_zone, INITIALSIZE*sizeof(void *), AUTO_MEMORY_UNSCANNED, false, true); + // set initial capacity (as mask) + table[0] = INITIALSIZE - 1; + // set initial count + table[1] = 0; + // register it so that the collector will keep it around. We could instead allocate it refcount 1 and then decr when done. + auto_zone_add_root(gc_zone, &AllClasses, table); +} + +// Verify that a particular pointer is to a class. +// Safe from any thread anytime +static BOOL objc_isRegisteredClass(Class candidate) { + assert(UseGC); + // We don't care about a race with another thread adding a class to which we randomly might have a pointer + // Get local copy of classes so that we're immune from updates. + // We keep the size of the list as the first element so there is no race as the list & size get updated. + uintptr_t *allClasses = (uintptr_t *)AllClasses; + // Slot 0 is always the size of the list in log 2 masked terms (e.g. size - 1) where size is always power of 2 + // Slot 1 is count + uintptr_t slot = (((uintptr_t)candidate) >> SHIFT) & allClasses[0]; + // avoid slot 0 and 1 + if (slot < 2) slot = 2; + for(;;) { + long int slotValue = allClasses[slot]; + if (slotValue == (long int)candidate) { + return YES; + } + if (slotValue == 0) { + return NO; + } + ++slot; + if (slot > allClasses[0]) + slot = 2; // skip size, count + } +} + +// Utility used when growing +// Assumes lock held +static void addClassHelper(uintptr_t *table, uintptr_t candidate) { + uintptr_t slot = (((long int)candidate) >> SHIFT) & table[0]; + if (slot < 2) slot = 2; + for(;;) { + uintptr_t slotValue = table[slot]; + if (slotValue == 0) { + table[slot] = candidate; + ++table[1]; + return; + } + ++slot; + if (slot > table[0]) + slot = 2; // skip size, count + } } +// lock held by callers +__private_extern__ +void objc_addRegisteredClass(Class candidate) { + if (!UseGC) return; + uintptr_t *table = (uintptr_t *)AllClasses; + // Slot 0 is always the size of the list in log 2 masked terms (e.g. size - 1) where size is always power of 2 + // Slot 1 is count - always non-zero + uintptr_t slot = (((long int)candidate) >> SHIFT) & table[0]; + if (slot < 2) slot = 2; + for(;;) { + uintptr_t slotValue = table[slot]; + assert(slotValue != (uintptr_t)candidate); + if (slotValue == REMOVED) { + table[slot] = (long)candidate; + return; + } + else if (slotValue == 0) { + table[slot] = (long)candidate; + if (2*++table[1] > table[0]) { // add to count; check if we cross 50% utilization + // grow + uintptr_t oldSize = table[0]+1; + uintptr_t *newTable = (uintptr_t *)auto_zone_allocate_object(gc_zone, oldSize*2*sizeof(void *), AUTO_MEMORY_UNSCANNED, false, true); + uintptr_t i; + newTable[0] = 2*oldSize - 1; + newTable[1] = 0; + for (i = 2; i < oldSize; ++i) { + if (table[i] && table[i] != REMOVED) + addClassHelper(newTable, table[i]); + } + // this does the write-barrier. Don't use objc_assignGlobal because it trips a linker error on 64-bit. + auto_zone_add_root(gc_zone, &AllClasses, newTable); + } + return; + } + ++slot; + if (slot > table[0]) + slot = 2; // skip size, count + } +} + +// lock held by callers +__private_extern__ +void objc_removeRegisteredClass(Class candidate) { + if (!UseGC) return; + uintptr_t *table = (uintptr_t *)AllClasses; + // Slot 0 is always the size of the list in log 2 masked terms (e.g. size - 1) where size is always power of 2 + // Slot 1 is count - always non-zero + uintptr_t slot = (((uintptr_t)candidate) >> SHIFT) & table[0]; + if (slot < 2) slot = 2; + for(;;) { + uintptr_t slotValue = table[slot]; + if (slotValue == (uintptr_t)candidate) { + table[slot] = REMOVED; // if next slot == 0 we could set to 0 here and decr count + return; + } + assert(slotValue != 0); + ++slot; + if (slot > table[0]) + slot = 2; // skip size, count + } +} + + +/*********************************************************************** +* Debugging - support for smart printouts when errors occur +**********************************************************************/ + + static malloc_zone_t *objc_debug_zone(void) { static malloc_zone_t *z = NULL; @@ -835,14 +1168,18 @@ static char *_malloc_append_unsigned(uintptr_t value, unsigned base, char *head) return head+1; } -static void strcati(char *str, uintptr_t value) +static void strlcati(char *str, uintptr_t value, size_t bufSize) { + if ( (bufSize - strlen(str)) < 30) + return; str = _malloc_append_unsigned(value, 10, str + strlen(str)); str[0] = '\0'; } -static void strcatx(char *str, uintptr_t value) +static void strlcatx(char *str, uintptr_t value, size_t bufSize) { + if ( (bufSize- strlen(str)) < 30) + return; str = _malloc_append_unsigned(value, 16, str + strlen(str)); str[0] = '\0'; } @@ -851,7 +1188,7 @@ static void strcatx(char *str, uintptr_t value) static Ivar ivar_for_offset(Class cls, vm_address_t offset) { int i; - int ivar_offset; + ptrdiff_t ivar_offset; Ivar super_ivar, result; Ivar *ivars; unsigned int ivar_count; @@ -865,6 +1202,7 @@ static Ivar ivar_for_offset(Class cls, vm_address_t offset) ivars = class_copyIvarList(cls, &ivar_count); if (ivars && ivar_count) { // Try our first ivar. If it's too big, use super's best ivar. + // (lose 64-bit precision) ivar_offset = ivar_getOffset(ivars[0]); if (ivar_offset > offset) result = super_ivar; else if (ivar_offset == offset) result = ivars[0]; @@ -892,34 +1230,34 @@ static Ivar ivar_for_offset(Class cls, vm_address_t offset) return result; } -static void append_ivar_at_offset(char *buf, Class cls, vm_address_t offset) +static void append_ivar_at_offset(char *buf, Class cls, vm_address_t offset, size_t bufSize) { Ivar ivar = NULL; if (offset == 0) return; // don't bother with isa if (offset >= class_getInstanceSize(cls)) { - strcat(buf, ".+"); - strcati(buf, offset); + strlcat(buf, ".+", bufSize); + strlcati(buf, offset, bufSize); return; } ivar = ivar_for_offset(cls, offset); if (!ivar) { - strcat(buf, "."); + strlcat(buf, ".", bufSize); return; } // fixme doesn't handle structs etc. - strcat(buf, "."); + strlcat(buf, ".", bufSize); const char *ivar_name = ivar_getName(ivar); - if (ivar_name) strcat(buf, ivar_name); - else strcat(buf, ""); + if (ivar_name) strlcat(buf, ivar_name, bufSize); + else strlcat(buf, "", bufSize); offset -= ivar_getOffset(ivar); if (offset > 0) { - strcat(buf, "+"); - strcati(buf, offset); + strlcat(buf, "+", bufSize); + strlcati(buf, offset, bufSize); } } @@ -961,698 +1299,64 @@ static const char *cf_class_for_object(void *cfobj) static char *name_for_address(auto_zone_t *zone, vm_address_t base, vm_address_t offset, int withRetainCount) { #define APPEND_SIZE(s) \ - strcat(buf, "["); \ - strcati(buf, s); \ - strcat(buf, "]"); + strlcat(buf, "[", sizeof(buf)); \ + strlcati(buf, s, sizeof(buf)); \ + strlcat(buf, "]", sizeof(buf)); - char buf[500]; + char buf[1500]; char *result; buf[0] = '\0'; size_t size = - auto_zone_size_no_lock(zone, (void *)base); + auto_zone_size(zone, (void *)base); auto_memory_type_t type = size ? - auto_zone_get_layout_type_no_lock(zone, (void *)base) : AUTO_TYPE_UNKNOWN; + auto_zone_get_layout_type(zone, (void *)base) : AUTO_TYPE_UNKNOWN; unsigned int refcount = size ? - auto_zone_retain_count_no_lock(zone, (void *)base) : 0; + auto_zone_retain_count(zone, (void *)base) : 0; switch (type) { case AUTO_OBJECT_SCANNED: case AUTO_OBJECT_UNSCANNED: { const char *class_name = object_getClassName((id)base); - if (0 == strcmp(class_name, "NSCFType")) { - strcat(buf, cf_class_for_object((void *)base)); + if ((0 == strcmp(class_name, "__NSCFType")) || (0 == strcmp(class_name, "NSCFType"))) { + strlcat(buf, cf_class_for_object((void *)base), sizeof(buf)); } else { - strcat(buf, class_name); + strlcat(buf, class_name, sizeof(buf)); } if (offset) { - append_ivar_at_offset(buf, object_getClass((id)base), offset); + append_ivar_at_offset(buf, object_getClass((id)base), offset, sizeof(buf)); } APPEND_SIZE(size); break; } case AUTO_MEMORY_SCANNED: - strcat(buf, "{conservative-block}"); + strlcat(buf, "{conservative-block}", sizeof(buf)); APPEND_SIZE(size); break; case AUTO_MEMORY_UNSCANNED: - strcat(buf, "{no-pointers-block}"); + strlcat(buf, "{no-pointers-block}", sizeof(buf)); APPEND_SIZE(size); break; default: - strcat(buf, "{unallocated-or-stack}"); + strlcat(buf, "{unallocated-or-stack}", sizeof(buf)); } if (withRetainCount && refcount > 0) { - strcat(buf, " [[refcount="); - strcati(buf, refcount); - strcat(buf, "]]"); + strlcat(buf, " [[refcount=", sizeof(buf)); + strlcati(buf, refcount, sizeof(buf)); + strlcat(buf, "]]", sizeof(buf)); } result = malloc_zone_malloc(objc_debug_zone(), 1 + strlen(buf)); - strcpy(result, buf); + strlcpy(result, buf, sizeof(buf)); return result; #undef APPEND_SIZE } -struct objc_class_recorder_context { - malloc_zone_t *zone; - void *cls; - char *clsname; - unsigned int count; -}; - -static void objc_class_recorder(task_t task, void *context, unsigned type_mask, - vm_range_t *ranges, unsigned range_count) -{ - struct objc_class_recorder_context *ctx = - (struct objc_class_recorder_context *)context; - - vm_range_t *r; - vm_range_t *end; - for (r = ranges, end = ranges + range_count; r < end; r++) { - auto_memory_type_t type = - auto_zone_get_layout_type_no_lock(ctx->zone, (void *)r->address); - if (type == AUTO_OBJECT_SCANNED || type == AUTO_OBJECT_UNSCANNED) { - // Check if this is an instance of class ctx->cls or some subclass - Class cls; - Class isa = *(Class *)r->address; - for (cls = isa; cls; cls = _class_getSuperclass(cls)) { - if (cls == ctx->cls) { - unsigned int rc; - objc_debug_printf("[%p] : %s", r->address, _class_getName(isa)); - if ((rc = auto_zone_retain_count_no_lock(ctx->zone, (void *)r->address))) { - objc_debug_printf(" [[refcount %u]]", rc); - } - objc_debug_printf("\n"); - ctx->count++; - break; - } - } - } - } -} - -__private_extern__ void objc_enumerate_class(char *clsname) -{ - struct objc_class_recorder_context ctx; - ctx.zone = auto_zone(); - ctx.clsname = clsname; - ctx.cls = objc_getClass(clsname); // GrP fixme may deadlock if classHash lock is already owned - ctx.count = 0; - if (!ctx.cls) { - objc_debug_printf("No class '%s'\n", clsname); - return; - } - objc_debug_printf("\n\nINSTANCES OF CLASS '%s':\n\n", clsname); - (*ctx.zone->introspect->enumerator)(mach_task_self(), &ctx, MALLOC_PTR_IN_USE_RANGE_TYPE, (vm_address_t)ctx.zone, NULL, objc_class_recorder); - objc_debug_printf("\n%d instances\n\n", ctx.count); -} - - -static void objc_reference_printer(auto_zone_t *zone, void *ctx, - auto_reference_t ref) -{ - char *referrer_name = name_for_address(zone, ref.referrer_base, ref.referrer_offset, true); - char *referent_name = name_for_address(zone, ref.referent, 0, true); - - objc_debug_printf("[%p%+d -> %p] : %s -> %s\n", - ref.referrer_base, ref.referrer_offset, ref.referent, - referrer_name, referent_name); - - malloc_zone_free(objc_debug_zone(), referrer_name); - malloc_zone_free(objc_debug_zone(), referent_name); -} - - -__private_extern__ void objc_print_references(void *referent, void *stack_bottom, int lock) -{ - if (lock) { - auto_enumerate_references(auto_zone(), referent, - objc_reference_printer, stack_bottom, NULL); - } else { - auto_enumerate_references_no_lock(auto_zone(), referent, - objc_reference_printer, stack_bottom, NULL); - } -} - - - -typedef struct { - vm_address_t address; // of this object - int refcount; // of this object - nonzero means ROOT - int depth; // number of links away from referent, or -1 - auto_reference_t *referrers; // of this object - int referrers_used; - int referrers_allocated; - auto_reference_t back; // reference from this object back toward the target - uint32_t ID; // Graphic ID for grafflization -} blob; - - -typedef struct { - blob **list; - unsigned int used; - unsigned int allocated; -} blob_queue; - -static blob_queue blobs = {NULL, 0, 0}; -static blob_queue untraced_blobs = {NULL, 0, 0}; -static blob_queue root_blobs = {NULL, 0, 0}; - - -static void spin(void) { - static time_t t = 0; - time_t now = time(NULL); - if (t != now) { - objc_debug_printf("."); - t = now; - } -} - - -static void enqueue_blob(blob_queue *q, blob *b) -{ - if (q->used == q->allocated) { - q->allocated = q->allocated * 2 + 1; - q->list = malloc_zone_realloc(objc_debug_zone(), q->list, q->allocated * sizeof(blob *)); - } - q->list[q->used++] = b; -} - - -static blob *dequeue_blob(blob_queue *q) -{ - blob *result = q->list[0]; - q->used--; - memmove(&q->list[0], &q->list[1], q->used * sizeof(blob *)); - return result; -} - - -static blob *blob_for_address(vm_address_t addr) -{ - blob *b, **bp, **end; - - if (addr == 0) return NULL; - - for (bp = blobs.list, end = blobs.list+blobs.used; bp < end; bp++) { - b = *bp; - if (b->address == addr) return b; - } - - b = malloc_zone_calloc(objc_debug_zone(), sizeof(blob), 1); - b->address = addr; - b->depth = -1; - b->refcount = auto_zone_size_no_lock(auto_zone(), (void *)addr) ? auto_zone_retain_count_no_lock(auto_zone(), (void *)addr) : 1; - enqueue_blob(&blobs, b); - return b; -} - -static int blob_exists(vm_address_t addr) -{ - blob *b, **bp, **end; - for (bp = blobs.list, end = blobs.list+blobs.used; bp < end; bp++) { - b = *bp; - if (b->address == addr) return 1; - } - return 0; -} - - -// Destroy the blobs table and all blob data in it -static void free_blobs(void) -{ - blob *b, **bp, **end; - for (bp = blobs.list, end = blobs.list+blobs.used; bp < end; bp++) { - b = *bp; - malloc_zone_free(objc_debug_zone(), b); - } - if (blobs.list) malloc_zone_free(objc_debug_zone(), blobs.list); -} - -static void print_chain(auto_zone_t *zone, blob *root) -{ - blob *b; - for (b = root; b != NULL; b = blob_for_address(b->back.referent)) { - char *name; - if (b->back.referent) { - name = name_for_address(zone, b->address, b->back.referrer_offset, true); - objc_debug_printf("[%p%+d] : %s ->\n", b->address, b->back.referrer_offset, name); - } else { - name = name_for_address(zone, b->address, 0, true); - objc_debug_printf("[%p] : %s\n", b->address, name); - } - malloc_zone_free(objc_debug_zone(), name); - } -} - - -static void objc_blob_recorder(auto_zone_t *zone, void *ctx, - auto_reference_t ref) -{ - blob *b = (blob *)ctx; - - spin(); - - if (b->referrers_used == b->referrers_allocated) { - b->referrers_allocated = b->referrers_allocated * 2 + 1; - b->referrers = malloc_zone_realloc(objc_debug_zone(), b->referrers, - b->referrers_allocated * - sizeof(auto_reference_t)); - } - - b->referrers[b->referrers_used++] = ref; - if (!blob_exists(ref.referrer_base)) { - enqueue_blob(&untraced_blobs, blob_for_address(ref.referrer_base)); - } -} - - -#define INSTANCE_ROOTS 1 -#define HEAP_ROOTS 2 -#define ALL_REFS 3 -static void objc_print_recursive_refs(vm_address_t target, int which, void *stack_bottom, int lock); -static void grafflize(blob_queue *blobs, int everything); - -__private_extern__ void objc_print_instance_roots(vm_address_t target, void *stack_bottom, int lock) -{ - objc_print_recursive_refs(target, INSTANCE_ROOTS, stack_bottom, lock); -} - -__private_extern__ void objc_print_heap_roots(vm_address_t target, void *stack_bottom, int lock) -{ - objc_print_recursive_refs(target, HEAP_ROOTS, stack_bottom, lock); -} - -__private_extern__ void objc_print_all_refs(vm_address_t target, void *stack_bottom, int lock) -{ - objc_print_recursive_refs(target, ALL_REFS, stack_bottom, lock); -} - -static void sort_blobs_by_refcount(blob_queue *blobs) -{ - int i, j; - - // simple bubble sort - for (i = 0; i < blobs->used; i++) { - for (j = i+1; j < blobs->used; j++) { - if (blobs->list[i]->refcount < blobs->list[j]->refcount) { - blob *temp = blobs->list[i]; - blobs->list[i] = blobs->list[j]; - blobs->list[j] = temp; - } - } - } -} - - -static void sort_blobs_by_depth(blob_queue *blobs) -{ - int i, j; - - // simple bubble sort - for (i = 0; i < blobs->used; i++) { - for (j = i+1; j < blobs->used; j++) { - if (blobs->list[i]->depth > blobs->list[j]->depth) { - blob *temp = blobs->list[i]; - blobs->list[i] = blobs->list[j]; - blobs->list[j] = temp; - } - } - } -} - - -static void objc_print_recursive_refs(vm_address_t target, int which, void *stack_bottom, int lock) -{ - objc_debug_printf("\n "); // make spinner draw in a pretty place - - // Construct pointed-to graph (of things eventually pointing to target) - - enqueue_blob(&untraced_blobs, blob_for_address(target)); - - while (untraced_blobs.used > 0) { - blob *b = dequeue_blob(&untraced_blobs); - spin(); - if (lock) { - auto_enumerate_references(auto_zone(), (void *)b->address, - objc_blob_recorder, stack_bottom, b); - } else { - auto_enumerate_references_no_lock(auto_zone(), (void *)b->address, - objc_blob_recorder, stack_bottom, b); - } - } - - // Walk pointed-to graph to find shortest paths from roots to target. - // This is BREADTH-FIRST order. - - blob_for_address(target)->depth = 0; - enqueue_blob(&untraced_blobs, blob_for_address(target)); - - while (untraced_blobs.used > 0) { - blob *b = dequeue_blob(&untraced_blobs); - blob *other; - auto_reference_t *r, *end; - int stop = NO; - - spin(); - - if (which == ALL_REFS) { - // Never stop at roots. - stop = NO; - } else if (which == HEAP_ROOTS) { - // Stop at any root (a block with positive retain count) - stop = (b->refcount > 0); - } else if (which == INSTANCE_ROOTS) { - // Only stop at roots that are instances - auto_memory_type_t type = auto_zone_get_layout_type_no_lock(auto_zone(), (void *)b->address); - stop = (b->refcount > 0 && (type == AUTO_OBJECT_SCANNED || type == AUTO_OBJECT_UNSCANNED)); // GREG XXX ??? - } - - // If this object is a root, save it and don't walk its referrers. - if (stop) { - enqueue_blob(&root_blobs, b); - continue; - } - - // For any "other object" that points to "this object" - // and does not yet have a depth: - // (1) other object is one level deeper than this object - // (2) (one of) the shortest path(s) from other object to the - // target goes through this object - - for (r = b->referrers, end = b->referrers + b->referrers_used; - r < end; - r++) - { - other = blob_for_address(r->referrer_base); - if (other->depth == -1) { - other->depth = b->depth + 1; - other->back = *r; - enqueue_blob(&untraced_blobs, other); - } - } - } - - { - char *name = name_for_address(auto_zone(), target, 0, true); - objc_debug_printf("\n\n%d %s %p (%s)\n\n", - (which==ALL_REFS) ? blobs.used : root_blobs.used, - (which==ALL_REFS) ? "INDIRECT REFS TO" : "ROOTS OF", - target, name); - malloc_zone_free(objc_debug_zone(), name); - } - - if (which == ALL_REFS) { - // Print all reference objects, biggest refcount first - int i; - sort_blobs_by_refcount(&blobs); - for (i = 0; i < blobs.used; i++) { - char *name = name_for_address(auto_zone(), blobs.list[i]->address, 0, true); - objc_debug_printf("[%p] : %s\n", blobs.list[i]->address, name); - malloc_zone_free(objc_debug_zone(), name); - } - } - else { - // Walk back chain from every root to the target, printing every step. - - while (root_blobs.used > 0) { - blob *root = dequeue_blob(&root_blobs); - print_chain(auto_zone(), root); - objc_debug_printf("\n"); - } - } - - grafflize(&blobs, which == ALL_REFS); - - objc_debug_printf("\ndone\n\n"); - - // Clean up - - free_blobs(); - if (untraced_blobs.list) malloc_zone_free(objc_debug_zone(), untraced_blobs.list); - if (root_blobs.list) malloc_zone_free(objc_debug_zone(), root_blobs.list); - - memset(&blobs, 0, sizeof(blobs)); - memset(&root_blobs, 0, sizeof(root_blobs)); - memset(&untraced_blobs, 0, sizeof(untraced_blobs)); -} - - - -struct objc_block_recorder_context { - malloc_zone_t *zone; - int fd; - unsigned int count; -}; - - -static void objc_block_recorder(task_t task, void *context, unsigned type_mask, - vm_range_t *ranges, unsigned range_count) -{ - char buf[20]; - struct objc_block_recorder_context *ctx = - (struct objc_block_recorder_context *)context; - - vm_range_t *r; - vm_range_t *end; - for (r = ranges, end = ranges + range_count; r < end; r++) { - char *name = name_for_address(ctx->zone, r->address, 0, true); - buf[0] = '\0'; - strcatx(buf, r->address); - - write(ctx->fd, "0x", 2); - write(ctx->fd, buf, strlen(buf)); - write(ctx->fd, " ", 1); - write(ctx->fd, name, strlen(name)); - write(ctx->fd, "\n", 1); - - malloc_zone_free(objc_debug_zone(), name); - ctx->count++; - } -} - - -__private_extern__ void objc_dump_block_list(const char* path) -{ - struct objc_block_recorder_context ctx; - char filename[] = "/tmp/blocks-XXXXX.txt"; - - ctx.zone = auto_zone(); - ctx.count = 0; - ctx.fd = (path ? open(path, O_WRONLY | O_CREAT | O_TRUNC, 0666) : mkstemps(filename, (int)strlen(strrchr(filename, '.')))); - - objc_debug_printf("\n\nALL AUTO-ALLOCATED BLOCKS\n\n"); - (*ctx.zone->introspect->enumerator)(mach_task_self(), &ctx, MALLOC_PTR_IN_USE_RANGE_TYPE, (vm_address_t)ctx.zone, NULL, objc_block_recorder); - objc_debug_printf("%d blocks written to file\n", ctx.count); - objc_debug_printf("open %s\n", (path ? path : filename)); - - close(ctx.fd); -} - - - - -static void grafflize_id(int gfile, int ID) -{ - char buf[20] = ""; - char *c; - - strcati(buf, ID); - c = "ID"; - write(gfile, c, strlen(c)); - write(gfile, buf, strlen(buf)); - c = ""; - write(gfile, c, strlen(c)); -} - - -// head = REFERENT end = arrow -// tail = REFERRER end = no arrow -static void grafflize_reference(int gfile, auto_reference_t reference, - int ID, int important) -{ - blob *referrer = blob_for_address(reference.referrer_base); - blob *referent = blob_for_address(reference.referent); - char *c; - - // line - c = "ClassLineGraphic"; - write(gfile, c, strlen(c)); - - // id - grafflize_id(gfile, ID); - - // head = REFERENT - c = "Head"; - write(gfile, c, strlen(c)); - grafflize_id(gfile, referent->ID); - c = ""; - write(gfile, c, strlen(c)); - - // tail = REFERRER - c = "Tail"; - write(gfile, c, strlen(c)); - grafflize_id(gfile, referrer->ID); - c = ""; - write(gfile, c, strlen(c)); - - // style - head arrow, thick line if important - c = "Stylestroke" - "HeadArrowFilledArrow" - "LineType1"; - write(gfile, c, strlen(c)); - if (important) { - c = "Width3"; - write(gfile, c, strlen(c)); - } - c = ""; - write(gfile, c, strlen(c)); - - // end line - c = ""; - write(gfile, c, strlen(c)); -} - - -static void grafflize_blob(int gfile, blob *b) -{ - // fixme include ivar names too - char *name = name_for_address(auto_zone(), b->address, 0, false); - int width = 30 + (int)strlen(name)*6; - int height = 40; - char buf[40] = ""; - char *c; - - // rectangle - c = "" - "ClassShapedGraphic" - "ShapeRectangle"; - write(gfile, c, strlen(c)); - - // id - grafflize_id(gfile, b->ID); - - // bounds - // order vertically by depth - c = "Bounds{{0,"; - write(gfile, c, strlen(c)); - buf[0] = '\0'; - strcati(buf, b->depth*60); - write(gfile, buf, strlen(buf)); - c = "},{"; - write(gfile, c, strlen(c)); - buf[0] = '\0'; - strcati(buf, width); - strcat(buf, ","); - strcati(buf, height); - write(gfile, buf, strlen(buf)); - c = "}}"; - write(gfile, c, strlen(c)); - - // label - c = "TextText" - "{\\rtf1\\mac\\ansicpg10000\\cocoartf102\n" - "{\\fonttbl\\f0\\fswiss\\fcharset77 Helvetica;\\fonttbl\\f1\\fswiss\\fcharset77 Helvetica-Bold;}\n" - "{\\colortbl;\\red255\\green255\\blue255;}\n" - "\\pard\\tx560\\tx1120\\tx1680\\tx2240\\tx3360\\tx3920\\tx4480\\tx5040\\tx5600\\tx6160\\tx6720\\qc\n" - "\\f0\\fs20 \\cf0 "; - write(gfile, c, strlen(c)); - write(gfile, name, strlen(name)); - strcpy(buf, "\\\n0x"); - strcatx(buf, b->address); - write(gfile, buf, strlen(buf)); - c = "}"; - write(gfile, c, strlen(c)); - - // styles - c = "Style"; - write(gfile, c, strlen(c)); - - // no shadow - c = "shadowDrawsNO"; - write(gfile, c, strlen(c)); - - // fat border if refcount > 0 - if (b->refcount > 0) { - c = "strokeWidth4"; - write(gfile, c, strlen(c)); - } - - // end styles - c = ""; - write(gfile, c, strlen(c)); - - // done - c = "\n"; - write(gfile, c, strlen(c)); - - malloc_zone_free(objc_debug_zone(), name); -} - - -#define gheader "GraphDocumentVersion3ReadOnlyNOGraphicsList\n" - -#define gfooter "\n" - - -static void grafflize(blob_queue *blobs, int everything) -{ - // Don't require linking to Foundation! - int i; - int gfile; - int nextid = 1; - char filename[] = "/tmp/gc-XXXXX.graffle"; - - // Open file - gfile = mkstemps(filename, (int)strlen(strrchr(filename, '.'))); - if (gfile < 0) { - objc_debug_printf("couldn't create a graffle file in /tmp/ (errno %d)\n", errno); - return; - } - - // Write header - write(gfile, gheader, strlen(gheader)); - // Write a rectangle for each blob - sort_blobs_by_depth(blobs); - for (i = 0; i < blobs->used; i++) { - blob *b = blobs->list[i]; - b->ID = nextid++; - if (everything || b->depth >= 0) { - grafflize_blob(gfile, b); - } - } - for (i = 0; i < blobs->used; i++) { - int j; - blob *b = blobs->list[i]; - - if (everything) { - // Write an arrow for each reference - // Use big arrows for backreferences - for (j = 0; j < b->referrers_used; j++) { - int is_back_ref = (b->referrers[i].referent == b->back.referent && b->referrers[i].referrer_offset == b->back.referrer_offset && b->referrers[i].referrer_base == b->back.referrer_base); - - grafflize_reference(gfile, b->referrers[j], nextid++, - is_back_ref); - } - } - else { - // Write an arrow for each backreference - if (b->depth > 0) { - grafflize_reference(gfile, b->back, nextid++, false); - } - } - } - // Write footer and close - write(gfile, gfooter, strlen(gfooter)); - close(gfile); - objc_debug_printf("wrote object graph (%d objects)\nopen %s\n", - blobs->used, filename); -} +#endif diff --git a/runtime/objc-cache.m b/runtime/objc-cache.m index 7d0aefb..0908c42 100644 --- a/runtime/objc-cache.m +++ b/runtime/objc-cache.m @@ -86,16 +86,13 @@ * were PC-checked or used a lock. Additionally, storing the method * triplet in both caches would result in double-freeing if both caches * were flushed or expanded. The solution is for _cache_getMethod to - * ignore all entries whose implementation is _objc_msgForward, so - * _class_lookupMethodAndLoadCache cannot look at a forward:: entry + * ignore all entries whose implementation is _objc_msgForward_internal, + * so _class_lookupMethodAndLoadCache cannot look at a forward:: entry * unsafely or place it in multiple caches. ***********************************************************************/ - -#include - -#import "objc-private.h" -#import "hashtable2.h" +#include "objc-private.h" +#include "hashtable2.h" typedef struct { SEL name; // same layout as struct old_method @@ -112,8 +109,8 @@ typedef struct { #endif struct objc_cache { - unsigned int mask; /* total = mask + 1 */ - unsigned int occupied; + uintptr_t mask; /* total = mask + 1 */ + uintptr_t occupied; cache_entry *buckets[1]; }; @@ -136,22 +133,6 @@ static const int _class_slow_grow = 1; /* For min cache size: clear_cache=1, slow_grow=1 For max cache size: clear_cache=0, slow_grow=0 */ - -/* Lock for cache access. - * Held when modifying a cache in place. - * Held when installing a new cache on a class. - * Held when adding to the cache garbage list. - * Held when disposing cache garbage. - * See "Method cache locking" above for notes about cache locking. */ -// classLock > cacheUpdateLock > infoLock -#if __OBJC2__ -static -#else -__private_extern__ -#endif -OBJC_DECLARE_LOCK(cacheUpdateLock); - - /* Initial cache bucket count. INIT_CACHE_SIZE must be a power of two. */ enum { INIT_CACHE_SIZE_LOG2 = 2, @@ -164,11 +145,29 @@ enum { #define TABLE_SIZE(count) ((count - 1) * sizeof(cache_entry *)) +#if !TARGET_OS_WIN32 +# define CACHE_ALLOCATOR +#endif + /* Custom cache allocator parameters. * CACHE_REGION_SIZE must be a multiple of CACHE_QUANTUM. */ -#define CACHE_QUANTUM 520 -#define CACHE_REGION_SIZE 131040 // quantized just under 128KB (131072) -// #define CACHE_REGION_SIZE 262080 // quantized just under 256KB (262144) +#define CACHE_ALLOCATOR_MIN 512 +#define CACHE_QUANTUM (CACHE_ALLOCATOR_MIN+sizeof(struct objc_cache)-sizeof(cache_entry*)) +#define CACHE_REGION_SIZE ((128*1024 / CACHE_QUANTUM) * CACHE_QUANTUM) +// #define CACHE_REGION_SIZE ((256*1024 / CACHE_QUANTUM) * CACHE_QUANTUM) + +static uintptr_t cache_allocator_mask_for_size(size_t size) +{ + return (size - sizeof(struct objc_cache)) / sizeof(cache_entry *); +} + +static size_t cache_allocator_size_for_mask(uintptr_t mask) +{ + size_t requested = sizeof(struct objc_cache) + TABLE_SIZE(mask+1); + size_t actual = CACHE_QUANTUM; + while (actual < requested) actual += CACHE_QUANTUM; + return actual; +} /* Cache instrumentation data. Immediately follows the cache block itself. */ @@ -232,32 +231,45 @@ struct objc_cache _objc_empty_cache = CacheInstrumentation emptyCacheInstrumentation = {0}; #endif -#if __OBJC2__ -IMP _objc_empty_vtable[128] = {0}; -#endif - /* Local prototypes */ static BOOL _cache_isEmpty(Cache cache); -static Cache _cache_malloc(int slotCount); +static Cache _cache_malloc(uintptr_t slotCount); static Cache _cache_create(Class cls); static Cache _cache_expand(Class cls); #if __OBJC2__ static void _cache_flush(Class cls); #endif -static uintptr_t _get_pc_for_thread(mach_port_t thread); static int _collecting_in_critical(void); static void _garbage_make_room(void); static void _cache_collect_free(void *data, size_t size, BOOL tryCollect); -#if !defined(__LP64__) +#if defined(CACHE_ALLOCATOR) static BOOL cache_allocator_is_block(void *block); static void *cache_allocator_calloc(size_t size); static void cache_allocator_free(void *block); #endif +/*********************************************************************** +* Cache statistics for OBJC_PRINT_CACHE_SETUP +**********************************************************************/ +static unsigned int cache_counts[16]; +static size_t cache_allocations; +static size_t cache_collections; +static size_t cache_allocator_regions; + +static size_t log2u(size_t x) +{ + unsigned int log; + + log = 0; + while (x >>= 1) + log += 1; + + return log; +} /*********************************************************************** @@ -277,12 +289,12 @@ static BOOL _cache_isEmpty(Cache cache) * Called from _cache_create() and cache_expand() * Cache locks: cacheUpdateLock must be held by the caller. **********************************************************************/ -static Cache _cache_malloc(int slotCount) +static Cache _cache_malloc(uintptr_t slotCount) { Cache new_cache; size_t size; - OBJC_CHECK_LOCKED(&cacheUpdateLock); + mutex_assert_locked(&cacheUpdateLock); // Allocate table (why not check for failure?) size = sizeof(struct objc_cache) + TABLE_SIZE(slotCount); @@ -291,12 +303,12 @@ static Cache _cache_malloc(int slotCount) size += sizeof(CacheInstrumentation); new_cache = _calloc_internal(size, 1); new_cache->mask = slotCount - 1; -#elif defined(__LP64__) +#elif !defined(CACHE_ALLOCATOR) // fixme cache allocator implementation isn't 64-bit clean new_cache = _calloc_internal(size, 1); new_cache->mask = slotCount - 1; #else - if (size < CACHE_QUANTUM || UseInternalZone) { + if (size < CACHE_ALLOCATOR_MIN || UseInternalZone) { new_cache = _calloc_internal(size, 1); new_cache->mask = slotCount - 1; // occupied and buckets and instrumentation are all zero @@ -307,10 +319,17 @@ static Cache _cache_malloc(int slotCount) } #endif + if (PrintCaches) { + size_t bucket = log2u(slotCount); + if (bucket < sizeof(cache_counts) / sizeof(cache_counts[0])) { + cache_counts[bucket]++; + } + cache_allocations++; + } + return new_cache; } - /*********************************************************************** * _cache_free_block. * @@ -321,9 +340,22 @@ static Cache _cache_malloc(int slotCount) **********************************************************************/ static void _cache_free_block(void *block) { - OBJC_CHECK_LOCKED(&cacheUpdateLock); + mutex_assert_locked(&cacheUpdateLock); + +#if !TARGET_OS_WIN32 + if (PrintCaches) { + Cache cache = (Cache)block; + size_t slotCount = cache->mask + 1; + if (isPowerOf2(slotCount)) { + size_t bucket = log2u(slotCount); + if (bucket < sizeof(cache_counts) / sizeof(cache_counts[0])) { + cache_counts[bucket]--; + } + } + } +#endif -#if !defined(__LP64__) +#if defined(CACHE_ALLOCATOR) if (cache_allocator_is_block(block)) { cache_allocator_free(block); } else @@ -343,20 +375,20 @@ static void _cache_free_block(void *block) **********************************************************************/ __private_extern__ void _cache_free(Cache cache) { - int i; + unsigned int i; - OBJC_LOCK(&cacheUpdateLock); + mutex_lock(&cacheUpdateLock); for (i = 0; i < cache->mask + 1; i++) { cache_entry *entry = (cache_entry *)cache->buckets[i]; - if (entry && entry->imp == &_objc_msgForward) { + if (entry && entry->imp == &_objc_msgForward_internal) { _cache_free_block(entry); } } _cache_free_block(cache); - OBJC_UNLOCK(&cacheUpdateLock); + mutex_unlock(&cacheUpdateLock); } @@ -370,7 +402,7 @@ static Cache _cache_create(Class cls) { Cache new_cache; - OBJC_CHECK_LOCKED(&cacheUpdateLock); + mutex_assert_locked(&cacheUpdateLock); // Allocate new cache block new_cache = _cache_malloc(INIT_CACHE_SIZE); @@ -400,10 +432,10 @@ static Cache _cache_expand(Class cls) { Cache old_cache; Cache new_cache; - unsigned int slotCount; - unsigned int index; + uintptr_t slotCount; + uintptr_t index; - OBJC_CHECK_LOCKED(&cacheUpdateLock); + mutex_assert_locked(&cacheUpdateLock); // First growth goes from empty cache to a real one old_cache = _class_getCache(cls); @@ -438,7 +470,7 @@ static Cache _cache_expand(Class cls) old_cache->buckets[index] = NULL; // Deallocate "forward::" entry - if (oldEntry->imp == &_objc_msgForward) { + if (oldEntry->imp == &_objc_msgForward_internal) { _cache_collect_free (oldEntry, sizeof(cache_entry), NO); } } @@ -468,7 +500,7 @@ static Cache _cache_expand(Class cls) // Deallocate "forward::" entries from the old cache for (index = 0; index < old_cache->mask + 1; index++) { cache_entry *entry = (cache_entry *)old_cache->buckets[index]; - if (entry && entry->imp == &_objc_msgForward) { + if (entry && entry->imp == &_objc_msgForward_internal) { _cache_collect_free (entry, sizeof(cache_entry), NO); } } @@ -494,13 +526,13 @@ static Cache _cache_expand(Class cls) **********************************************************************/ __private_extern__ BOOL _cache_fill(Class cls, Method smt, SEL sel) { - unsigned int newOccupied; + uintptr_t newOccupied; uintptr_t index; cache_entry **buckets; cache_entry *entry; Cache cache; - OBJC_CHECK_UNLOCKED(&cacheUpdateLock); + mutex_assert_unlocked(&cacheUpdateLock); // Never cache before +initialize is done if (!_class_isInitialized(cls)) { @@ -510,7 +542,7 @@ __private_extern__ BOOL _cache_fill(Class cls, Method smt, SEL sel) // Keep tally of cache additions totalCacheFills += 1; - OBJC_LOCK(&cacheUpdateLock); + mutex_lock(&cacheUpdateLock); entry = (cache_entry *)smt; @@ -521,7 +553,7 @@ __private_extern__ BOOL _cache_fill(Class cls, Method smt, SEL sel) // Don't use _cache_getMethod() because _cache_getMethod() doesn't // return forward:: entries. if (_cache_getImp(cls, sel)) { - OBJC_UNLOCK(&cacheUpdateLock); + mutex_unlock(&cacheUpdateLock); return NO; // entry is already cached, didn't add new one } @@ -574,7 +606,7 @@ __private_extern__ BOOL _cache_fill(Class cls, Method smt, SEL sel) index &= cache->mask; } - OBJC_UNLOCK(&cacheUpdateLock); + mutex_unlock(&cacheUpdateLock); return YES; // successfully added new cache entry } @@ -593,7 +625,7 @@ __private_extern__ void _cache_addForwardEntry(Class cls, SEL sel) smt = _malloc_internal(sizeof(cache_entry)); smt->name = sel; - smt->imp = &_objc_msgForward; + smt->imp = &_objc_msgForward_internal; if (! _cache_fill(cls, (Method)smt, sel)) { // fixme hack // Entry not added to cache. Don't leak the method struct. _free_internal(smt); @@ -617,7 +649,7 @@ void _cache_flush(Class cls) Cache cache; unsigned int index; - OBJC_CHECK_LOCKED(&cacheUpdateLock); + mutex_assert_locked(&cacheUpdateLock); // Locate cache. Ignore unused cache. cache = _class_getCache(cls); @@ -647,7 +679,7 @@ void _cache_flush(Class cls) cache->buckets[index] = NULL; // Deallocate "forward::" entry - if (oldEntry && oldEntry->imp == &_objc_msgForward) + if (oldEntry && oldEntry->imp == &_objc_msgForward_internal) _cache_collect_free (oldEntry, sizeof(cache_entry), NO); } @@ -663,9 +695,9 @@ void _cache_flush(Class cls) __private_extern__ void flush_cache(Class cls) { if (cls) { - OBJC_LOCK(&cacheUpdateLock); + mutex_lock(&cacheUpdateLock); _cache_flush(cls); - OBJC_UNLOCK(&cacheUpdateLock); + mutex_unlock(&cacheUpdateLock); } } @@ -674,6 +706,8 @@ __private_extern__ void flush_cache(Class cls) * cache collection. **********************************************************************/ +#if !TARGET_OS_WIN32 + // A sentinal (magic value) to report bad thread_get_state status #define PC_SENTINEL 0 @@ -683,7 +717,7 @@ __private_extern__ void flush_cache(Class cls) #define __eip eip #endif -static uintptr_t _get_pc_for_thread(mach_port_t thread) +static uintptr_t _get_pc_for_thread(thread_t thread) #if defined(__i386__) { i386_thread_state_t state; @@ -712,12 +746,20 @@ static uintptr_t _get_pc_for_thread(mach_port_t thread) kern_return_t okay = thread_get_state (thread, x86_THREAD_STATE64, (thread_state_t)&state, &count); return (okay == KERN_SUCCESS) ? state.__rip : PC_SENTINEL; } +#elif defined(__arm__) +{ + arm_thread_state_t state; + unsigned int count = ARM_THREAD_STATE_COUNT; + kern_return_t okay = thread_get_state (thread, ARM_THREAD_STATE, (thread_state_t)&state, &count); + return (okay == KERN_SUCCESS) ? state.__pc : PC_SENTINEL; +} #else { #error _get_pc_for_thread () not implemented for this architecture } #endif +#endif /*********************************************************************** * _collecting_in_critical. @@ -731,6 +773,9 @@ OBJC_EXPORT uintptr_t objc_exitPoints[]; static int _collecting_in_critical(void) { +#if TARGET_OS_WIN32 + return TRUE; +#else thread_act_port_array_t threads; unsigned number; unsigned count; @@ -790,6 +835,7 @@ static int _collecting_in_critical(void) // Return our finding return result; +#endif } @@ -850,7 +896,7 @@ static void _garbage_make_room(void) **********************************************************************/ static void _cache_collect_free(void *data, size_t size, BOOL tryCollect) { - OBJC_CHECK_LOCKED(&cacheUpdateLock); + mutex_assert_locked(&cacheUpdateLock); // Insert new element in garbage list // Note that we do this even if we end up free'ing everything @@ -863,9 +909,9 @@ static void _cache_collect_free(void *data, size_t size, BOOL tryCollect) // Done if the garbage is not full if (garbage_byte_size < garbage_threshold) { - if (PrintCacheCollection) { - _objc_inform ("CACHE COLLECTION: not collecting; not enough garbage (%zu < %zu)\n", garbage_byte_size, garbage_threshold); - } + // if (PrintCaches) { + // _objc_inform ("CACHES: not collecting; not enough garbage (%zu < %zu)", garbage_byte_size, garbage_threshold); + // } return; } @@ -874,9 +920,9 @@ static void _cache_collect_free(void *data, size_t size, BOOL tryCollect) // No cache readers in progress - garbage is now deletable // Log our progress - if (PrintCacheCollection) { - _objc_inform ("CACHE COLLECTION: collecting %zu bytes\n", - garbage_byte_size); + if (PrintCaches) { + cache_collections++; + _objc_inform ("CACHES: COLLECTING %zu bytes (%zu regions, %zu allocations, %zu collections)", garbage_byte_size, cache_allocator_regions, cache_allocations, cache_collections); } // Dispose all refs now in the garbage @@ -891,9 +937,41 @@ static void _cache_collect_free(void *data, size_t size, BOOL tryCollect) else { // objc_msgSend (or other cache reader) is currently looking in the // cache and might still be using some garbage. - if (PrintCacheCollection) { - _objc_inform ("CACHE COLLECTION: not collecting; objc_msgSend in progress\n"); + if (PrintCaches) { + _objc_inform ("CACHES: not collecting; objc_msgSend in progress"); + } + } + + if (PrintCaches) { + int i; + size_t total = 0; + size_t ideal_total = 0; + size_t malloc_total = 0; + size_t local_total = 0; + + for (i = 0; i < sizeof(cache_counts) / sizeof(cache_counts[0]); i++) { + int count = cache_counts[i]; + int slots = 1 << i; + size_t size = sizeof(struct objc_cache) + TABLE_SIZE(slots); + size_t ideal = size; +#if TARGET_OS_WIN32 + size_t malloc = size; +#else + size_t malloc = malloc_good_size(size); +#endif + size_t local = size < CACHE_ALLOCATOR_MIN ? malloc : cache_allocator_size_for_mask(cache_allocator_mask_for_size(size)); + + if (!count) continue; + + _objc_inform("CACHES: %4d slots: %4d caches, %6zu / %6zu / %6zu bytes ideal/malloc/local, %6zu / %6zu bytes wasted malloc/local", slots, count, ideal*count, malloc*count, local*count, malloc*count-ideal*count, local*count-ideal*count); + + total += count; + ideal_total += ideal*count; + malloc_total += malloc*count; + local_total += local*count; } + + _objc_inform("CACHES: total: %4zu caches, %6zu / %6zu / %6zu bytes ideal/malloc/local, %6zu / %6zu bytes wasted malloc/local", total, ideal_total, malloc_total, local_total, malloc_total-ideal_total, local_total-ideal_total); } } @@ -901,7 +979,7 @@ static void _cache_collect_free(void *data, size_t size, BOOL tryCollect) -#if !defined(__LP64__) +#if defined(CACHE_ALLOCATOR) /*********************************************************************** * Custom method cache allocator. @@ -932,13 +1010,11 @@ static void _cache_collect_free(void *data, size_t size, BOOL tryCollect) * * fixme with 128 KB regions and 520 B min block size, an allocation * bitmap would be only 32 bytes - better than free list? -* -* fixme not 64-bit clean? **********************************************************************/ typedef struct cache_allocator_block { - unsigned int size; - unsigned int state; + uintptr_t size; + uintptr_t state; struct cache_allocator_block *nextFree; } cache_allocator_block; @@ -952,19 +1028,6 @@ typedef struct cache_allocator_region { static cache_allocator_region *cacheRegion = NULL; -static unsigned int cache_allocator_mask_for_size(size_t size) -{ - return (size - sizeof(struct objc_cache)) / sizeof(cache_entry *); -} - -static size_t cache_allocator_size_for_mask(unsigned int mask) -{ - size_t requested = sizeof(struct objc_cache) + TABLE_SIZE(mask+1); - size_t actual = CACHE_QUANTUM; - while (actual < requested) actual += CACHE_QUANTUM; - return actual; -} - /*********************************************************************** * cache_allocator_add_region * Allocates and returns a new region that can hold at least size @@ -996,7 +1059,7 @@ static cache_allocator_region *cache_allocator_add_region(size_t size) // Mark the first block: free and covers the entire region b = newRegion->start; b->size = size; - b->state = (unsigned int)-1; + b->state = (uintptr_t)-1; b->nextFree = NULL; newRegion->freeList = b; @@ -1009,6 +1072,8 @@ static cache_allocator_region *cache_allocator_add_region(size_t size) } *rgnP = newRegion; + cache_allocator_regions++; + return newRegion; } @@ -1036,7 +1101,7 @@ static void cache_allocator_coalesce(cache_allocator_block *block) static void *cache_region_calloc(cache_allocator_region *rgn, size_t size) { cache_allocator_block **blockP; - unsigned int mask; + uintptr_t mask; // Save mask for allocated block, then round size // up to CACHE_QUANTUM boundary @@ -1060,7 +1125,7 @@ static void *cache_region_calloc(cache_allocator_region *rgn, size_t size) cache_allocator_block *leftover = (cache_allocator_block *)(size + (uintptr_t)block); leftover->size = block->size - size; - leftover->state = (unsigned int)-1; + leftover->state = (uintptr_t)-1; leftover->nextFree = block->nextFree; *blockP = leftover; } else { @@ -1092,7 +1157,7 @@ static void *cache_allocator_calloc(size_t size) { cache_allocator_region *rgn; - OBJC_CHECK_LOCKED(&cacheUpdateLock); + mutex_assert_locked(&cacheUpdateLock); for (rgn = cacheRegion; rgn != NULL; rgn = rgn->next) { void *p = cache_region_calloc(rgn, size); @@ -1130,7 +1195,7 @@ static cache_allocator_region *cache_allocator_region_for_block(cache_allocator_ **********************************************************************/ static BOOL cache_allocator_is_block(void *ptr) { - OBJC_CHECK_LOCKED(&cacheUpdateLock); + mutex_assert_locked(&cacheUpdateLock); return (cache_allocator_region_for_block((cache_allocator_block *)ptr) != NULL); } @@ -1145,7 +1210,7 @@ static void cache_allocator_free(void *ptr) cache_allocator_block *cur; cache_allocator_region *rgn; - OBJC_CHECK_LOCKED(&cacheUpdateLock); + mutex_assert_locked(&cacheUpdateLock); if (! (rgn = cache_allocator_region_for_block(ptr))) { // free of non-pointer @@ -1154,7 +1219,7 @@ static void cache_allocator_free(void *ptr) } dead->size = cache_allocator_size_for_mask(dead->size); - dead->state = (unsigned int)-1; + dead->state = (uintptr_t)-1; if (!rgn->freeList || rgn->freeList > dead) { // dead block belongs at front of free list @@ -1184,13 +1249,9 @@ static void cache_allocator_free(void *ptr) _objc_inform("cache_allocator_free of non-pointer %p", ptr); } -// !defined(__LP64__) +// defined(CACHE_ALLOCATOR) #endif - - - - /*********************************************************************** * Cache instrumentation and debugging **********************************************************************/ @@ -1210,14 +1271,14 @@ unsigned int CacheMissHistogram [CACHE_HISTOGRAM_SIZE]; **********************************************************************/ static void _cache_print(Cache cache) { - unsigned int index; - unsigned int count; + uintptr_t index; + uintptr_t count; count = cache->mask + 1; for (index = 0; index < count; index += 1) { cache_entry *entry = (cache_entry *)cache->buckets[index]; if (entry) { - if (entry->imp == &_objc_msgForward) + if (entry->imp == &_objc_msgForward_internal) printf ("does not recognize: \n"); printf ("%s\n", sel_getName(entry->name)); } @@ -1248,19 +1309,6 @@ __private_extern__ void _class_printMethodCaches(Class cls) #if 0 #warning fixme -/*********************************************************************** -* log2u. -**********************************************************************/ -static unsigned int log2u(unsigned int x) -{ - unsigned int log; - - log = 0; - while (x >>= 1) - log += 1; - - return log; -} /*********************************************************************** @@ -1513,7 +1561,7 @@ void _class_printMethodCacheStatistics(void) entryCount += 1; // Tally "forward::" entries - if (entry->imp == &_objc_msgForward) + if (entry->imp == &_objc_msgForward_internal) negativeEntryCount += 1; // Calculate search distance (chain length) for this method diff --git a/runtime/objc-class-old.m b/runtime/objc-class-old.m index d9e1b00..fecccf2 100644 --- a/runtime/objc-class-old.m +++ b/runtime/objc-class-old.m @@ -29,19 +29,7 @@ #if !__OBJC2__ #define OLD 1 -#import "objc-private.h" -#import "objc-rtp.h" -#import "hashtable2.h" -#import "maptable.h" - -#include -#include - -// Lock for method list access and modification. -// Protects methodLists fields, method arrays, and CLS_NO_METHOD_ARRAY bits. -// Classes not yet in use do not need to take this lock. -__private_extern__ OBJC_DECLARE_LOCK(methodListLock); - +#include "objc-private.h" // Freed objects have their isa set to point to this dummy class. // This avoids the need to check for Nil classes in the messenger. @@ -80,7 +68,7 @@ static const struct old_class nonexistentObjectClass = * a pointer to the freedObjectClass, so that we can catch usages of * the freed object. **********************************************************************/ -__private_extern__ Class _class_getFreedObjectClass(void) +static Class _class_getFreedObjectClass(void) { return (Class)&freedObjectClass; } @@ -129,6 +117,7 @@ static inline struct old_method *_findNamedMethodInList(struct old_method_list * if (!mlist) return NULL; for (i = 0; i < mlist->method_count; i++) { struct old_method *m = &mlist->method_list[i]; + if (m->method_name == (SEL)kRTAddress_ignoredSelector) continue; if (*((const char *)m->method_name) == *meth_name && 0 == strcmp((const char *)(m->method_name), meth_name)) { return m; } @@ -137,6 +126,27 @@ static inline struct old_method *_findNamedMethodInList(struct old_method_list * } +/*********************************************************************** +* Method list fixup markers. +* mlist->obsolete == fixed_up_method_list marks method lists with real SELs +* versus method lists with un-uniqued char*. +* PREOPTIMIZED VERSION: +* Fixed-up method lists get mlist->obsolete == OBJC_FIXED_UP +* dyld shared cache sets this for method lists it preoptimizes. +* UN-PREOPTIMIZED VERSION +* Fixed-up method lists get mlist->obsolete == OBJC_FIXED_UP_outside_dyld +* dyld shared cache uses OBJC_FIXED_UP, but those aren't trusted. +**********************************************************************/ +#define OBJC_FIXED_UP ((void *)1771) +#define OBJC_FIXED_UP_outside_dyld ((void *)1773) +static void *fixed_up_method_list = OBJC_FIXED_UP; + +// sel_init() decided that selectors in the dyld shared cache are untrustworthy +__private_extern__ void disableSelectorPreoptimization(void) +{ + fixed_up_method_list = OBJC_FIXED_UP_outside_dyld; +} + /*********************************************************************** * fixupSelectorsInMethodList * Uniques selectors in the given method list. @@ -158,7 +168,9 @@ static struct old_method_list *fixupSelectorsInMethodList(struct old_class *cls, struct old_method_list *old_mlist; if ( ! mlist ) return NULL; - if ( mlist->obsolete != _OBJC_FIXED_UP ) { + if ( mlist->obsolete == fixed_up_method_list ) { + // method list OK + } else { BOOL isBundle = (cls->info & CLS_FROM_BUNDLE) ? YES : NO; if (!isBundle) { old_mlist = mlist; @@ -175,12 +187,14 @@ static struct old_method_list *fixupSelectorsInMethodList(struct old_class *cls, method->method_name = sel_registerNameNoLock((const char *)method->method_name, isBundle); // Always copy selector data from bundles. +#ifndef NO_GC if (method->method_name == (SEL)kRTAddress_ignoredSelector) { method->method_imp = (IMP)&_objc_ignored_method; } +#endif } sel_unlock(); - mlist->obsolete = _OBJC_FIXED_UP; + mlist->obsolete = fixed_up_method_list; } return mlist; } @@ -201,11 +215,11 @@ static struct old_method_list *fixupSelectorsInMethodList(struct old_class *cls, * * void *iterator = NULL; * struct old_method_list *mlist; -* OBJC_LOCK(&methodListLock); +* mutex_lock(&methodListLock); * while ((mlist = nextMethodList(cls, &iterator))) { * // do something with mlist * } -* OBJC_UNLOCK(&methodListLock); +* mutex_unlock(&methodListLock); **********************************************************************/ static struct old_method_list *nextMethodList(struct old_class *cls, void **it) @@ -243,7 +257,7 @@ static struct old_method_list *nextMethodList(struct old_class *cls, // OR the address of the method list pointer to fix up and return. if (resultp) { - if (*resultp && (*resultp)->obsolete != _OBJC_FIXED_UP) { + if (*resultp) { *resultp = fixupSelectorsInMethodList(cls, *resultp); } *it = (void *)(index + 1); @@ -288,9 +302,7 @@ static inline struct old_method * _findMethodInClass(struct old_class *cls, SEL // One method list. struct old_method_list **mlistp; mlistp = (struct old_method_list **)&cls->methodLists; - if ((*mlistp)->obsolete != _OBJC_FIXED_UP) { - *mlistp = fixupSelectorsInMethodList(cls, *mlistp); - } + *mlistp = fixupSelectorsInMethodList(cls, *mlistp); return _findMethodInList(*mlistp, sel); } else { @@ -301,9 +313,7 @@ static inline struct old_method * _findMethodInClass(struct old_class *cls, SEL mlistp++) { struct old_method *m; - if ((*mlistp)->obsolete != _OBJC_FIXED_UP) { - *mlistp = fixupSelectorsInMethodList(cls, *mlistp); - } + *mlistp = fixupSelectorsInMethodList(cls, *mlistp); m = _findMethodInList(*mlistp, sel); if (m) return m; } @@ -330,6 +340,59 @@ __private_extern__ IMP findIMPInClass(struct old_class *cls, SEL sel) } +/*********************************************************************** +* _freedHandler. +**********************************************************************/ +static void _freedHandler(id obj, SEL sel) +{ + __objc_error (obj, "message %s sent to freed object=%p", + sel_getName(sel), obj); +} + +/*********************************************************************** +* _nonexistentHandler. +**********************************************************************/ +static void _nonexistentHandler(id obj, SEL sel) +{ + __objc_error (obj, "message %s sent to non-existent object=%p", + sel_getName(sel), obj); +} + + +/*********************************************************************** +* ABI-specific lookUpMethod helpers. +**********************************************************************/ +__private_extern__ void lockForMethodLookup(void) +{ + mutex_lock(&methodListLock); +} +__private_extern__ void unlockForMethodLookup(void) +{ + mutex_unlock(&methodListLock); +} +__private_extern__ IMP prepareForMethodLookup(Class cls, SEL sel, BOOL init) +{ + mutex_assert_unlocked(&methodListLock); + + // Check for freed class + if (cls == _class_getFreedObjectClass()) + return (IMP) _freedHandler; + + // Check for nonexistent class + if (cls == _class_getNonexistentObjectClass()) + return (IMP) _nonexistentHandler; + + if (init && !_class_isInitialized(cls)) { + _class_initialize (cls); + // If sel == initialize, _class_initialize will send +initialize and + // then the messenger will send +initialize again after this + // procedure finishes. Of course, if this is not being called + // from the messenger then it won't happen. 2778172 + } + + return NULL; +} + /*********************************************************************** * class_getVariable. Return the named instance variable. @@ -370,7 +433,7 @@ nextPropertyList(struct old_class *cls, uintptr_t *indexp) { struct objc_property_list *result = NULL; - OBJC_CHECK_LOCKED(&classLock); + mutex_assert_locked(&classLock); if (! ((cls->info & CLS_EXT) && cls->ext)) { // No class ext result = NULL; @@ -459,14 +522,14 @@ void class_setWeakIvarLayout(Class cls_gen, const char *layout) struct old_class *cls = _class_asOld(cls_gen); if (!cls) return; - OBJC_LOCK(&classLock); + mutex_lock(&classLock); allocateExt(cls); // fixme leak cls->ext->weak_ivar_layout = layout ? _strdup_internal(layout) : NULL; - OBJC_UNLOCK(&classLock); + mutex_unlock(&classLock); } @@ -604,10 +667,10 @@ __private_extern__ Class _class_getNonMetaClass(Class cls) if (strncmp(_class_getName(cls), "_%", 2) == 0) { // Posee's meta's name is smashed and isn't in the class_hash, // so objc_getClass doesn't work. - char *baseName = strchr(_class_getName(cls), '%'); // get posee's real name - cls = objc_getClass(baseName); + const char *baseName = strchr(_class_getName(cls), '%'); // get posee's real name + cls = (Class)objc_getClass(baseName); } else { - cls = objc_getClass(_class_getName(cls)); + cls = (Class)objc_getClass(_class_getName(cls)); } assert(cls); } @@ -659,7 +722,7 @@ __private_extern__ const char *_category_getClassName(Category cat) __private_extern__ Class _category_getClass(Category cat) { - return objc_getClass(_category_asOld(cat)->class_name); + return (Class)objc_getClass(_category_asOld(cat)->class_name); } __private_extern__ IMP _category_getLoadMethod(Category cat) @@ -693,9 +756,9 @@ OBJC_EXPORT struct objc_method_list *class_nextMethodList(Class cls, void **it) OBJC_WARN_DEPRECATED; - OBJC_LOCK(&methodListLock); + mutex_lock(&methodListLock); result = nextMethodList(_class_asOld(cls), it); - OBJC_UNLOCK(&methodListLock); + mutex_unlock(&methodListLock); return (struct objc_method_list *)result; } @@ -710,9 +773,9 @@ OBJC_EXPORT void class_addMethods(Class cls, struct objc_method_list *meths) OBJC_WARN_DEPRECATED; // Add the methods. - OBJC_LOCK(&methodListLock); + mutex_lock(&methodListLock); _objc_insertMethods(_class_asOld(cls), (struct old_method_list *)meths, NULL); - OBJC_UNLOCK(&methodListLock); + mutex_unlock(&methodListLock); // Must flush when dynamically adding methods. No need to flush // all the class method caches. If cls is a meta class, though, @@ -729,9 +792,9 @@ OBJC_EXPORT void class_removeMethods(Class cls, struct objc_method_list *meths) OBJC_WARN_DEPRECATED; // Remove the methods - OBJC_LOCK(&methodListLock); + mutex_lock(&methodListLock); _objc_removeMethods(_class_asOld(cls), (struct old_method_list *)meths); - OBJC_UNLOCK(&methodListLock); + mutex_unlock(&methodListLock); // Must flush when dynamically removing methods. No need to flush // all the class method caches. If cls is a meta class, though, @@ -756,9 +819,9 @@ __private_extern__ Method _class_getMethod(Class cls, SEL sel) { Method result; - OBJC_LOCK(&methodListLock); + mutex_lock(&methodListLock); result = (Method)_getMethod(_class_asOld(cls), sel); - OBJC_UNLOCK(&methodListLock); + mutex_unlock(&methodListLock); return result; } @@ -767,18 +830,27 @@ __private_extern__ Method _class_getMethodNoSuper(Class cls, SEL sel) { Method result; - OBJC_LOCK(&methodListLock); + mutex_lock(&methodListLock); result = (Method)_findMethodInClass(_class_asOld(cls), sel); - OBJC_UNLOCK(&methodListLock); + mutex_unlock(&methodListLock); return result; } +__private_extern__ Method _class_getMethodNoSuper_nolock(Class cls, SEL sel) +{ + mutex_assert_locked(&methodListLock); + return (Method)_findMethodInClass(_class_asOld(cls), sel); +} + BOOL class_conformsToProtocol(Class cls_gen, Protocol *proto_gen) { struct old_class *cls = oldcls(cls_gen); struct old_protocol *proto = oldprotocol(proto_gen); + + if (!cls_gen) return NO; + if (!proto) return NO; if (cls->isa->version >= 3) { struct old_protocol_list *list; @@ -806,15 +878,15 @@ __private_extern__ Class _objc_getOrigClass(const char *name) // Look for class among the posers ret = Nil; - OBJC_LOCK(&classLock); + mutex_lock(&classLock); if (posed_class_hash) ret = (Class) NXMapGet (posed_class_hash, name); - OBJC_UNLOCK(&classLock); + mutex_unlock(&classLock); if (ret) return ret; // Not a poser. Do a normal lookup. - ret = objc_getClass (name); + ret = (Class)objc_getClass (name); if (!ret) _objc_inform ("class `%s' not linked into application", name); @@ -835,7 +907,7 @@ Class objc_getOrigClass(const char *name) **********************************************************************/ static void _objc_addOrigClass (struct old_class *origClass) { - OBJC_LOCK(&classLock); + mutex_lock(&classLock); // Create the poser's hash table on first use if (!posed_class_hash) @@ -849,7 +921,7 @@ static void _objc_addOrigClass (struct old_class *origClass) if (NXMapGet (posed_class_hash, origClass->name) == 0) NXMapInsert (posed_class_hash, origClass->name, origClass); - OBJC_UNLOCK(&classLock); + mutex_unlock(&classLock); } @@ -892,7 +964,7 @@ void change_class_references(struct old_class *imposter, // Replace the original with the imposter in all class refs // Major loop - process all headers - for (hInfo = _objc_headerStart(); hInfo != NULL; hInfo = hInfo->next) + for (hInfo = FirstHeader; hInfo != NULL; hInfo = hInfo->next) { struct old_class **cls_refs; size_t refCount; @@ -931,24 +1003,28 @@ Class class_poseAs(Class imposter_gen, Class original_gen) // Imposter must be an immediate subclass of the original if (imposter->super_class != original) { - __objc_error(imposter_gen, + __objc_error((id)imposter_gen, "[%s poseAs:%s]: target not immediate superclass", imposter->name, original->name); } // Can't pose when you have instance variables (how could it work?) if (imposter->ivars) { - __objc_error(imposter_gen, + __objc_error((id)imposter_gen, "[%s poseAs:%s]: %s defines new instance variables", imposter->name, original->name, imposter->name); } // Build a string to use to replace the name of the original class. - #define imposterNamePrefix "_%" +#if TARGET_OS_WIN32 +# define imposterNamePrefix "_%" imposterNamePtr = _malloc_internal(strlen(original->name) + strlen(imposterNamePrefix) + 1); strcpy(imposterNamePtr, imposterNamePrefix); strcat(imposterNamePtr, original->name); - #undef imposterNamePrefix +# undef imposterNamePrefix +#else + asprintf(&imposterNamePtr, "_%%%s", original->name); +#endif // We lock the class hashtable, so we are thread safe with respect to // calls to objc_getClass (). However, the class names are not @@ -965,16 +1041,17 @@ Class class_poseAs(Class imposter_gen, Class original_gen) // its normal life in addition to changing the behavior of // the original. As a hack we don't bother to copy the metaclass. // For some reason we modify the original rather than the copy. - copy = _class_asOld((*_zoneAlloc)((Class)imposter->isa, sizeof(struct old_class), _objc_internal_zone())); + copy = (struct old_class *)_malloc_internal(sizeof(struct old_class)); memmove(copy, imposter, sizeof(struct old_class)); - OBJC_LOCK(&classLock); + mutex_lock(&classLock); // Remove both the imposter and the original class. NXHashRemove (class_hash, imposter); NXHashRemove (class_hash, original); NXHashInsert (class_hash, copy); + objc_addRegisteredClass((Class)copy); // imposter & original will rejoin later, just track the new guy // Mark the imposter as such _class_setInfo((Class)imposter, CLS_POSING); @@ -1000,7 +1077,7 @@ Class class_poseAs(Class imposter_gen, Class original_gen) NXHashInsert (class_hash, imposter); NXHashInsert (class_hash, original); - OBJC_UNLOCK(&classLock); + mutex_unlock(&classLock); return imposter_gen; } @@ -1022,8 +1099,8 @@ __private_extern__ void flush_caches(Class target_gen, BOOL flush_meta) unsigned int subclassCount; #endif - OBJC_LOCK(&classLock); - OBJC_LOCK(&cacheUpdateLock); + mutex_lock(&classLock); + mutex_lock(&cacheUpdateLock); // Leaf classes are fastest because there are no subclass caches to flush. // fixme instrument @@ -1031,13 +1108,13 @@ __private_extern__ void flush_caches(Class target_gen, BOOL flush_meta) _cache_flush ((Class)target); if (!flush_meta) { - OBJC_UNLOCK(&cacheUpdateLock); - OBJC_UNLOCK(&classLock); + mutex_unlock(&cacheUpdateLock); + mutex_unlock(&classLock); return; // done } else if (target->isa && (target->isa->info & CLS_LEAF)) { _cache_flush ((Class)target->isa); - OBJC_UNLOCK(&cacheUpdateLock); - OBJC_UNLOCK(&classLock); + mutex_unlock(&cacheUpdateLock); + mutex_unlock(&classLock); return; // done } else { // Reset target and handle it by one of the methods below. @@ -1094,8 +1171,8 @@ __private_extern__ void flush_caches(Class target_gen, BOOL flush_meta) MaxIdealFlushCachesCount = subclassCount; #endif - OBJC_UNLOCK(&cacheUpdateLock); - OBJC_UNLOCK(&classLock); + mutex_unlock(&cacheUpdateLock); + mutex_unlock(&classLock); return; } @@ -1173,8 +1250,8 @@ __private_extern__ void flush_caches(Class target_gen, BOOL flush_meta) MaxIdealFlushCachesCount = subclassCount; #endif - OBJC_UNLOCK(&cacheUpdateLock); - OBJC_UNLOCK(&classLock); + mutex_unlock(&cacheUpdateLock); + mutex_unlock(&classLock); } @@ -1189,8 +1266,8 @@ __private_extern__ void flush_marked_caches(void) struct old_class *supercls; NXHashState state; - OBJC_LOCK(&classLock); - OBJC_LOCK(&cacheUpdateLock); + mutex_lock(&classLock); + mutex_lock(&cacheUpdateLock); state = NXInitHashState(class_hash); while (NXNextHashState(class_hash, &state, (void**)&cls)) { @@ -1219,8 +1296,8 @@ __private_extern__ void flush_marked_caches(void) } } - OBJC_UNLOCK(&cacheUpdateLock); - OBJC_UNLOCK(&classLock); + mutex_unlock(&cacheUpdateLock); + mutex_unlock(&classLock); } @@ -1302,6 +1379,13 @@ __private_extern__ void _class_setFinalizeOnMainThread(Class cls) { _class_setInfo(cls, CLS_FINALIZE_ON_MAIN_THREAD); } +__private_extern__ BOOL _class_instancesHaveAssociatedObjects(Class cls) { + return _class_getInfo(cls, CLS_INSTANCES_HAVE_ASSOCIATED_OBJECTS); +} + +__private_extern__ void _class_assertInstancesHaveAssociatedObjects(Class cls) { + _class_setInfo(cls, CLS_INSTANCES_HAVE_ASSOCIATED_OBJECTS); +} __private_extern__ struct old_ivar *_ivar_asOld(Ivar ivar) { @@ -1342,14 +1426,50 @@ const char *method_getTypeEncoding(Method m) return _method_asOld(m)->method_types; } -IMP method_setImplementation(Method m, IMP imp) +static OSSpinLock impLock = OS_SPINLOCK_INIT; + +IMP method_setImplementation(Method m_gen, IMP imp) { - IMP old = _method_asOld(m)->method_imp; - _method_asOld(m)->method_imp = imp; + IMP old; + struct old_method *m = _method_asOld(m_gen); + if (!m) return NULL; + if (!imp) return NULL; + + if (m->method_name == (SEL)kIgnore) { + // Ignored methods stay ignored + return m->method_imp; + } + + OSSpinLockLock(&impLock); + old = m->method_imp; + m->method_imp = imp; + OSSpinLockUnlock(&impLock); return old; } +void method_exchangeImplementations(Method m1_gen, Method m2_gen) +{ + IMP m1_imp; + struct old_method *m1 = _method_asOld(m1_gen); + struct old_method *m2 = _method_asOld(m2_gen); + if (!m1 || !m2) return; + + if (m1->method_name == (SEL)kIgnore || m2->method_name == (SEL)kIgnore) { + // Ignored methods stay ignored. Now they're both ignored. + m1->method_imp = (IMP)&_objc_ignored_method; + m2->method_imp = (IMP)&_objc_ignored_method; + return; + } + + OSSpinLockLock(&impLock); + m1_imp = m1->method_imp; + m1->method_imp = m2->method_imp; + m2->method_imp = m1_imp; + OSSpinLockUnlock(&impLock); +} + + struct objc_method_description * method_getDescription(Method m) { if (!m) return NULL; @@ -1364,13 +1484,13 @@ static IMP _class_addMethod(Class cls_gen, SEL name, IMP imp, const char *types, BOOL replace) { struct old_class *cls = oldcls(cls_gen); + struct old_method *m; IMP result = NULL; if (!types) types = ""; - OBJC_LOCK(&methodListLock); + mutex_lock(&methodListLock); - struct old_method *m; if ((m = _findMethodInClass(cls, name))) { // already exists // fixme atomic @@ -1382,11 +1502,15 @@ static IMP _class_addMethod(Class cls_gen, SEL name, IMP imp, // fixme could be faster struct old_method_list *mlist = _calloc_internal(sizeof(struct old_method_list), 1); - mlist->obsolete = _OBJC_FIXED_UP; + mlist->obsolete = fixed_up_method_list; mlist->method_count = 1; mlist->method_list[0].method_name = name; - mlist->method_list[0].method_imp = imp; mlist->method_list[0].method_types = _strdup_internal(types); + if (name != (SEL)kIgnore) { + mlist->method_list[0].method_imp = imp; + } else { + mlist->method_list[0].method_imp = (IMP)&_objc_ignored_method; + } _objc_insertMethods(cls, mlist, NULL); if (!(cls->info & CLS_CONSTRUCTING)) { @@ -1398,7 +1522,7 @@ static IMP _class_addMethod(Class cls_gen, SEL name, IMP imp, result = NULL; } - OBJC_UNLOCK(&methodListLock); + mutex_unlock(&methodListLock); return result; } @@ -1409,9 +1533,10 @@ static IMP _class_addMethod(Class cls_gen, SEL name, IMP imp, **********************************************************************/ BOOL class_addMethod(Class cls, SEL name, IMP imp, const char *types) { + IMP old; if (!cls) return NO; - IMP old = _class_addMethod(cls, name, imp, types, NO); + old = _class_addMethod(cls, name, imp, types, NO); return old ? NO : YES; } @@ -1443,7 +1568,7 @@ BOOL class_addIvar(Class cls_gen, const char *name, size_t size, if (!type) type = ""; if (name && 0 == strcmp(name, "")) name = NULL; - OBJC_LOCK(&classLock); + mutex_lock(&classLock); // Check for existing ivar with this name // fixme check superclasses? @@ -1488,14 +1613,14 @@ BOOL class_addIvar(Class cls_gen, const char *name, size_t size, // align if necessary alignBytes = 1 << alignment; misalign = cls->instance_size % alignBytes; - if (misalign) cls->instance_size += alignBytes - misalign; + if (misalign) cls->instance_size += (long)(alignBytes - misalign); // set ivar offset and increase instance size ivar->ivar_offset = (int)cls->instance_size; - cls->instance_size += size; + cls->instance_size += (long)size; } - OBJC_UNLOCK(&classLock); + mutex_unlock(&classLock); return result; } @@ -1513,7 +1638,7 @@ BOOL class_addProtocol(Class cls_gen, Protocol *protocol_gen) if (!cls) return NO; if (class_conformsToProtocol(cls_gen, protocol_gen)) return NO; - OBJC_LOCK(&classLock); + mutex_lock(&classLock); // fixme optimize - protocol list doesn't escape? plist = _calloc_internal(sizeof(struct old_protocol_list), 1); @@ -1524,7 +1649,7 @@ BOOL class_addProtocol(Class cls_gen, Protocol *protocol_gen) // fixme metaclass? - OBJC_UNLOCK(&classLock); + mutex_unlock(&classLock); return YES; } @@ -1537,15 +1662,15 @@ __private_extern__ void _class_addProperties(struct old_class *cls, struct objc_property_list *additions) { - if (!(cls->info & CLS_EXT)) { - return; - } + struct objc_property_list *newlist; + + if (!(cls->info & CLS_EXT)) return; - struct objc_property_list *newlist = + newlist = _memdup_internal(additions, sizeof(*newlist) - sizeof(newlist->first) + (additions->entsize * additions->count)); - OBJC_LOCK(&classLock); + mutex_lock(&classLock); allocateExt(cls); if (!cls->ext->propertyLists) { @@ -1565,10 +1690,10 @@ _class_addProperties(struct old_class *cls, } else { // cls has a property array - make a bigger one + struct objc_property_list **newarray; int count = 0; while (cls->ext->propertyLists[count]) count++; - struct objc_property_list **newarray = - _malloc_internal((count+2) * sizeof(*newarray)); + newarray = _malloc_internal((count+2) * sizeof(*newarray)); newarray[0] = newlist; memcpy(&newarray[1], &cls->ext->propertyLists[0], count * sizeof(*newarray)); @@ -1577,7 +1702,7 @@ _class_addProperties(struct old_class *cls, cls->ext->propertyLists = newarray; } - OBJC_UNLOCK(&classLock); + mutex_unlock(&classLock); } @@ -1593,14 +1718,14 @@ Protocol **class_copyProtocolList(Class cls_gen, unsigned int *outCount) struct old_protocol_list *plist; Protocol **result = NULL; unsigned int count = 0; - unsigned int i, p; + unsigned int p; if (!cls) { if (outCount) *outCount = 0; return NULL; } - OBJC_LOCK(&classLock); + mutex_lock(&classLock); for (plist = cls->protocols; plist != NULL; plist = plist->next) { count += (int)plist->count; @@ -1613,6 +1738,7 @@ Protocol **class_copyProtocolList(Class cls_gen, unsigned int *outCount) plist != NULL; plist = plist->next) { + int i; for (i = 0; i < plist->count; i++) { result[p++] = (Protocol *)plist->list[i]; } @@ -1620,7 +1746,7 @@ Protocol **class_copyProtocolList(Class cls_gen, unsigned int *outCount) result[p] = NULL; } - OBJC_UNLOCK(&classLock); + mutex_unlock(&classLock); if (outCount) *outCount = count; return result; @@ -1636,7 +1762,7 @@ Property class_getProperty(Class cls_gen, const char *name) struct old_class *cls = _class_asOld(cls_gen); if (!cls || !name) return NULL; - OBJC_LOCK(&classLock); + mutex_lock(&classLock); for (result = NULL; cls && !result; cls = cls->super_class) { uintptr_t iterator = 0; @@ -1654,7 +1780,7 @@ Property class_getProperty(Class cls_gen, const char *name) } done: - OBJC_UNLOCK(&classLock); + mutex_unlock(&classLock); return result; } @@ -1680,7 +1806,7 @@ Property *class_copyPropertyList(Class cls_gen, unsigned int *outCount) return NULL; } - OBJC_LOCK(&classLock); + mutex_lock(&classLock); iterator = 0; while ((plist = nextPropertyList(cls, &iterator))) { @@ -1700,7 +1826,7 @@ Property *class_copyPropertyList(Class cls_gen, unsigned int *outCount) result[p] = NULL; } - OBJC_UNLOCK(&classLock); + mutex_unlock(&classLock); if (outCount) *outCount = count; return result; @@ -1720,14 +1846,14 @@ Method *class_copyMethodList(Class cls_gen, unsigned int *outCount) void *iterator = NULL; Method *result = NULL; unsigned int count = 0; - unsigned int m, i; + unsigned int m; if (!cls) { if (outCount) *outCount = 0; return NULL; } - OBJC_LOCK(&methodListLock); + mutex_lock(&methodListLock); iterator = NULL; while ((mlist = nextMethodList(cls, &iterator))) { @@ -1740,14 +1866,20 @@ Method *class_copyMethodList(Class cls_gen, unsigned int *outCount) m = 0; iterator = NULL; while ((mlist = nextMethodList(cls, &iterator))) { + int i; for (i = 0; i < mlist->method_count; i++) { - result[m++] = (Method)&mlist->method_list[i]; + Method aMethod = (Method)&mlist->method_list[i]; + if (method_getName(aMethod) == (SEL)kIgnore) { + count--; + continue; + } + result[m++] = aMethod; } } result[m] = NULL; } - OBJC_UNLOCK(&methodListLock); + mutex_unlock(&methodListLock); if (outCount) *outCount = count; return result; @@ -1765,7 +1897,7 @@ Ivar *class_copyIvarList(Class cls_gen, unsigned int *outCount) struct old_class *cls = oldcls(cls_gen); Ivar *result = NULL; unsigned int count = 0; - unsigned int i; + int i; if (!cls) { if (outCount) *outCount = 0; @@ -1821,32 +1953,15 @@ void set_superclass(struct old_class *cls, struct old_class *supercls) } } -Class objc_allocateClassPair(Class superclass_gen, const char *name, - size_t extraBytes) +void objc_initializeClassPair(Class superclass_gen, const char *name, Class cls_gen, Class meta_gen) { - struct old_class *superclass = oldcls(superclass_gen); - struct old_class *cls, *meta; - - if (objc_getClass(name)) return NO; - // fixme reserve class name against simultaneous allocation - - if (superclass && (superclass->info & CLS_CONSTRUCTING)) { - // Can't make subclass of an in-construction class - return NO; - } - - // Allocate new classes. - if (superclass) { - cls = _calloc_internal(superclass->isa->instance_size + extraBytes, 1); - meta = _calloc_internal(superclass->isa->isa->instance_size + extraBytes, 1); - } else { - cls = _calloc_internal(sizeof(struct old_class) + extraBytes, 1); - meta = _calloc_internal(sizeof(struct old_class) + extraBytes, 1); - } - + struct old_class *supercls = oldcls(superclass_gen); + struct old_class *cls = oldcls(cls_gen); + struct old_class *meta = oldcls(meta_gen); + // Connect to superclasses and metaclasses cls->isa = meta; - set_superclass(cls, superclass); + set_superclass(cls, supercls); // Set basic info cls->name = _strdup_internal(name); @@ -1857,9 +1972,9 @@ Class objc_allocateClassPair(Class superclass_gen, const char *name, meta->info = CLS_META | CLS_CONSTRUCTING | CLS_EXT | CLS_LEAF; // Set instance size based on superclass. - if (superclass) { - cls->instance_size = superclass->instance_size; - meta->instance_size = superclass->isa->instance_size; + if (supercls) { + cls->instance_size = supercls->instance_size; + meta->instance_size = supercls->isa->instance_size; } else { cls->instance_size = sizeof(struct old_class *); // just an isa meta->instance_size = sizeof(struct old_class); @@ -1877,7 +1992,34 @@ Class objc_allocateClassPair(Class superclass_gen, const char *name, meta->cache = (Cache)&_objc_empty_cache; meta->protocols = NULL; cls->ext = NULL; +} + +Class objc_allocateClassPair(Class superclass_gen, const char *name, + size_t extraBytes) +{ + struct old_class *supercls = oldcls(superclass_gen); + Class cls, meta; + + if (objc_getClass(name)) return NO; + // fixme reserve class name against simultaneous allocation + + if (supercls && (supercls->info & CLS_CONSTRUCTING)) { + // Can't make subclass of an in-construction class + return NO; + } + + // Allocate new classes. + if (supercls) { + cls = _calloc_class(supercls->isa->instance_size + extraBytes); + meta = _calloc_class(supercls->isa->isa->instance_size + extraBytes); + } else { + cls = _calloc_class(sizeof(struct old_class) + extraBytes); + meta = _calloc_class(sizeof(struct old_class) + extraBytes); + } + + objc_initializeClassPair(superclass_gen, name, cls, meta); + return (Class)cls; } @@ -1908,7 +2050,7 @@ void objc_registerClassPair(Class cls_gen) return; } - OBJC_LOCK(&classLock); + mutex_lock(&classLock); // Build ivar layouts if (UseGC) { @@ -1976,8 +2118,10 @@ void objc_registerClassPair(Class cls_gen) cls->isa->info |= CLS_CONSTRUCTED; NXHashInsertIfAbsent(class_hash, cls); + objc_addRegisteredClass((Class)cls); + //objc_addRegisteredClass(cls->isa); if we ever allocate classes from GC - OBJC_UNLOCK(&classLock); + mutex_unlock(&classLock); } @@ -1991,7 +2135,7 @@ Class objc_duplicateClass(Class orig_gen, const char *name, size_t extraBytes) // instance_size has historically contained two extra words, // and instance_size is what objc_getIndexedIvars() actually uses. struct old_class *duplicate = (struct old_class *) - calloc(original->isa->instance_size + extraBytes, 1); + _calloc_class(original->isa->instance_size + extraBytes); duplicate->isa = original->isa; duplicate->super_class = original->super_class; @@ -2021,7 +2165,7 @@ Class objc_duplicateClass(Class orig_gen, const char *name, size_t extraBytes) duplicateMethods = (struct old_method_list *) calloc(sizeof(struct old_method_list) + (count-1)*sizeof(struct old_method), 1); - duplicateMethods->obsolete = _OBJC_FIXED_UP; + duplicateMethods->obsolete = fixed_up_method_list; duplicateMethods->method_count = count; for (i = 0; i < count; i++) { duplicateMethods->method_list[i] = *(originalMethods[i]); @@ -2031,9 +2175,10 @@ Class objc_duplicateClass(Class orig_gen, const char *name, size_t extraBytes) free(originalMethods); } - OBJC_LOCK(&classLock); + mutex_lock(&classLock); NXHashInsert(class_hash, duplicate); - OBJC_UNLOCK(&classLock); + objc_addRegisteredClass((Class)duplicate); + mutex_unlock(&classLock); return (Class)duplicate; } @@ -2059,9 +2204,12 @@ void objc_disposeClassPair(Class cls_gen) return; } + mutex_lock(&classLock); NXHashRemove(class_hash, cls); + objc_removeRegisteredClass((Class)cls); unload_class(cls->isa); unload_class(cls); + mutex_unlock(&classLock); } @@ -2085,8 +2233,14 @@ static id _internal_object_copyFromZone(id oldObj, size_t extraBytes, void *zone obj = (*_zoneAlloc)(oldObj->isa, extraBytes, zone); size = _class_getInstanceSize(oldObj->isa) + extraBytes; + // fixme need C++ copy constructor - bcopy((const char*)oldObj, (char*)obj, size); + objc_memmove_collectable(obj, oldObj, size); + +#if !defined(NO_GC) + if (UseGC) gc_fixup_weakreferences(obj, oldObj); +#endif + return obj; } @@ -2144,7 +2298,7 @@ id (*_dealloc)(id) = _internal_object_dispose; id (*_zoneAlloc)(Class, size_t, void *) = _internal_class_createInstanceFromZone; id (*_zoneCopy)(id, size_t, void *) = _internal_object_copyFromZone; id (*_zoneRealloc)(id, size_t, void *) = _internal_object_reallocFromZone; -void (*_error)() = (void(*)())_objc_error; +void (*_error)(id, const char *, va_list) = _objc_error; id class_createInstance(Class cls, size_t extraBytes) diff --git a/runtime/objc-class.m b/runtime/objc-class.m index 09c16ea..8debcdd 100644 --- a/runtime/objc-class.m +++ b/runtime/objc-class.m @@ -156,24 +156,8 @@ * Imports. **********************************************************************/ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#import "objc.h" -#import "Object.h" -#import "objc-private.h" -#import "hashtable2.h" -#import "maptable.h" -#import "objc-initialize.h" -#import "objc-auto.h" +#include "objc-private.h" +#include /* overriding the default object allocation and error handling routines */ @@ -191,9 +175,6 @@ OBJC_EXPORT id (*_zoneCopy)(id, size_t, void *); * Function prototypes internal to this module. **********************************************************************/ -static void _freedHandler (id self, SEL sel); -static void _nonexistentHandler (id self, SEL sel); -static int LogObjCMessageSend (BOOL isClassMethod, const char * objectsClass, const char * implementingClass, SEL selector); static IMP lookupMethodInClassAndLoadCache(Class cls, SEL sel); static Method look_up_method(Class cls, SEL sel, BOOL withCache, BOOL withResolver); @@ -202,12 +183,19 @@ static Method look_up_method(Class cls, SEL sel, BOOL withCache, BOOL withResolv * Static data internal to this module. **********************************************************************/ +#if !TARGET_OS_WIN32 && !defined(__arm__) +# define MESSAGE_LOGGING +#endif + +#if defined(MESSAGE_LOGGING) // Method call logging +static int LogObjCMessageSend (BOOL isClassMethod, const char * objectsClass, const char * implementingClass, SEL selector); typedef int (*ObjCLogProc)(BOOL, const char *, const char *, SEL); static int objcMsgLogFD = (-1); static ObjCLogProc objcMsgLogProc = &LogObjCMessageSend; static int objcMsgLogEnabled = 0; +#endif /*********************************************************************** * Information about multi-thread support: @@ -236,10 +224,11 @@ Class object_getClass(id obj) **********************************************************************/ Class object_setClass(id obj, Class cls) { - // fixme could check obj's block size vs. cls's instance size if (obj) { - Class old = obj->isa; - obj->isa = cls; + Class old; + do { + old = obj->isa; + } while (! OSAtomicCompareAndSwapPtrBarrier(old, cls, (void*)&obj->isa)); return old; } else return Nil; @@ -331,8 +320,8 @@ static void object_cxxDestructFromClass(id obj, Class cls) for ( ; cls != NULL; cls = _class_getSuperclass(cls)) { if (!_class_hasCxxStructorsNoSuper(cls)) continue; dtor = (void(*)(id)) - lookupMethodInClassAndLoadCache(cls, cxx_destruct_sel); - if (dtor != (void(*)(id))&_objc_msgForward) { + lookupMethodInClassAndLoadCache(cls, SEL_cxx_destruct); + if (dtor != (void(*)(id))&_objc_msgForward_internal) { if (PrintCxxCtors) { _objc_inform("CXX: calling C++ destructors for class %s", _class_getName(cls)); @@ -382,8 +371,8 @@ static BOOL object_cxxConstructFromClass(id obj, Class cls) // Find this class's ctor, if any. if (!_class_hasCxxStructorsNoSuper(cls)) return YES; // no ctor - ok - ctor = (id(*)(id))lookupMethodInClassAndLoadCache(cls, cxx_construct_sel); - if (ctor == (id(*)(id))&_objc_msgForward) return YES; // no ctor - ok + ctor = (id(*)(id))lookupMethodInClassAndLoadCache(cls, SEL_cxx_construct); + if (ctor == (id(*)(id))&_objc_msgForward_internal) return YES; // no ctor - ok // Call this class's ctor. if (PrintCxxCtors) { @@ -413,11 +402,6 @@ __private_extern__ BOOL object_cxxConstruct(id obj) } -@interface objc_resolver -+(BOOL)resolveClassMethod:(SEL)sel; -+(BOOL)resolveInstanceMethod:(SEL)sel; -@end - /*********************************************************************** * _class_resolveClassMethod * Call +resolveClassMethod and return the method added or NULL. @@ -430,7 +414,7 @@ static Method _class_resolveClassMethod(Class cls, SEL sel) Method meth = NULL; Class clsInstance; - if (!look_up_method(cls, @selector(resolveClassMethod:), + if (!look_up_method(cls, SEL_resolveClassMethod, YES /*cache*/, NO /*resolver*/)) { return NULL; @@ -440,13 +424,13 @@ static Method _class_resolveClassMethod(Class cls, SEL sel) if (strncmp(_class_getName(cls), "_%", 2) == 0) { // Posee's meta's name is smashed and isn't in the class_hash, // so objc_getClass doesn't work. - char *baseName = strchr(_class_getName(cls), '%'); // get posee's real name - clsInstance = objc_getClass(baseName); + const char *baseName = strchr(_class_getName(cls), '%'); // get posee's real name + clsInstance = (Class)objc_getClass(baseName); } else { - clsInstance = objc_getClass(_class_getName(cls)); + clsInstance = (Class)objc_getClass(_class_getName(cls)); } - resolved = [clsInstance resolveClassMethod:sel]; + resolved = ((BOOL(*)(id, SEL, SEL))objc_msgSend)((id)clsInstance, SEL_resolveClassMethod, sel); if (resolved) { // +resolveClassMethod adds to self->isa @@ -479,13 +463,13 @@ static Method _class_resolveInstanceMethod(Class cls, SEL sel) BOOL resolved; Method meth = NULL; - if (!look_up_method(((id)cls)->isa, @selector(resolveInstanceMethod:), + if (!look_up_method(((id)cls)->isa, SEL_resolveInstanceMethod, YES /*cache*/, NO /*resolver*/)) { return NULL; } - resolved = [cls resolveInstanceMethod:sel]; + resolved = ((BOOL(*)(id, SEL, SEL))objc_msgSend)((id)cls, SEL_resolveInstanceMethod, sel); if (resolved) { // +resolveClassMethod adds to self @@ -514,7 +498,7 @@ static Method _class_resolveInstanceMethod(Class cls, SEL sel) * the method added or NULL. * Assumes the method doesn't exist already. **********************************************************************/ -static Method _class_resolveMethod(Class cls, SEL sel) +__private_extern__ Method _class_resolveMethod(Class cls, SEL sel) { Method meth = NULL; @@ -550,8 +534,8 @@ static Method look_up_method(Class cls, SEL sel, Method meth = NULL; if (withCache) { - meth = _cache_getMethod(cls, sel, &_objc_msgForward); - if (!meth && (IMP)_objc_msgForward == _cache_getImp(cls, sel)) { + meth = _cache_getMethod(cls, sel, &_objc_msgForward_internal); + if (meth == (Method)1) { // Cache contains forward:: . Stop searching. return NULL; } @@ -573,8 +557,7 @@ Method class_getInstanceMethod(Class cls, SEL sel) { if (!cls || !sel) return NULL; - /* Cache is not used because historically it wasn't. */ - return look_up_method(cls, sel, NO/*cache*/, YES/*resolver*/); + return look_up_method(cls, sel, YES/*cache*/, YES/*resolver*/); } /*********************************************************************** @@ -660,33 +643,29 @@ const char *property_getAttributes(Property prop) /*********************************************************************** -* _objc_flush_caches. Flush the caches of the specified class and any -* of its subclasses. If cls is a meta-class, only meta-class (i.e. -* class method) caches are flushed. If cls is an instance-class, both -* instance-class and meta-class caches are flushed. +* gdb_objc_class_changed +* Tell gdb that a class changed. Currently used for OBJC2 ivar layouts only **********************************************************************/ -void _objc_flush_caches(Class cls) +void gdb_objc_class_changed(Class cls, unsigned long changes, const char *classname) { - flush_caches (cls, YES); + // do nothing; gdb sets a breakpoint here to listen +#if TARGET_OS_WIN32 + __asm { } +#else + asm(""); +#endif } /*********************************************************************** -* _freedHandler. -**********************************************************************/ -static void _freedHandler(id obj, SEL sel) -{ - __objc_error (obj, "message %s sent to freed object=%p", - sel_getName(sel), obj); -} - -/*********************************************************************** -* _nonexistentHandler. +* _objc_flush_caches. Flush the caches of the specified class and any +* of its subclasses. If cls is a meta-class, only meta-class (i.e. +* class method) caches are flushed. If cls is an instance-class, both +* instance-class and meta-class caches are flushed. **********************************************************************/ -static void _nonexistentHandler(id obj, SEL sel) +void _objc_flush_caches(Class cls) { - __objc_error (obj, "message %s sent to non-existent object=%p", - sel_getName(sel), obj); + flush_caches (cls, YES); } @@ -703,19 +682,14 @@ BOOL class_respondsToMethod(Class cls, SEL sel) BOOL class_respondsToSelector(Class cls, SEL sel) { - Method meth; + IMP imp; if (!sel || !cls) return NO; - meth = look_up_method(cls, sel, YES/*cache*/, YES/*resolver*/); - if (meth) { - _cache_fill(cls, meth, sel); - return YES; - } else { - // Cache negative result - _cache_addForwardEntry(cls, sel); - return NO; - } + // Avoids +initialize because it historically did so. + // We're not returning a callable IMP anyway. + imp = lookUpMethod(cls, sel, NO/*initialize*/, YES/*cache*/); + return (imp != (IMP)_objc_msgForward_internal) ? YES : NO; } @@ -730,7 +704,7 @@ IMP class_lookupMethod(Class cls, SEL sel) // No one responds to zero! if (!sel) { - __objc_error(cls, "invalid selector (null)"); + __objc_error((id)cls, "invalid selector (null)"); } return class_getMethodImplementation(cls, sel); @@ -742,14 +716,13 @@ IMP class_getMethodImplementation(Class cls, SEL sel) if (!cls || !sel) return NULL; - // fixme _objc_msgForward does not conform to ABI and cannot be - // called externally + imp = lookUpMethod(cls, sel, YES/*initialize*/, YES/*cache*/); - imp = _cache_getImp(cls, sel); - if (!imp) { - // Handle cache miss - imp = _class_lookupMethodAndLoadCache (cls, sel); + // Translate forwarding function to C-callable external version + if (imp == (IMP)&_objc_msgForward_internal) { + return (IMP)&_objc_msgForward; } + return imp; } @@ -757,7 +730,11 @@ IMP class_getMethodImplementation(Class cls, SEL sel) IMP class_getMethodImplementation_stret(Class cls, SEL sel) { IMP imp = class_getMethodImplementation(cls, sel); - // fixme check for forwarding and use stret forwarder instead + + // Translate forwarding function to struct-returning version + if (imp == (IMP)&_objc_msgForward /* not _internal! */) { + return (IMP)&_objc_msgForward_stret; + } return imp; } @@ -769,6 +746,7 @@ __private_extern__ id _objc_ignored_method(id self, SEL _cmd) { return self; } /*********************************************************************** * instrumentObjcMessageSends/logObjcMessageSends. **********************************************************************/ +#if defined(MESSAGE_LOGGING) static int LogObjCMessageSend (BOOL isClassMethod, const char * objectsClass, const char * implementingClass, @@ -796,7 +774,10 @@ static int LogObjCMessageSend (BOOL isClassMethod, implementingClass, (char *) selector); + static OSSpinLock lock = OS_SPINLOCK_INIT; + OSSpinLockLock(&lock); write (objcMsgLogFD, buf, strlen(buf)); + OSSpinLockUnlock(&lock); // Tell caller to not cache the method return 0; @@ -837,7 +818,7 @@ __private_extern__ void logObjcMessageSends (ObjCLogProc logProc) if (objcMsgLogFD != (-1)) fsync (objcMsgLogFD); } - +#endif /*********************************************************************** * log_and_fill_cache @@ -845,9 +826,10 @@ __private_extern__ void logObjcMessageSends (ObjCLogProc logProc) * cls is the method whose cache should be filled. * implementer is the class that owns the implementation in question. **********************************************************************/ -static void +__private_extern__ void log_and_fill_cache(Class cls, Class implementer, Method meth, SEL sel) { +#if defined(MESSAGE_LOGGING) BOOL cacheIt = YES; if (objcMsgLogEnabled) { @@ -856,91 +838,126 @@ log_and_fill_cache(Class cls, Class implementer, Method meth, SEL sel) _class_getName(implementer), sel); } - if (cacheIt) { + if (cacheIt) +#endif _cache_fill (cls, meth, sel); - } } /*********************************************************************** * _class_lookupMethodAndLoadCache. -* -* Called only from objc_msgSend, objc_msgSendSuper and class_lookupMethod. +* Method lookup for dispatchers ONLY. OTHER CODE SHOULD USE lookUpMethod(). +* This lookup avoids optimistic cache scan because the dispatcher +* already tried that. **********************************************************************/ __private_extern__ IMP _class_lookupMethodAndLoadCache(Class cls, SEL sel) +{ + return lookUpMethod(cls, sel, YES/*initialize*/, NO/*cache*/); +} + + +/*********************************************************************** +* lookUpMethod. +* The standard method lookup. +* initialize==NO tries to avoid +initialize (but sometimes fails) +* cache==NO skips optimistic unlocked lookup (but uses cache elsewhere) +* Most callers should use initialize==YES and cache==YES. +* May return _objc_msgForward_internal. IMPs destined for external use +* must be converted to _objc_msgForward or _objc_msgForward_stret. +**********************************************************************/ +__private_extern__ IMP lookUpMethod(Class cls, SEL sel, + BOOL initialize, BOOL cache) { Class curClass; IMP methodPC = NULL; + Method meth; + BOOL triedResolver = NO; - // Check for freed class - if (cls == _class_getFreedObjectClass()) - return (IMP) _freedHandler; + // Optimistic cache lookup + if (cache) { + methodPC = _cache_getImp(cls, sel); + if (methodPC) return methodPC; + } - // Check for nonexistent class - if (cls == _class_getNonexistentObjectClass()) - return (IMP) _nonexistentHandler; + // realize, +initialize, and any special early exit + methodPC = prepareForMethodLookup(cls, sel, initialize); + if (methodPC) return methodPC; -#if __OBJC2__ - // fixme hack - _class_realize(cls); -#endif - if (!_class_isInitialized(cls)) { - _class_initialize (cls); - // If sel == initialize, _class_initialize will send +initialize and - // then the messenger will send +initialize again after this - // procedure finishes. Of course, if this is not being called - // from the messenger then it won't happen. 2778172 + // The lock is held to make method-lookup + cache-fill atomic + // with respect to method addition. Otherwise, a category could + // be added but ignored indefinitely because the cache was re-filled + // with the old value after the cache flush on behalf of the category. + retry: + lockForMethodLookup(); + + // Try this class's cache. + + methodPC = _cache_getImp(cls, sel); + if (methodPC) goto done; + + // Try this class's method lists. + + meth = _class_getMethodNoSuper_nolock(cls, sel); + if (meth) { + log_and_fill_cache(cls, cls, meth, sel); + methodPC = method_getImplementation(meth); + goto done; } - // Outer loop - search the caches and method lists of the - // class and its super-classes - for (curClass = cls; curClass; curClass = _class_getSuperclass(curClass)) - { - // Beware of thread-unsafety and double-freeing of forward:: - // entries here! See note in "Method cache locking" above. - // The upshot is that _cache_getMethod() will return NULL - // instead of returning a forward:: entry. - Method meth = _cache_getMethod(curClass, sel, &_objc_msgForward); + // Try superclass caches and method lists. + + curClass = cls; + while ((curClass = _class_getSuperclass(curClass))) { + // Superclass cache. + meth = _cache_getMethod(curClass, sel, &_objc_msgForward_internal); if (meth) { - // Found the method in this class or a superclass. - // Cache the method in this class, unless we just found it in - // this class's cache. - if (curClass != cls) { - _cache_fill (cls, meth, sel); + if (meth != (Method)1) { + // Found the method in a superclass. Cache it in this class. + log_and_fill_cache(cls, curClass, meth, sel); + methodPC = method_getImplementation(meth); + goto done; + } + else { + // Found a forward:: entry in a superclass. + // Stop searching, but don't cache yet; call method + // resolver for this class first. + break; } - - methodPC = method_getImplementation(meth); - break; } - // Cache scan failed. Search method list. - - meth = _class_getMethodNoSuper(curClass, sel); + // Superclass method list. + meth = _class_getMethodNoSuper_nolock(curClass, sel); if (meth) { log_and_fill_cache(cls, curClass, meth, sel); methodPC = method_getImplementation(meth); - break; + goto done; } } - if (methodPC == NULL) { - // Class and superclasses do not respond -- try resolve handler - Method meth = _class_resolveMethod(cls, sel); - if (meth) { - // GrP fixme this isn't quite right - log_and_fill_cache(cls, cls, meth, sel); - methodPC = method_getImplementation(meth); - } - } + // No implementation found. Try method resolver once. - if (methodPC == NULL) { - // Class and superclasses do not respond and - // resolve handler didn't help -- use forwarding - _cache_addForwardEntry(cls, sel); - methodPC = &_objc_msgForward; + if (!triedResolver) { + unlockForMethodLookup(); + _class_resolveMethod(cls, sel); + // Don't cache the result; we don't hold the lock so it may have + // changed already. Re-do the search from scratch instead. + triedResolver = YES; + goto retry; } + // No implementation found, and method resolver didn't help. + // Use forwarding. + + _cache_addForwardEntry(cls, sel); + methodPC = &_objc_msgForward_internal; + + done: + unlockForMethodLookup(); + + // paranoia: look for ignored selectors with non-ignored implementations + assert(!(sel == (SEL)kIgnore && methodPC != (IMP)&_objc_ignored_method)); + return methodPC; } @@ -955,6 +972,11 @@ static IMP lookupMethodInClassAndLoadCache(Class cls, SEL sel) Method meth; IMP imp; + // fixme this still has the method list vs method cache race + // because it doesn't hold a lock across lookup+cache_fill, + // but it's only used for .cxx_construct/destruct and we assume + // categories don't change them. + // Search cache first. imp = _cache_getImp(cls, sel); if (imp) return imp; @@ -970,7 +992,7 @@ static IMP lookupMethodInClassAndLoadCache(Class cls, SEL sel) } else { // Miss in method list. Cache objc_msgForward. _cache_addForwardEntry(cls, sel); - return &_objc_msgForward; + return &_objc_msgForward_internal; } } @@ -979,33 +1001,12 @@ static IMP lookupMethodInClassAndLoadCache(Class cls, SEL sel) * _objc_create_zone. **********************************************************************/ -void * _objc_create_zone (void) +void *_objc_create_zone(void) { return malloc_default_zone(); } -/*********************************************************************** -* _objc_internal_zone. -* Malloc zone for internal runtime data. -* By default this is the default malloc zone, but a dedicated zone is -* used if environment variable OBJC_USE_INTERNAL_ZONE is set. -**********************************************************************/ -__private_extern__ malloc_zone_t *_objc_internal_zone(void) -{ - static malloc_zone_t *z = (malloc_zone_t *)-1; - if (z == (malloc_zone_t *)-1) { - if (UseInternalZone) { - z = malloc_create_zone(vm_page_size, 0); - malloc_set_zone_name(z, "ObjC"); - } else { - z = malloc_default_zone(); - } - } - return z; -} - - /*********************************************************************** * _malloc_internal * _calloc_internal @@ -1033,9 +1034,11 @@ __private_extern__ void *_realloc_internal(void *ptr, size_t size) __private_extern__ char *_strdup_internal(const char *str) { + size_t len; + char *dup; if (!str) return NULL; - size_t len = strlen(str); - char *dup = malloc_zone_malloc(_objc_internal_zone(), len + 1); + len = strlen(str); + dup = malloc_zone_malloc(_objc_internal_zone(), len + 1); memcpy(dup, str, len + 1); return dup; } @@ -1064,6 +1067,15 @@ __private_extern__ void _free_internal(void *ptr) } +__private_extern__ Class _calloc_class(size_t size) +{ +#if !defined(NO_GC) + if (UseGC) return (Class) malloc_zone_calloc(gc_zone, 1, size); +#endif + return (Class) _calloc_internal(1, size); +} + + const char *class_getName(Class cls) { return _class_getName(cls); @@ -1085,15 +1097,6 @@ size_t class_getInstanceSize(Class cls) return _class_getInstanceSize(cls); } -void method_exchangeImplementations(Method m1, Method m2) -{ - // fixme thread safe - IMP m1_imp; - if (!m1 || !m2) return; - m1_imp = method_getImplementation(m1); - method_setImplementation(m1, method_setImplementation(m2, m1_imp)); -} - /*********************************************************************** * method_getNumberOfArguments. @@ -1125,7 +1128,7 @@ unsigned int method_getArgumentInfo(Method m, int arg, void method_getReturnType(Method m, char *dst, size_t dst_len) { - return encoding_getReturnType(method_getTypeEncoding(m), dst, dst_len); + encoding_getReturnType(method_getTypeEncoding(m), dst, dst_len); } @@ -1138,8 +1141,8 @@ char * method_copyReturnType(Method m) void method_getArgumentType(Method m, unsigned int index, char *dst, size_t dst_len) { - return encoding_getArgumentType(method_getTypeEncoding(m), - index, dst, dst_len); + encoding_getArgumentType(method_getTypeEncoding(m), + index, dst, dst_len); } @@ -1149,6 +1152,56 @@ char * method_copyArgumentType(Method m, unsigned int index) } +/*********************************************************************** +* objc_constructInstance +* Creates an instance of `cls` at the location pointed to by `bytes`. +* `bytes` must point to at least class_getInstanceSize(cls) bytes of +* well-aligned zero-filled memory. +* The new object's isa is set. Any C++ constructors are called. +* Returns `bytes` if successful. Returns nil if `cls` or `bytes` is +* NULL, or if C++ constructors fail. +**********************************************************************/ +id objc_constructInstance(Class cls, void *bytes) +{ + id obj; + + if (!cls || !bytes) return nil; + obj = (id)bytes; + + // Set the isa pointer + obj->isa = cls; + + // Call C++ constructors, if any. + if (!object_cxxConstruct(obj)) { + // Some C++ constructor threw an exception. + return nil; + } + + return obj; +} + + +/*********************************************************************** +* objc_destructInstance +* Destroys an instance without freeing memory. +* Any C++ destructors are called. Any associative references are removed. +* Returns `obj`. Does nothing if `obj` is nil. +**********************************************************************/ +void *objc_destructInstance(id obj) +{ + if (obj) { + object_cxxDestruct(obj); + + // don't call this if the class has never had associative references. + if (_class_instancesHaveAssociatedObjects(obj->isa)) { + _object_remove_assocations(obj); + } + } + + return obj; +} + + /*********************************************************************** * _internal_class_createInstanceFromZone. Allocate an instance of the * specified class with the specified number of bytes for indexed @@ -1159,6 +1212,7 @@ __private_extern__ id _internal_class_createInstanceFromZone(Class cls, size_t extraBytes, void *zone) { + void *bytes; id obj; size_t size; @@ -1167,26 +1221,31 @@ _internal_class_createInstanceFromZone(Class cls, size_t extraBytes, // Allocate and initialize size = _class_getInstanceSize(cls) + extraBytes; + + // CF requires all objects be at least 16 bytes. + if (size < 16) size = 16; + +#if !defined(NO_GC) if (UseGC) { - obj = (id) auto_zone_allocate_object(gc_zone, size, - AUTO_OBJECT_SCANNED, false, true); - } else if (zone) { - obj = (id) malloc_zone_calloc (zone, 1, size); + bytes = auto_zone_allocate_object(gc_zone, size, + AUTO_OBJECT_SCANNED, 0, 1); + } else +#endif + if (zone) { + bytes = malloc_zone_calloc (zone, 1, size); } else { - obj = (id) calloc(1, size); + bytes = calloc(1, size); } - if (!obj) return nil; - - // Set the isa pointer - obj->isa = cls; + if (!bytes) return nil; - // Call C++ constructors, if any. - if (!object_cxxConstruct(obj)) { - // Some C++ constructor threw an exception. + obj = objc_constructInstance(cls, bytes); + if (!obj) { +#if !defined(NO_GC) if (UseGC) { - auto_zone_retain(gc_zone, obj); // gc free expects retain count==1 + auto_zone_retain(gc_zone, bytes); // gc free expects rc==1 } - free(obj); +#endif + free(bytes); return nil; } @@ -1198,14 +1257,42 @@ __private_extern__ id _internal_object_dispose(id anObject) { if (anObject==nil) return nil; - object_cxxDestruct(anObject); + + objc_destructInstance(anObject); + +#if !defined(NO_GC) if (UseGC) { - auto_zone_retain(gc_zone, anObject); // gc free expects retain count==1 - } else { + auto_zone_retain(gc_zone, anObject); // gc free expects rc==1 + } else +#endif + { +#if !__OBJC2__ // only clobber isa for non-gc anObject->isa = _objc_getFreedObjectClass (); +#endif } free(anObject); return nil; } + +/*********************************************************************** +* inform_duplicate. Complain about duplicate class implementations. +**********************************************************************/ +__private_extern__ void +inform_duplicate(const char *name, Class oldCls, Class cls) +{ +#if TARGET_OS_WIN32 + _objc_inform ("Class %s is implemented in two different images.", name); +#else + const header_info *oldHeader = _headerForClass(oldCls); + const header_info *newHeader = _headerForClass(cls); + const char *oldName = oldHeader ? _nameForHeader(oldHeader->mhdr) : "??"; + const char *newName = newHeader ? _nameForHeader(newHeader->mhdr) : "??"; + + _objc_inform ("Class %s is implemented in both %s and %s. " + "One of the two will be used. " + "Which one is undefined.", + name, oldName, newName); +#endif +} diff --git a/runtime/objc-config.h b/runtime/objc-config.h index ec63b65..219214f 100644 --- a/runtime/objc-config.h +++ b/runtime/objc-config.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999-2002, 2005-2006 Apple Inc. All Rights Reserved. + * Copyright (c) 1999-2002, 2005-2008 Apple Inc. All Rights Reserved. * * @APPLE_LICENSE_HEADER_START@ * @@ -20,14 +20,66 @@ * * @APPLE_LICENSE_HEADER_END@ */ -// Copyright 1988-1996 NeXT Software, Inc. -// objc-config.h created by kthorup on Fri 24-Mar-1995 + +#include + +// Define NO_GC to disable garbage collection. +// Be sure to edit OBJC_NO_GC in objc-auto.h as well. +#if TARGET_OS_EMBEDDED || TARGET_OS_WIN32 +# define NO_GC 1 +#endif + +// Define NO_ENVIRON to disable getenv(). +#if TARGET_OS_EMBEDDED +# define NO_ENVIRON 1 +#endif + +// Define NO_ZONES to disable malloc zone support in NXHashTable. +#if TARGET_OS_EMBEDDED +# define NO_ZONES 1 +#endif + +// Define NO_MOD to avoid the mod operator in NXHashTable and objc-sel-set. +#if defined(__arm__) +# define NO_MOD 1 +#endif + +// Define NO_BUILTINS to disable the builtin selector table from dyld +#if TARGET_OS_WIN32 +# define NO_BUILTINS 1 +#endif + +// Define NO_DEBUGGER_MODE to disable lock-avoiding execution for debuggers +#if TARGET_OS_WIN32 +# define NO_DEBUGGER_MODE 1 +#endif + +#if __OBJC2__ + +// Define NO_FIXUP to use non-fixup messaging for OBJC2. +#if defined(__arm__) +# define NO_FIXUP 1 +#endif + +// Define NO_VTABLE to disable vtable dispatch for OBJC2. +#if defined(NO_FIXUP) || defined(__ppc64__) +# define NO_VTABLE 1 +#endif + +// Define NO_ZEROCOST_EXCEPTIONS to use sjlj exceptions for OBJC2. +// Be sure to edit objc-exception.h as well (objc_add/removeExceptionHandler) +#if defined(__arm__) +# define NO_ZEROCOST_EXCEPTIONS 1 +#endif + +#endif + // OBJC_INSTRUMENTED controls whether message dispatching is dynamically // monitored. Monitoring introduces substantial overhead. // NOTE: To define this condition, do so in the build command, NOT by // uncommenting the line here. This is because objc-class.h heeds this -// condition, but objc-class.h can not #import this file (objc-config.h) +// condition, but objc-class.h can not #include this file (objc-config.h) // because objc-class.h is public and objc-config.h is not. //#define OBJC_INSTRUMENTED @@ -35,13 +87,7 @@ // Not available on all architectures. Not needed // (by us) on some configurations. #if defined (__i386__) || defined (i386) - #import +# include #elif defined (__ppc__) || defined(ppc) - #import -#elif defined (__ppc64__) - // no asm_help for ppc64 -#elif defined (__x86_64__) - // no asm_help for x86-64 -#else - #error We need asm_help.h for this architecture +# include #endif diff --git a/runtime/objc-errors.m b/runtime/objc-errors.m index 7a9f677..c0b3f9c 100644 --- a/runtime/objc-errors.m +++ b/runtime/objc-errors.m @@ -25,13 +25,50 @@ * Copyright 1988-2001, NeXT Software, Inc., Apple Computer, Inc. */ +#include "objc-private.h" -#include -#include -#include -#include +#if TARGET_OS_WIN32 -#import "objc-private.h" +#include + +__private_extern__ void _objc_inform_on_crash(const char *fmt, ...) +{ +} + +__private_extern__ void _objc_inform(const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + _vcprintf(fmt, args); + va_end(args); + _cprintf("\n"); +} + +__private_extern__ void _objc_fatal(const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + _vcprintf(fmt, args); + va_end(args); + _cprintf("\n"); + + abort(); +} + +__private_extern__ void __objc_error(id rcv, const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + _vcprintf(fmt, args); + va_end(args); +} + +__private_extern__ void _objc_error(id rcv, const char *fmt, va_list args) +{ + _vcprintf(fmt, args); +} + +#else __private_extern__ char *__crashreporter_info__ = NULL; @@ -44,6 +81,18 @@ static void _objc_crashlog(const char *message) { char *newmsg; +#if 0 + { + // for debugging at BOOT time. + extern char **_NSGetProgname(void); + FILE *crashlog = fopen("/_objc_crash.log", "a"); + setbuf(crashlog, NULL); + fprintf(crashlog, "[%s] %s\n", *_NSGetProgname(), message); + fclose(crashlog); + sync(); + } +#endif + if (!__crashreporter_info__) { newmsg = strdup(message); } else { @@ -210,13 +259,16 @@ static void _objc_trap2(void) __builtin_trap(); } -__private_extern__ void _objc_warn_deprecated(const char *old, const char *new) +#endif + + +__private_extern__ void _objc_warn_deprecated(const char *oldf, const char *newf) { if (PrintDeprecation) { - if (new) { - _objc_inform("The function %s is obsolete. Use %s instead. Set a breakpoint on _objc_warn_deprecated to find the culprit.", old, new); + if (newf) { + _objc_inform("The function %s is obsolete. Use %s instead. Set a breakpoint on _objc_warn_deprecated to find the culprit.", oldf, newf); } else { - _objc_inform("The function %s is obsolete. Do not use it. Set a breakpoint on _objc_warn_deprecated to find the culprit.", old); + _objc_inform("The function %s is obsolete. Do not use it. Set a breakpoint on _objc_warn_deprecated to find the culprit.", oldf); } } } diff --git a/runtime/objc-exception.h b/runtime/objc-exception.h index 1667108..17c0b61 100644 --- a/runtime/objc-exception.h +++ b/runtime/objc-exception.h @@ -24,10 +24,10 @@ #ifndef __OBJC_EXCEPTION_H_ #define __OBJC_EXCEPTION_H_ -#import +#include +#include -// ZEROCOST_SWITCH -#if !__LP64__ || !OBJC_ZEROCOST_EXCEPTIONS +#if !__OBJC2__ // compiler reserves a setjmp buffer + 4 words as localExceptionData @@ -55,9 +55,9 @@ OBJC_EXPORT void objc_exception_get_functions(objc_exception_functions_t *table) OBJC_EXPORT void objc_exception_set_functions(objc_exception_functions_t *table); -// !__LP64__ +// !__OBJC2__ #else -// __LP64__ +// __OBJC2__ typedef id (*objc_exception_preprocessor)(id exception); typedef int (*objc_exception_matcher)(Class catch_type, id exception); @@ -69,15 +69,16 @@ OBJC_EXPORT void objc_exception_rethrow(void); OBJC_EXPORT id objc_begin_catch(void *exc_buf); OBJC_EXPORT void objc_end_catch(void); -OBJC_EXPORT uintptr_t objc_addExceptionHandler(objc_exception_handler fn, void *context); -OBJC_EXPORT void objc_removeExceptionHandler(uintptr_t token); - OBJC_EXPORT objc_exception_preprocessor objc_setExceptionPreprocessor(objc_exception_preprocessor fn); OBJC_EXPORT objc_exception_matcher objc_setExceptionMatcher(objc_exception_matcher fn); OBJC_EXPORT objc_uncaught_exception_handler objc_setUncaughtExceptionHandler(objc_uncaught_exception_handler fn); +#ifndef __arm__ +OBJC_EXPORT uintptr_t objc_addExceptionHandler(objc_exception_handler fn, void *context); +OBJC_EXPORT void objc_removeExceptionHandler(uintptr_t token); +#endif -// __LP64__ +// __OBJC2__ #endif #endif // __OBJC_EXCEPTION_H_ diff --git a/runtime/objc-exception.m b/runtime/objc-exception.m index 250c796..654cdef 100644 --- a/runtime/objc-exception.m +++ b/runtime/objc-exception.m @@ -21,17 +21,17 @@ * @APPLE_LICENSE_HEADER_END@ */ -// ZEROCOST_SWITCH -#if !__LP64__ || !OBJC_ZEROCOST_EXCEPTIONS +#if !__OBJC2__ /*********************************************************************** * 32-bit implementation **********************************************************************/ +#include "objc-private.h" #include +#include -#import "objc-exception.h" -#import "objc-private.h" +#include "objc-exception.h" static objc_exception_functions_t xtab; @@ -66,6 +66,8 @@ void objc_exception_throw(id exception) { if (!xtab.throw_exc) { set_default_handlers(); } + + OBJC_RUNTIME_OBJC_EXCEPTION_THROW(exception); // dtrace probe to log throw activity. xtab.throw_exc(exception); _objc_fatal("objc_exception_throw failed"); } @@ -108,17 +110,13 @@ int objc_exception_match(Class exceptionClass, id exception) { // Perhaps the default implementation should just complain loudly and quit - -#import -#import - extern void _objc_inform(const char *fmt, ...); typedef struct { jmp_buf buf; void *pointers[4]; } LocalData_t; typedef struct _threadChain { LocalData_t *topHandler; - void *perThreadID; + objc_thread_t perThreadID; struct _threadChain *next; } ThreadChainLink_t; @@ -127,9 +125,9 @@ static ThreadChainLink_t ThreadChainLink; static ThreadChainLink_t *getChainLink() { // follow links until thread_self() found (someday) XXX - pthread_t self = pthread_self(); + objc_thread_t self = thread_self(); ThreadChainLink_t *walker = &ThreadChainLink; - while (walker->perThreadID != (void *)self) { + while (walker->perThreadID != self) { if (walker->next != NULL) { walker = walker->next; continue; @@ -147,14 +145,16 @@ static ThreadChainLink_t *getChainLink() { } static void default_try_enter(void *localExceptionData) { + LocalData_t *data = (LocalData_t *)localExceptionData; ThreadChainLink_t *chainLink = getChainLink(); - ((LocalData_t *)localExceptionData)->pointers[1] = chainLink->topHandler; - chainLink->topHandler = localExceptionData; + data->pointers[1] = chainLink->topHandler; + chainLink->topHandler = data; if (PrintExceptions) _objc_inform("EXCEPTIONS: entered try block %p\n", chainLink->topHandler); } static void default_throw(id value) { ThreadChainLink_t *chainLink = getChainLink(); + LocalData_t *led; if (value == nil) { if (PrintExceptions) _objc_inform("EXCEPTIONS: objc_exception_throw with nil value\n"); return; @@ -164,10 +164,15 @@ static void default_throw(id value) { return; } if (PrintExceptions) _objc_inform("EXCEPTIONS: exception thrown, going to handler block %p\n", chainLink->topHandler); - LocalData_t *led = chainLink->topHandler; - chainLink->topHandler = led->pointers[1]; // pop top handler + led = chainLink->topHandler; + chainLink->topHandler = (LocalData_t *) + led->pointers[1]; // pop top handler led->pointers[0] = value; // store exception that is thrown +#if TARGET_OS_WIN32 + longjmp(led->buf, 1); +#else _longjmp(led->buf, 1); +#endif } static void default_try_exit(void *led) { @@ -177,7 +182,8 @@ static void default_try_exit(void *led) { return; } if (PrintExceptions) _objc_inform("EXCEPTIONS: removing try block handler %p\n", chainLink->topHandler); - chainLink->topHandler = chainLink->topHandler->pointers[1]; // pop top handler + chainLink->topHandler = (LocalData_t *) + chainLink->topHandler->pointers[1]; // pop top handler } static id default_extract(void *localExceptionData) { @@ -189,7 +195,7 @@ static int default_match(Class exceptionClass, id exception) { //return [exception isKindOfClass:exceptionClass]; Class cls; for (cls = exception->isa; nil != cls; cls = _class_getSuperclass(cls)) - if (cls == exceptionClass) return 1; + if (cls == exceptionClass) return 1; return 0; } @@ -214,16 +220,16 @@ __private_extern__ void _destroyAltHandlerList(struct alt_handler_list *list) } -// !__LP64__ +// !__OBJC2__ #else -// __LP64__ +// __OBJC2__ /*********************************************************************** * 64-bit implementation. **********************************************************************/ -#include #include "objc-private.h" +#include // unwind library types and functions @@ -251,9 +257,6 @@ typedef enum { _URC_CONTINUE_UNWIND = 8 } _Unwind_Reason_Code; - -typedef _Unwind_Reason_Code (*_Unwind_Trace_Fn)(struct _Unwind_Context *, void *); - struct dwarf_eh_bases { uintptr_t tbase; @@ -264,8 +267,6 @@ struct dwarf_eh_bases extern uintptr_t _Unwind_GetIP (struct _Unwind_Context *); extern uintptr_t _Unwind_GetCFA (struct _Unwind_Context *); extern uintptr_t _Unwind_GetLanguageSpecificData(struct _Unwind_Context *); -extern const void * _Unwind_Find_FDE (void *, struct dwarf_eh_bases *); -extern _Unwind_Reason_Code _Unwind_Backtrace (_Unwind_Trace_Fn, void *); // C++ runtime types and functions @@ -283,12 +284,21 @@ extern void __cxa_end_catch(void); extern void __cxa_rethrow(void); extern void *__cxa_current_exception_type(void); +#ifdef NO_ZEROCOST_EXCEPTIONS +/* fixme _sj0 for objc too? */ +#define CXX_PERSONALITY __gxx_personality_sj0 +#define OBJC_PERSONALITY __objc_personality_v0 +#else +#define CXX_PERSONALITY __gxx_personality_v0 +#define OBJC_PERSONALITY __objc_personality_v0 +#endif + extern _Unwind_Reason_Code -__gxx_personality_v0(int version, - _Unwind_Action actions, - uint64_t exceptionClass, - struct _Unwind_Exception *exceptionObject, - struct _Unwind_Context *context); +CXX_PERSONALITY(int version, + _Unwind_Action actions, + uint64_t exceptionClass, + struct _Unwind_Exception *exceptionObject, + struct _Unwind_Context *context); // objc's internal exception types and data @@ -297,7 +307,7 @@ extern const void *objc_ehtype_vtable[]; struct objc_typeinfo { // Position of vtable and name fields must match C++ typeinfo object - const void **vtable; // always objc_ehtype_vtable + const void **vtable; // always objc_ehtype_vtable+2 const char *name; // c++ typeinfo string Class cls; @@ -429,11 +439,11 @@ objc_setUncaughtExceptionHandler(objc_uncaught_exception_handler fn) static void call_alt_handlers(struct _Unwind_Context *ctx); _Unwind_Reason_Code -__objc_personality_v0(int version, - _Unwind_Action actions, - uint64_t exceptionClass, - struct _Unwind_Exception *exceptionObject, - struct _Unwind_Context *context) +OBJC_PERSONALITY(int version, + _Unwind_Action actions, + uint64_t exceptionClass, + struct _Unwind_Exception *exceptionObject, + struct _Unwind_Context *context) { BOOL unwinding = ((actions & _UA_CLEANUP_PHASE) || (actions & _UA_FORCE_UNWIND)); @@ -452,8 +462,8 @@ __objc_personality_v0(int version, } // Let C++ handle the unwind itself. - return __gxx_personality_v0(version, actions, exceptionClass, - exceptionObject, context); + return CXX_PERSONALITY(version, actions, exceptionClass, + exceptionObject, context); } @@ -481,7 +491,7 @@ void objc_exception_throw(id obj) auto_zone_retain(gc_zone, obj); } - exc->tinfo.vtable = objc_ehtype_vtable; + exc->tinfo.vtable = objc_ehtype_vtable+2; exc->tinfo.name = object_getClassName(obj); exc->tinfo.cls = obj ? obj->isa : Nil; @@ -489,8 +499,10 @@ void objc_exception_throw(id obj) _objc_inform("EXCEPTIONS: throwing %p (object %p, a %s)", exc, obj, object_getClassName(obj)); } - + + OBJC_RUNTIME_OBJC_EXCEPTION_THROW(obj); // dtrace probe to log throw activity __cxa_throw(exc, &exc->tinfo, &_objc_exception_destructor); + __builtin_trap(); } @@ -500,7 +512,10 @@ void objc_exception_rethrow(void) if (PrintExceptions) { _objc_inform("EXCEPTIONS: rethrowing current exception"); } + + OBJC_RUNTIME_OBJC_EXCEPTION_RETHROW(); // dtrace probe to log throw activity. __cxa_rethrow(); + __builtin_trap(); } @@ -531,8 +546,9 @@ static char _objc_exception_do_catch(struct objc_typeinfo *catch_tinfo, { id exception; - if (throw_tinfo->vtable != objc_ehtype_vtable) { + if (throw_tinfo->vtable != objc_ehtype_vtable+2) { // Only objc types can be caught here. + if (PrintExceptions) _objc_inform("EXCEPTIONS: skipping catch(?)"); return 0; } @@ -550,6 +566,9 @@ static char _objc_exception_do_catch(struct objc_typeinfo *catch_tinfo, return 1; } + if (PrintExceptions) _objc_inform("EXCEPTIONS: skipping catch(%s)", + class_getName(catch_tinfo->cls)); + return 0; } @@ -592,9 +611,23 @@ static void _objc_terminate(void) /*********************************************************************** -* alt handler support +* alt handler support - zerocost implementation only **********************************************************************/ +#ifdef NO_ZEROCOST_EXCEPTIONS + +__private_extern__ void _destroyAltHandlerList(struct alt_handler_list *list) +{ +} + +static void call_alt_handlers(struct _Unwind_Context *ctx) +{ + // unsupported in sjlj environments +} + +#else + +#include // Dwarf eh data encodings #define DW_EH_PE_omit 0xff // no data follows @@ -661,26 +694,6 @@ static intptr_t read_sleb(uintptr_t *pp) } -/*********************************************************************** -* get_cie -* Returns the address of the CIE for the given FDE. -**********************************************************************/ -static uintptr_t get_cie(uintptr_t fde) { - uintptr_t deltap = fde + sizeof(int32_t); - int32_t delta = *(int32_t *)deltap; - return deltap - delta; -} - - -/*********************************************************************** -* get_cie_augmentation -* Returns the augmentation string for the given CIE. -**********************************************************************/ -static const char *get_cie_augmentation(uintptr_t cie) { - return (const char *)(cie + 2*sizeof(int32_t) + 1); -} - - /*********************************************************************** * read_address * Reads an encoded address from the address stored in *pp. @@ -689,7 +702,7 @@ static const char *get_cie_augmentation(uintptr_t cie) { * and base addresses. **********************************************************************/ static uintptr_t read_address(uintptr_t *pp, - struct dwarf_eh_bases *bases, + const struct dwarf_eh_bases *bases, unsigned char encoding) { uintptr_t result = 0; @@ -776,76 +789,14 @@ static uintptr_t read_address(uintptr_t *pp, } -/*********************************************************************** -* frame_finder -* Determines whether the frame represented by ctx is -* (1) an Objective-C or Objective-C++ frame, and -* (2) has any catch handlers. -**********************************************************************/ -struct frame_range { - uintptr_t ip_start; - uintptr_t ip_end; - uintptr_t cfa; -}; - -static _Unwind_Reason_Code frame_finder(struct _Unwind_Context *ctx, void *arg) +static bool isObjCExceptionCatcher(uintptr_t lsda, uintptr_t ip, + const struct dwarf_eh_bases* bases, + uintptr_t* try_start, uintptr_t* try_end) { - uintptr_t ip_start; - uintptr_t ip_end; - - uintptr_t lsda = _Unwind_GetLanguageSpecificData(ctx); - if (!lsda) return _URC_NO_REASON; - - uintptr_t ip = _Unwind_GetIP(ctx) - 1; - - struct dwarf_eh_bases bases; - uintptr_t fde = (uintptr_t)_Unwind_Find_FDE((void *)ip, &bases); - if (!fde) return _URC_NO_REASON; - - uintptr_t cie = get_cie(fde); - const char *aug = get_cie_augmentation(cie); - uintptr_t augdata = (uintptr_t)(aug + strlen(aug) + 1); - read_uleb(&augdata); // code alignment factor - read_sleb(&augdata); // data alignment factor - augdata++; // RA register - - // 'z' must be first, if present - if (*aug == 'z') { - aug++; - read_uleb(&augdata); // augmentation length - } - - uintptr_t personality = 0; - char ch; - while ((ch = *aug++)) { - if (ch == 'L') { - // LSDA encoding - augdata++; - } else if (ch == 'R') { - // pointer encoding - augdata++; - } else if (ch == 'P') { - // personality function - unsigned char enc = *(const unsigned char *)augdata++; - personality = read_address(&augdata, &bases, enc); - } else { - // unknown augmentation - ignore the rest - break; - } - } - - // No personality means no handlers in this frame - if (!personality) return _URC_NO_REASON; + unsigned char LPStart_enc = *(const unsigned char *)lsda++; - // Only the objc personality will honor our attached handlers. - if (personality != (uintptr_t)__objc_personality_v0) return _URC_NO_REASON; - - // We have the LSDA and the right personality. - // Scan the LSDA for handlers matching this IP - - unsigned char LPStart_enc = *(const unsigned char *)lsda++; if (LPStart_enc != DW_EH_PE_omit) { - read_address(&lsda, &bases, LPStart_enc); // LPStart + read_address(&lsda, bases, LPStart_enc); // LPStart } unsigned char TType_enc = *(const unsigned char *)lsda++; @@ -863,31 +814,31 @@ static _Unwind_Reason_Code frame_finder(struct _Unwind_Context *ctx, void *arg) uintptr_t p = call_site_table; while (p < call_site_table_end) { - uintptr_t start = read_address(&p, &bases, call_site_enc); - uintptr_t len = read_address(&p, &bases, call_site_enc); - uintptr_t pad = read_address(&p, &bases, call_site_enc); + uintptr_t start = read_address(&p, bases, call_site_enc); + uintptr_t len = read_address(&p, bases, call_site_enc); + uintptr_t pad = read_address(&p, bases, call_site_enc); uintptr_t action = read_uleb(&p); - if (ip < bases.func + start) { + if (ip < bases->func + start) { // no more source ranges - return _URC_NO_REASON; + return false; } - else if (ip < bases.func + start + len) { + else if (ip < bases->func + start + len) { // found the range - if (!pad) return _URC_NO_REASON; // ...but it has no landing pad + if (!pad) return false; // ...but it has no landing pad // found the landing pad - ip_start = bases.func + start; - ip_end = bases.func + start + len; action_record = action ? action_record_table + action - 1 : 0; + *try_start = bases->func + start; + *try_end = bases->func + start + len; break; } } - if (!action_record) return _URC_NO_REASON; // no catch handlers + if (!action_record) return false; // no catch handlers // has handlers, destructors, and/or throws specifications // Use this frame if it has any handlers - int has_handler = 0; + bool has_handler = false; p = action_record; intptr_t offset; do { @@ -902,19 +853,53 @@ static _Unwind_Reason_Code frame_finder(struct _Unwind_Context *ctx, void *arg) // destructor - ignore } else /* filter >= 0 */ { // catch handler - use this frame - has_handler = 1; + has_handler = true; break; } } while (offset); - if (!has_handler) return _URC_NO_REASON; // no catch handlers - ignore + return has_handler; +} + + +struct frame_range { + uintptr_t ip_start; + uintptr_t ip_end; + uintptr_t cfa; +}; - struct frame_range *result = (struct frame_range *)arg; - result->ip_start = ip_start; - result->ip_end = ip_end; - result->cfa = _Unwind_GetCFA(ctx); +static struct frame_range findHandler(void) +{ + // walk stack looking for frame with objc catch handler + unw_context_t uc; + unw_cursor_t cursor; + unw_proc_info_t info; + unw_getcontext(&uc); + unw_init_local(&cursor, &uc); + while ( (unw_step(&cursor) > 0) && (unw_get_proc_info(&cursor, &info) == UNW_ESUCCESS) ) { + // must use objc personality handler + if ( info.handler != (uintptr_t)__objc_personality_v0 ) + continue; + // must have landing pad + if ( info.lsda == 0 ) + continue; + // must have landing pad that catches objc exceptions + struct dwarf_eh_bases bases; + bases.tbase = 0; // from unwind-dw2-fde-darwin.c:examine_objects() + bases.dbase = 0; // from unwind-dw2-fde-darwin.c:examine_objects() + bases.func = info.start_ip; + unw_word_t ip; + unw_get_reg(&cursor, UNW_REG_IP, &ip); + uintptr_t try_start; + uintptr_t try_end; + if ( isObjCExceptionCatcher(info.lsda, ip, &bases, &try_start, &try_end) ) { + unw_word_t cfa; + unw_get_reg(&cursor, UNW_REG_SP, &cfa); + return (struct frame_range){try_start, try_end, cfa}; + } + } - return _URC_HANDLER_FOUND; + return (struct frame_range){0, 0, 0}; } @@ -965,10 +950,8 @@ __private_extern__ void _destroyAltHandlerList(struct alt_handler_list *list) uintptr_t objc_addExceptionHandler(objc_exception_handler fn, void *context) { - struct frame_range target_frame = {0, 0, 0}; - // Find the closest enclosing frame with objc catch handlers - _Unwind_Backtrace(&frame_finder, &target_frame); + struct frame_range target_frame = findHandler(); if (!target_frame.ip_start) { // No suitable enclosing handler found. return 0; @@ -1017,7 +1000,7 @@ uintptr_t objc_addExceptionHandler(objc_exception_handler fn, void *context) if (list->used > 1000) { static int warned = 0; if (!warned) { - _objc_inform("ALT_HANDLERS: *** over 1000 alt handlers installed; " + _objc_inform("ALT HANDLERS: *** over 1000 alt handlers installed; " "this is probably a bug"); warned = 1; } @@ -1096,6 +1079,9 @@ static void call_alt_handlers(struct _Unwind_Context *ctx) } } +// ! NO_ZEROCOST_EXCEPTIONS +#endif + /*********************************************************************** * exception_init @@ -1109,5 +1095,5 @@ __private_extern__ void exception_init(void) } -// __LP64__ +// __OBJC2__ #endif diff --git a/runtime/objc-file.m b/runtime/objc-file.m index 370cdf1..ce4866a 100644 --- a/runtime/objc-file.m +++ b/runtime/objc-file.m @@ -22,15 +22,54 @@ */ // Copyright 1988-1996 NeXT Software, Inc. -#include -#include -#include -#include -#include -#include - #define OLD 1 -#import "objc-private.h" +#include "objc-private.h" + +#if TARGET_OS_WIN32 + +__private_extern__ const char *_getObjcHeaderName(const headerType *head) +{ + return "??"; +} + +/* +__private_extern__ Module +_getObjcModules(const header_info *hi, size_t *nmodules) +{ + if (nmodules) *nmodules = hi->os.moduleCount; + return hi->os.modules; +} +*/ +__private_extern__ SEL * +_getObjcSelectorRefs(const header_info *hi, size_t *nmess) +{ + if (nmess) *nmess = hi->os.selrefCount; + return hi->os.selrefs; +} + +__private_extern__ struct old_protocol ** +_getObjcProtocols(const header_info *hi, size_t *nprotos) +{ + if (nprotos) *nprotos = hi->os.protocolCount; + return hi->os.protocols; +} + +__private_extern__ struct old_class ** +_getObjcClassRefs(const header_info *hi, size_t *nclasses) +{ + if (nclasses) *nclasses = hi->os.clsrefCount; + return (struct old_class **)hi->os.clsrefs; +} + +// __OBJC,__class_names section only emitted by CodeWarrior rdar://4951638 +__private_extern__ const char * +_getObjcClassNames(const header_info *hi, size_t *size) +{ + if (size) *size = 0; + return NULL; +} + +#else #ifndef __LP64__ #define SEGMENT_CMD LC_SEGMENT @@ -58,15 +97,15 @@ _getObjcImageInfo(const headerType *head, ptrdiff_t slide, size_t *sizep) // fixme !objc2 only (used for new-abi paranoia) __private_extern__ Module -_getObjcModules(const headerType *head, ptrdiff_t slide, size_t *nmodules) +_getObjcModules(const header_info *hi, size_t *nmodules) { size_t size; void *mods = - GETSECTDATAFROMHEADER(head, SEG_OBJC, SECT_OBJC_MODULES, &size); + GETSECTDATAFROMHEADER(hi->mhdr, SEG_OBJC, SECT_OBJC_MODULES, &size); #if !__OBJC2__ *nmodules = size / sizeof(struct objc_module); #endif - if (mods) mods = (void *)((uintptr_t)mods + slide); + if (mods) mods = (void *)((uintptr_t)mods + hi->os.image_slide); return (Module)mods; } @@ -77,22 +116,49 @@ _getObjcSelectorRefs(const header_info *hi, size_t *nmess) size_t size; void *refs = GETSECTDATAFROMHEADER (hi->mhdr, SEG_OBJC, "__message_refs", &size); - if (refs) refs = (void *)((uintptr_t)refs + hi->image_slide); + if (refs) refs = (void *)((uintptr_t)refs + hi->os.image_slide); *nmess = size / sizeof(SEL); return (SEL *)refs; } #if !__OBJC2__ -__private_extern__ struct old_protocol * +__private_extern__ BOOL +_hasObjcContents(const header_info *hi) +{ + // Look for an __OBJC,* section other than __OBJC,__image_info + const segmentType *seg = hi->os.objcSegmentHeader; + const sectionType *sect; + uint32_t i; + for (i = 0; i < seg->nsects; i++) { + sect = ((const sectionType *)(seg+1))+i; + if (0 != strncmp(sect->sectname, "__image_info", 12)) { + return YES; + } + } + + return NO; +} + +__private_extern__ struct old_protocol ** _getObjcProtocols(const header_info *hi, size_t *nprotos) { - size_t size; - void *protos = - GETSECTDATAFROMHEADER (hi->mhdr, SEG_OBJC, "__protocol", &size); - *nprotos = size / sizeof(struct old_protocol); - if (protos) protos = (struct old_protocol *)((uintptr_t)protos+hi->image_slide); - return (struct old_protocol *)protos; + size_t size; + struct old_protocol *protos = (struct old_protocol *) + GETSECTDATAFROMHEADER (hi->mhdr, SEG_OBJC, "__protocol", &size); + *nprotos = size / sizeof(struct old_protocol); + if (protos) protos = (struct old_protocol *)((uintptr_t)protos+hi->os.image_slide); + + if (!hi->os.proto_refs && *nprotos) { + size_t i; + header_info *whi = (header_info *)hi; + whi->os.proto_refs = malloc(*nprotos * sizeof(*hi->os.proto_refs)); + for (i = 0; i < *nprotos; i++) { + hi->os.proto_refs[i] = protos+i; + } + } + + return hi->os.proto_refs; } __private_extern__ struct old_class ** @@ -102,7 +168,7 @@ _getObjcClassRefs(const header_info *hi, size_t *nclasses) void *classes = GETSECTDATAFROMHEADER(hi->mhdr, SEG_OBJC, "__cls_refs", &size); *nclasses = size / sizeof(struct old_class *); - if (classes) classes = (void *)((uintptr_t)classes + hi->image_slide); + if (classes) classes = (void *)((uintptr_t)classes + hi->os.image_slide); return (struct old_class **)classes; } @@ -112,7 +178,7 @@ _getObjcClassNames(const header_info *hi, size_t *size) { void *names = GETSECTDATAFROMHEADER(hi->mhdr, SEG_OBJC, "__class_names", size); - if (names) names = (void *)((uintptr_t)names + hi->image_slide); + if (names) names = (void *)((uintptr_t)names + hi->os.image_slide); return (const char *)names; } @@ -120,15 +186,32 @@ _getObjcClassNames(const header_info *hi, size_t *size) #if __OBJC2__ +__private_extern__ BOOL +_hasObjcContents(const header_info *hi) +{ + // Look for a __DATA,__objc* section other than __DATA,__objc_imageinfo + const segmentType *seg = hi->os.dataSegmentHeader; + const sectionType *sect; + uint32_t i; + for (i = 0; i < seg->nsects; i++) { + sect = ((const sectionType *)(seg+1))+i; + if (0 == strncmp(sect->sectname, "__objc_", 7) && + 0 != strncmp(sect->sectname, "__objc_imageinfo", 16)) + { + return YES; + } + } + + return NO; +} + __private_extern__ SEL * _getObjc2SelectorRefs(const header_info *hi, size_t *nmess) { size_t size; void *refs = GETSECTDATAFROMHEADER (hi->mhdr, SEG_DATA, "__objc_selrefs", &size); - if (!refs) refs = - GETSECTDATAFROMHEADER (hi->mhdr, SEG_OBJC2, "__selector_refs", &size); - if (refs) refs = (void *)((uintptr_t)refs + hi->image_slide); + if (refs) refs = (void *)((uintptr_t)refs + hi->os.image_slide); *nmess = size / sizeof(SEL); return (SEL *)refs; } @@ -139,9 +222,7 @@ _getObjc2MessageRefs(const header_info *hi, size_t *nmess) size_t size; void *refs = GETSECTDATAFROMHEADER (hi->mhdr, SEG_DATA, "__objc_msgrefs", &size); - if (!refs) refs = - GETSECTDATAFROMHEADER (hi->mhdr, SEG_OBJC2, "__message_refs", &size); - if (refs) refs = (void *)((uintptr_t)refs + hi->image_slide); + if (refs) refs = (void *)((uintptr_t)refs + hi->os.image_slide); *nmess = size / sizeof(message_ref); return (message_ref *)refs; } @@ -152,10 +233,8 @@ _getObjc2ClassRefs(const header_info *hi, size_t *nclasses) size_t size; void *classes = GETSECTDATAFROMHEADER(hi->mhdr, SEG_DATA, "__objc_classrefs", &size); - if (!classes) classes = - GETSECTDATAFROMHEADER(hi->mhdr, SEG_OBJC2, "__class_refs", &size); *nclasses = size / sizeof(struct class_t *); - if (classes) classes = (void *)((uintptr_t)classes + hi->image_slide); + if (classes) classes = (void *)((uintptr_t)classes + hi->os.image_slide); return (struct class_t **)classes; } @@ -165,10 +244,8 @@ _getObjc2SuperRefs(const header_info *hi, size_t *nclasses) size_t size; void *classes = GETSECTDATAFROMHEADER(hi->mhdr, SEG_DATA, "__objc_superrefs", &size); - if (!classes) classes = - GETSECTDATAFROMHEADER(hi->mhdr, SEG_OBJC2, "__super_refs", &size); *nclasses = size / sizeof(struct class_t *); - if (classes) classes = (void *)((uintptr_t)classes + hi->image_slide); + if (classes) classes = (void *)((uintptr_t)classes + hi->os.image_slide); return (struct class_t **)classes; } @@ -178,10 +255,8 @@ _getObjc2ClassList(const header_info *hi, size_t *nclasses) size_t size; void *classes = GETSECTDATAFROMHEADER(hi->mhdr, SEG_DATA, "__objc_classlist", &size); - if (!classes) classes = - GETSECTDATAFROMHEADER(hi->mhdr, SEG_OBJC2, "__class_list", &size); *nclasses = size / sizeof(struct class_t *); - if (classes) classes = (void *)((uintptr_t)classes + hi->image_slide); + if (classes) classes = (void *)((uintptr_t)classes + hi->os.image_slide); return (struct class_t **)classes; } @@ -191,10 +266,8 @@ _getObjc2NonlazyClassList(const header_info *hi, size_t *nclasses) size_t size; void *classes = GETSECTDATAFROMHEADER(hi->mhdr, SEG_DATA, "__objc_nlclslist", &size); - if (!classes) classes = - GETSECTDATAFROMHEADER(hi->mhdr, SEG_OBJC2, "__nonlazy_class", &size); *nclasses = size / sizeof(struct class_t *); - if (classes) classes = (void *)((uintptr_t)classes + hi->image_slide); + if (classes) classes = (void *)((uintptr_t)classes + hi->os.image_slide); return (struct class_t **)classes; } @@ -204,10 +277,8 @@ _getObjc2CategoryList(const header_info *hi, size_t *ncats) size_t size; void *cats = GETSECTDATAFROMHEADER(hi->mhdr, SEG_DATA, "__objc_catlist", &size); - if (!cats) cats = - GETSECTDATAFROMHEADER(hi->mhdr, SEG_OBJC2, "__category_list", &size); *ncats = size / sizeof(struct category_t *); - if (cats) cats = (void *)((uintptr_t)cats + hi->image_slide); + if (cats) cats = (void *)((uintptr_t)cats + hi->os.image_slide); return (struct category_t **)cats; } @@ -217,10 +288,8 @@ _getObjc2NonlazyCategoryList(const header_info *hi, size_t *ncats) size_t size; void *cats = GETSECTDATAFROMHEADER(hi->mhdr, SEG_DATA, "__objc_nlcatlist", &size); - if (!cats) cats = - GETSECTDATAFROMHEADER(hi->mhdr, SEG_OBJC2, "__nonlazy_catgry", &size); *ncats = size / sizeof(struct category_t *); - if (cats) cats = (void *)((uintptr_t)cats + hi->image_slide); + if (cats) cats = (void *)((uintptr_t)cats + hi->os.image_slide); return (struct category_t **)cats; } @@ -230,10 +299,8 @@ _getObjc2ProtocolList(const header_info *hi, size_t *nprotos) size_t size; void *protos = GETSECTDATAFROMHEADER (hi->mhdr, SEG_DATA, "__objc_protolist", &size); - if (!protos) protos = - GETSECTDATAFROMHEADER (hi->mhdr, SEG_OBJC2, "__protocol_list", &size); *nprotos = size / sizeof(struct protocol_t *); - if (protos) protos = (struct protocol_t **)((uintptr_t)protos+hi->image_slide); + if (protos) protos = (struct protocol_t **)((uintptr_t)protos+hi->os.image_slide); return (struct protocol_t **)protos; } @@ -243,33 +310,13 @@ _getObjc2ProtocolRefs(const header_info *hi, size_t *nprotos) size_t size; void *protos = GETSECTDATAFROMHEADER (hi->mhdr, SEG_DATA, "__objc_protorefs", &size); - if (!protos) protos = - GETSECTDATAFROMHEADER (hi->mhdr, SEG_OBJC2, "__protocol_refs", &size); *nprotos = size / sizeof(struct protocol_t *); - if (protos) protos = (struct protocol_t **)((uintptr_t)protos+hi->image_slide); + if (protos) protos = (struct protocol_t **)((uintptr_t)protos+hi->os.image_slide); return (struct protocol_t **)protos; } #endif -__private_extern__ const segmentType * -getsegbynamefromheader(const headerType *head, const char *segname) -{ - const segmentType *sgp; - unsigned long i; - - sgp = (const segmentType *) (head + 1); - for (i = 0; i < head->ncmds; i++){ - if (sgp->cmd == SEGMENT_CMD) { - if (strncmp(sgp->segname, segname, sizeof(sgp->segname)) == 0) { - return sgp; - } - } - sgp = (const segmentType *)((char *)sgp + sgp->cmdsize); - } - return NULL; -} - __private_extern__ const char * _getObjcHeaderName(const headerType *header) { @@ -307,3 +354,6 @@ _getImageSlide(const headerType *header) _getObjcHeaderName(header)); return 0; // not reached } + + +#endif diff --git a/runtime/objc-gdb.h b/runtime/objc-gdb.h new file mode 100644 index 0000000..231619b --- /dev/null +++ b/runtime/objc-gdb.h @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2008 Apple Inc. All Rights Reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _OBJC_GDB_H +#define _OBJC_GDB_H + +/* + * WARNING DANGER HAZARD BEWARE EEK + * + * Everything in this file is for debugger and developer tool use only. + * These will change in arbitrary OS updates and in unpredictable ways. + * When your program breaks, you get to keep both pieces. + */ + +#ifdef __APPLE_API_PRIVATE + +#include +#include +#include + + +/*********************************************************************** +* Trampoline descriptors for gdb. +**********************************************************************/ + +typedef struct { + uint32_t offset; // 0 = unused, else code = (uintptr_t)desc + desc->offset + uint32_t flags; +} objc_trampoline_descriptor; +#define OBJC_TRAMPOLINE_MESSAGE (1<<0) // trampoline acts like objc_msgSend +#define OBJC_TRAMPOLINE_STRET (1<<1) // trampoline is struct-returning +#define OBJC_TRAMPOLINE_VTABLE (1<<2) // trampoline is vtable dispatcher + +typedef struct objc_trampoline_header { + uint16_t headerSize; // sizeof(objc_trampoline_header) + uint16_t descSize; // sizeof(objc_trampoline_descriptor) + uint32_t descCount; // number of descriptors following this header + struct objc_trampoline_header *next; +} objc_trampoline_header; + +extern objc_trampoline_header *gdb_objc_trampolines; + +extern void gdb_objc_trampolines_changed(objc_trampoline_header *thdr); +// Notify gdb that gdb_objc_trampolines has changed. +// thdr itself includes the new descriptors; thdr->next is not new. + + +/*********************************************************************** +* Debugger mode. +**********************************************************************/ + +// Start debugger mode. +// Returns non-zero if debugger mode was successfully started. +// In debugger mode, you can try to use the runtime without deadlocking +// on other threads. All other threads must be stopped during debugger mode. +// OBJC_DEBUGMODE_FULL requires more locks so later operations are less +// likely to fail. +#define OBJC_DEBUGMODE_FULL (1<<0) +extern int gdb_objc_startDebuggerMode(uint32_t flags); + +// Stop debugger mode. Do not call if startDebuggerMode returned zero. +extern void gdb_objc_endDebuggerMode(void); + +// Failure hook when debugger mode tries something that would block. +// Set a breakpoint here to handle it before the runtime causes a trap. +// Debugger mode is still active; call endDebuggerMode to end it. +extern void gdb_objc_debuggerModeFailure(void); + + +/*********************************************************************** +* Class lists for heap. +**********************************************************************/ + +#if __OBJC2__ + +// Maps class name to Class, for in-use classes only. NXStrValueMapPrototype. +extern NXMapTable *gdb_objc_realized_classes; + +#else + +// Hashes Classes, for all known classes. Custom prototype. +extern NXHashTable *_objc_debug_class_hash; + +#endif + +/*********************************************************************** + * Garbage Collector heap dump +**********************************************************************/ + +/* Dump GC heap; if supplied the name is returned in filenamebuffer. Returns YES on success. */ +OBJC_GC_EXPORT BOOL objc_dumpHeap(char *filenamebuffer, unsigned long length); + +#define OBJC_HEAP_DUMP_FILENAME_FORMAT "/tmp/objc-gc-heap-dump-%d-%d" + + +#endif +#endif diff --git a/runtime/objc-initialize.h b/runtime/objc-initialize.h index 78ab45f..6a0609d 100644 --- a/runtime/objc-initialize.h +++ b/runtime/objc-initialize.h @@ -21,8 +21,15 @@ * @APPLE_LICENSE_HEADER_END@ */ +#ifndef _OBJC_INITIALIZE_H +#define _OBJC_INITIALIZE_H + #include "objc.h" +__BEGIN_DECLS + +struct _objc_initializing_classes; + extern BOOL _class_isInitializing(Class cls); BOOL _class_isInitialized(Class cls); @@ -30,3 +37,6 @@ extern void _class_initialize(Class cls); extern void _destroyInitializingClassList(struct _objc_initializing_classes *list); +__END_DECLS + +#endif diff --git a/runtime/objc-initialize.m b/runtime/objc-initialize.m index aede2e0..a911c40 100644 --- a/runtime/objc-initialize.m +++ b/runtime/objc-initialize.m @@ -92,19 +92,14 @@ * superclass. **********************************************************************/ -#include -#include +#include "objc-private.h" +#include "message.h" +#include "objc-initialize.h" -#import "objc-private.h" -#import "objc-initialize.h" - -/* classInitLock protects classInitWaitCond and examination and modification - * of CLS_INITIALIZED and CLS_INITIALIZING. */ -static OBJC_DECLARE_LOCK(classInitLock); - -/* classInitWaitCond is signalled when any class is done initializing. +/* classInitLock protects CLS_INITIALIZED and CLS_INITIALIZING, and + * is signalled when any class is done initializing. * Threads that are waiting for a class to finish initializing wait on this. */ -static pthread_cond_t classInitWaitCond = PTHREAD_COND_INITIALIZER; +static monitor_t classInitLock = MONITOR_INITIALIZER; /*********************************************************************** @@ -260,6 +255,93 @@ static void _setThisThreadIsNotInitializingClass(Class cls) } +typedef struct PendingInitialize { + Class subclass; + struct PendingInitialize *next; +} PendingInitialize; + +static NXMapTable *pendingInitializeMap; + +/*********************************************************************** +* _finishInitializing +* cls has completed its +initialize method, and so has its superclass. +* Mark cls as initialized as well, then mark any of cls's subclasses +* that have already finished their own +initialize methods. +**********************************************************************/ +static void _finishInitializing(Class cls, Class supercls) +{ + PendingInitialize *pending; + + monitor_assert_locked(&classInitLock); + assert(!supercls || _class_isInitialized(supercls)); + + if (PrintInitializing) { + _objc_inform("INITIALIZE: %s is fully +initialized", + _class_getName(cls)); + } + + // propagate finalization affinity. + if (UseGC && supercls && _class_shouldFinalizeOnMainThread(supercls)) { + _class_setFinalizeOnMainThread(cls); + } + + // mark this class as fully +initialized + _class_setInitialized(cls); + monitor_notifyAll(&classInitLock); + _setThisThreadIsNotInitializingClass(cls); + + // mark any subclasses that were merely waiting for this class + if (!pendingInitializeMap) return; + pending = NXMapGet(pendingInitializeMap, cls); + if (!pending) return; + + NXMapRemove(pendingInitializeMap, cls); + + // Destroy the pending table if it's now empty, to save memory. + if (NXCountMapTable(pendingInitializeMap) == 0) { + NXFreeMapTable(pendingInitializeMap); + pendingInitializeMap = NULL; + } + + while (pending) { + PendingInitialize *next = pending->next; + if (pending->subclass) _finishInitializing(pending->subclass, cls); + _free_internal(pending); + pending = next; + } +} + + +/*********************************************************************** +* _finishInitializingAfter +* cls has completed its +initialize method, but its superclass has not. +* Wait until supercls finishes before marking cls as initialized. +**********************************************************************/ +static void _finishInitializingAfter(Class cls, Class supercls) +{ + PendingInitialize *pending; + + monitor_assert_locked(&classInitLock); + + if (PrintInitializing) { + _objc_inform("INITIALIZE: %s waiting for superclass +[%s initialize]", + _class_getName(cls), _class_getName(supercls)); + } + + if (!pendingInitializeMap) { + pendingInitializeMap = + NXCreateMapTableFromZone(NXPtrValueMapPrototype, + 10, _objc_internal_zone()); + // fixme pre-size this table for CF/NSObject +initialize + } + + pending = _malloc_internal(sizeof(*pending)); + pending->subclass = cls; + pending->next = NXMapGet(pendingInitializeMap, supercls); + NXMapInsert(pendingInitializeMap, supercls, pending); +} + + /*********************************************************************** * class_initialize. Send the '+initialize' message on demand to any * uninitialized class. Force initialization of superclasses first. @@ -283,12 +365,12 @@ __private_extern__ void _class_initialize(Class cls) } // Try to atomically set CLS_INITIALIZING. - OBJC_LOCK(&classInitLock); + monitor_enter(&classInitLock); if (!_class_isInitialized(cls) && !_class_isInitializing(cls)) { _class_setInitializing(cls); reallyInitialize = YES; } - OBJC_UNLOCK(&classInitLock); + monitor_exit(&classInitLock); if (reallyInitialize) { // We successfully set the CLS_INITIALIZING bit. Initialize the class. @@ -303,19 +385,27 @@ __private_extern__ void _class_initialize(Class cls) _objc_inform("INITIALIZE: calling +[%s initialize]", _class_getName(cls)); } - [(id)cls initialize]; + + ((void(*)(Class, SEL))objc_msgSend)(cls, SEL_initialize); + + if (PrintInitializing) { + _objc_inform("INITIALIZE: finished +[%s initialize]", + _class_getName(cls)); + } - // propagate finalization affinity. - if (UseGC && supercls && _class_shouldFinalizeOnMainThread(supercls)) { - _class_setFinalizeOnMainThread(cls); - } + // Done initializing. + // If the superclass is also done initializing, then update + // the info bits and notify waiting threads. + // If not, update them later. (This can happen if this +initialize + // was itself triggered from inside a superclass +initialize.) - // Done initializing. Update the info bits and notify waiting threads. - OBJC_LOCK(&classInitLock); - _class_setInitialized(cls); - pthread_cond_broadcast(&classInitWaitCond); - OBJC_UNLOCK(&classInitLock); - _setThisThreadIsNotInitializingClass(cls); + monitor_enter(&classInitLock); + if (!supercls || _class_isInitialized(supercls)) { + _finishInitializing(cls, supercls); + } else { + _finishInitializingAfter(cls, supercls); + } + monitor_exit(&classInitLock); return; } @@ -329,11 +419,11 @@ __private_extern__ void _class_initialize(Class cls) if (_thisThreadIsInitializingClass(cls)) { return; } else { - OBJC_LOCK(&classInitLock); + monitor_enter(&classInitLock); while (!_class_isInitialized(cls)) { - pthread_cond_wait(&classInitWaitCond, &classInitLock); + monitor_wait(&classInitLock); } - OBJC_UNLOCK(&classInitLock); + monitor_exit(&classInitLock); return; } } diff --git a/runtime/Messengers.subproj/objc-msg.s b/runtime/objc-internal.h similarity index 60% rename from runtime/Messengers.subproj/objc-msg.s rename to runtime/objc-internal.h index e2f5cac..97e0028 100644 --- a/runtime/Messengers.subproj/objc-msg.s +++ b/runtime/objc-internal.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999-2001, 2005-2006 Apple Inc. All Rights Reserved. + * Copyright (c) 2008 Apple Inc. All Rights Reserved. * * @APPLE_LICENSE_HEADER_START@ * @@ -20,25 +20,25 @@ * * @APPLE_LICENSE_HEADER_END@ */ -/* - * Copyright 1988-1996 NeXT Software, Inc. - * - * objc-msg.s - * - * 31-Dec-96 Umesh Vaishampayan (umeshv@NeXT.com) - * Added support for ppc. cleaned m98k and m88k stuff. + + +#ifndef _OBJC_INTERNAL_H +#define _OBJC_INTERNAL_H + +/* + * WARNING DANGER HAZARD BEWARE EEK + * + * Everything in this file is for Apple Internal use only. + * These will change in arbitrary OS updates and in unpredictable ways. + * When your program breaks, you get to keep both pieces. */ -#import "../objc-config.h" +#include +#include + +OBJC_EXPORT id objc_constructInstance(Class cls, void *bytes) + __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA); +OBJC_EXPORT void *objc_destructInstance(id obj) + __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA); -#if defined (__i386__) || defined (i386) - #include "objc-msg-i386.s" -#elif defined (__ppc__) || defined(ppc) - #include "objc-msg-ppc.s" -#elif defined (__ppc64__) - #include "objc-msg-ppc64.s" -#elif defined (__x86_64__) - #include "objc-msg-x86_64.s" -#else - #error Architecture not supported #endif diff --git a/runtime/objc-layout.m b/runtime/objc-layout.m index 19e3b51..9fe6bd8 100644 --- a/runtime/objc-layout.m +++ b/runtime/objc-layout.m @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004-2007 Apple Inc. All rights reserved. + * Copyright (c) 2004-2008 Apple Inc. All rights reserved. * * @APPLE_LICENSE_HEADER_START@ * @@ -24,7 +24,7 @@ #include #include -#import "objc-private.h" +#include "objc-private.h" /********************************************************************** * Object Layouts. @@ -53,105 +53,62 @@ /********************************************************************** -* generate_layout_bytes -* -* Generates the layout bytes representing the specified skip and run. -* If layout is NULL the can be used to determine the number of bytes added -* to the layout. Returns number of bytes added. -* -**********************************************************************/ -#define NIBBLE_MAX 0xf -static long generate_layout_bytes(long skip, long run, unsigned char *layout) { - // number of bytes added - long count = 0; - - // if the skip is greater what can be put in a nibble - while (skip > NIBBLE_MAX) { - // add a skip with no run if layout is not NULL - if (layout) *layout++ = NIBBLE_MAX << 4; - - // another byte added - count++; - - // decrement skip by nibble maximum - skip -= NIBBLE_MAX; - } - - // add remaining skip and run (modulo nibble size) if layout is not NULL - if (layout) *layout++ = (skip << 4) | (run % NIBBLE_MAX); - - // another byte added - count++; - - - // if the run is greater what can be put in a nibble - while (run > NIBBLE_MAX) { - // add a run with no skip if layout is not NULL - if (layout) *layout++ = NIBBLE_MAX; - - // another byte added - count++; - - // decrement run by nibble maximum - run -= NIBBLE_MAX; - } - - // return number of bytes added - return count; -} - - -/********************************************************************** -* scan_bits_for_layout -* -* Generate the layout from the bit map. If layout is NULL then can be used to -* determine the size of the layout. Returns size of layout array in bytes -* including the '\0' terminator. -* +* compress_layout +* Allocates and returns a compressed string matching the given layout bitmap. **********************************************************************/ -static unsigned char *compress_layout(const uint8_t *bits, size_t bitmap_bits, BOOL weak) +static unsigned char * +compress_layout(const uint8_t *bits, size_t bitmap_bits, BOOL weak) { - long count = 0; // number of bytes generated - long skip = 0; // number of slots to skip to get to next references - long run = 0; // number of consecutive references - long last_bit = 0; // state of last bit encountered BOOL all_set = YES; BOOL none_set = YES; + unsigned char *result; - unsigned char *layout = _calloc_internal(bitmap_bits + 1, 1); - - // iterate through bits in bits array - long i; - for (i = 0; i < bitmap_bits; i++) { - // determine next bit, 0 = not a reference, 1 indicates a reference - long bit = (bits[i/8] >> (i % 8)) & 1; - - // if not a reference and last bit was a reference then record skip and run - if (!bit && last_bit) { - // record skip and run - count += generate_layout_bytes(skip, run, layout + count); - - // reset counts - skip = 0; run = 0; + // overallocate a lot; reallocate at correct size later + unsigned char * const layout = _calloc_internal(bitmap_bits + 1, 1); + unsigned char *l = layout; + + size_t i = 0; + while (i < bitmap_bits) { + size_t skip = 0; + size_t scan = 0; + + // Count one range each of skip and scan. + while (i < bitmap_bits) { + uint8_t bit = (bits[i/8] >> (i % 8)) & 1; + if (bit) break; + i++; + skip++; + } + while (i < bitmap_bits) { + uint8_t bit = (bits[i/8] >> (i % 8)) & 1; + if (!bit) break; + i++; + scan++; + none_set = NO; } - // record the skip or run - if (bit) run++, none_set = NO; - else skip++, all_set = NO; - - // track state of last bit - last_bit = bit; + // Record skip and scan + if (skip) all_set = NO; + if (scan) none_set = NO; + while (skip > 0xf) { + *l++ = 0xf0; + skip -= 0xf; + } + if (skip || scan) { + *l = skip << 4; // NOT incremented - merges with scan + while (scan > 0xf) { + *l++ |= 0x0f; // May merge with short skip; must calloc + scan -= 0xf; + } + *l++ |= scan; // NOT checked for zero - always increments + // May merge with short skip; must calloc + } } - - // Record last skip and run, if any. - if (skip || run) count += generate_layout_bytes(skip, run, layout + count); // insert terminating byte - layout[count] = '\0'; - count++; + *l++ = '\0'; // return result - unsigned char *result; if (none_set && weak) { result = NULL; // NULL weak layout means none-weak } else if (all_set && !weak) { @@ -242,13 +199,11 @@ layout_bitmap_create(const unsigned char *layout_string, { layout_bitmap result; size_t words = instanceSize / sizeof(id); - size_t bitmap_bytes = (words+7)/8; - result.bits = _calloc_internal(bitmap_bytes, 1); result.weak = weak; result.bitCount = words; - result.bitsAllocated = bitmap_bytes * 8; - assert(bits->bitsAllocated % 8 == 0); + result.bitsAllocated = words; + result.bits = _calloc_internal((words+7)/8, 1); if (!layout_string) { if (!weak) { @@ -278,52 +233,27 @@ layout_string_create(layout_bitmap bits) } -/*********************************************************************** -* layout_bitmap_or -* Set dst=dst|src. -* dst must be at least as long as src. -* Returns YES if any of dst's bits were changed. -**********************************************************************/ -__private_extern__ BOOL -layout_bitmap_or(layout_bitmap dst, layout_bitmap src, const char *msg) -{ - if (dst.bitCount < src.bitCount) { - _objc_fatal("layout bitmap too short%s%s", msg ? ": " : "", msg ?: ""); - } - - BOOL changed = NO; - - // fixme optimize for byte/word at a time - size_t bit; - for (bit = 0; bit < src.bitCount; bit++) { - int dstset = dst.bits[bit/8] & (1 << (bit % 8)); - int srcset = src.bits[bit/8] & (1 << (bit % 8)); - if (srcset && !dstset) { - changed = YES; - dst.bits[bit/8] |= 1 << (bit % 8); - } - } - - return changed; -} - - __private_extern__ void layout_bitmap_set_ivar(layout_bitmap bits, const char *type, size_t offset) { - // fixme only handles id and array of id + // fixme only handles some types size_t bit = offset / sizeof(id); if (!type) return; - if (type[0] == '@') { + if (type[0] == '@' || 0 == strcmp(type, "^@")) { + // id + // id * set_bits(bits, bit, 1); - } else if (type[0] == '[') { + } + else if (type[0] == '[') { + // id[] char *t; unsigned long count = strtoul(type+1, &t, 10); if (t && t[0] == '@') { set_bits(bits, bit, count); } - } else if (strchr(type, '@')) { + } + else if (strchr(type, '@')) { _objc_inform("warning: failing to set GC layout for '%s'\n", type); } } @@ -339,13 +269,15 @@ __private_extern__ void layout_bitmap_grow(layout_bitmap *bits, size_t newCount) { if (bits->bitCount >= newCount) return; - size_t addition = newCount - bits->bitCount; bits->bitCount = newCount; - if (bits->bitCount > bits->bitsAllocated) { - bits->bitsAllocated += bits->bitsAllocated + (addition+7)/8; - bits->bits = _realloc_internal(bits->bits, bits->bitsAllocated); + if (bits->bitsAllocated < newCount) { + size_t newAllocated = bits->bitsAllocated * 2; + if (newAllocated < newCount) newAllocated = newCount; + bits->bits = _realloc_internal(bits->bits, (newAllocated+7) / 8); + bits->bitsAllocated = newAllocated; } - assert(bits->bitsAllocated % 8 == 0); + assert(bits->bitsAllocated >= bits->bitCount); + assert(bits->bitsAllocated >= newCount); } @@ -360,10 +292,14 @@ layout_bitmap_grow(layout_bitmap *bits, size_t newCount) __private_extern__ void layout_bitmap_slide(layout_bitmap *bits, size_t oldPos, size_t newPos) { - if (oldPos >= newPos) _objc_fatal("layout bitmap sliding backwards"); + size_t shift; + size_t count; + + if (oldPos == newPos) return; + if (oldPos > newPos) _objc_fatal("layout bitmap sliding backwards"); - size_t shift = newPos - oldPos; - size_t count = bits->bitCount - oldPos; + shift = newPos - oldPos; + count = bits->bitCount - oldPos; layout_bitmap_grow(bits, bits->bitCount + shift); move_bits(*bits, oldPos, newPos, count); // slide clear_bits(*bits, oldPos, shift); // zero-fill @@ -381,13 +317,16 @@ __private_extern__ BOOL layout_bitmap_splat(layout_bitmap dst, layout_bitmap src, size_t oldSrcInstanceSize) { + BOOL changed; + size_t oldSrcBitCount; + size_t bit; + if (dst.bitCount < src.bitCount) _objc_fatal("layout bitmap too short"); - BOOL changed = NO; - size_t oldSrcBitCount = oldSrcInstanceSize / sizeof(id); + changed = NO; + oldSrcBitCount = oldSrcInstanceSize / sizeof(id); // fixme optimize for byte/word at a time - size_t bit; for (bit = 0; bit < oldSrcBitCount; bit++) { int dstset = dst.bits[bit/8] & (1 << (bit % 8)); int srcset = (bit < src.bitCount) @@ -407,6 +346,81 @@ layout_bitmap_splat(layout_bitmap dst, layout_bitmap src, } +/*********************************************************************** +* layout_bitmap_or +* Set dst=dst|src. +* dst must be at least as long as src. +* Returns YES if any of dst's bits were changed. +**********************************************************************/ +__private_extern__ BOOL +layout_bitmap_or(layout_bitmap dst, layout_bitmap src, const char *msg) +{ + BOOL changed = NO; + size_t bit; + + if (dst.bitCount < src.bitCount) { + _objc_fatal("layout_bitmap_or: layout bitmap too short%s%s", + msg ? ": " : "", msg ? msg : ""); + } + + // fixme optimize for byte/word at a time + for (bit = 0; bit < src.bitCount; bit++) { + int dstset = dst.bits[bit/8] & (1 << (bit % 8)); + int srcset = src.bits[bit/8] & (1 << (bit % 8)); + if (srcset && !dstset) { + changed = YES; + dst.bits[bit/8] |= 1 << (bit % 8); + } + } + + return changed; +} + + +/*********************************************************************** +* layout_bitmap_clear +* Set dst=dst&~src. +* dst must be at least as long as src. +* Returns YES if any of dst's bits were changed. +**********************************************************************/ +__private_extern__ BOOL +layout_bitmap_clear(layout_bitmap dst, layout_bitmap src, const char *msg) +{ + BOOL changed = NO; + size_t bit; + + if (dst.bitCount < src.bitCount) { + _objc_fatal("layout_bitmap_clear: layout bitmap too short%s%s", + msg ? ": " : "", msg ? msg : ""); + } + + // fixme optimize for byte/word at a time + for (bit = 0; bit < src.bitCount; bit++) { + int dstset = dst.bits[bit/8] & (1 << (bit % 8)); + int srcset = src.bits[bit/8] & (1 << (bit % 8)); + if (srcset && dstset) { + changed = YES; + dst.bits[bit/8] &= ~(1 << (bit % 8)); + } + } + + return changed; +} + + +__private_extern__ void +layout_bitmap_print(layout_bitmap bits) +{ + size_t i; + printf("%zu: ", bits.bitCount); + for (i = 0; i < bits.bitCount; i++) { + int set = bits.bits[i/8] & (1 << (i % 8)); + printf("%c", set ? '#' : '_'); + } + printf("\n"); +} + + #if 0 // The code below may be useful when interpreting ivar types more precisely. diff --git a/runtime/objc-load.h b/runtime/objc-load.h index ee6155a..5164369 100644 --- a/runtime/objc-load.h +++ b/runtime/objc-load.h @@ -28,10 +28,10 @@ #ifndef _OBJC_LOAD_H_ #define _OBJC_LOAD_H_ -#import +#include -#import -#import +#include +#include /* dynamically loading Mach-O object files that contain Objective-C code */ diff --git a/runtime/objc-load.m b/runtime/objc-load.m index c1b080d..5488555 100644 --- a/runtime/objc-load.m +++ b/runtime/objc-load.m @@ -28,14 +28,9 @@ * */ -#if !__OBJC2__ - -#import "objc-private.h" -#import -#import -#import -#include +#include "objc-private.h" +#if !__OBJC2__ && !TARGET_OS_WIN32 extern void (*callbackFunction)( Class, const char * ); diff --git a/runtime/objc-loadmethod.h b/runtime/objc-loadmethod.h index e76787f..d6ab45d 100644 --- a/runtime/objc-loadmethod.h +++ b/runtime/objc-loadmethod.h @@ -26,7 +26,7 @@ * Support for +load methods. **********************************************************************/ -#import "objc-private.h" +#include "objc-private.h" extern void add_class_to_loadable_list(Class cls); extern void add_category_to_loadable_list(Category cat); diff --git a/runtime/objc-loadmethod.m b/runtime/objc-loadmethod.m index 8231c14..68fc2ab 100644 --- a/runtime/objc-loadmethod.m +++ b/runtime/objc-loadmethod.m @@ -26,8 +26,8 @@ * Support for +load methods. **********************************************************************/ -#import "objc-loadmethod.h" -#import "objc-private.h" +#include "objc-loadmethod.h" +#include "objc-private.h" struct loadable_class { Class cls; // may be NULL @@ -59,7 +59,11 @@ static int loadable_categories_allocated NOBSS = 0; **********************************************************************/ __private_extern__ void add_class_to_loadable_list(Class cls) { - IMP method = _class_getLoadMethod(cls); + IMP method; + + recursive_mutex_assert_locked(&loadMethodLock); + + method = _class_getLoadMethod(cls); if (!method) return; // Don't bother if cls has no +load method if (PrintLoading) { @@ -88,7 +92,11 @@ __private_extern__ void add_class_to_loadable_list(Class cls) **********************************************************************/ __private_extern__ void add_category_to_loadable_list(Category cat) { - IMP method = _category_getLoadMethod(cat); + IMP method; + + recursive_mutex_assert_locked(&loadMethodLock); + + method = _category_getLoadMethod(cat); // Don't bother if cat has no +load method if (!method) return; @@ -119,6 +127,8 @@ __private_extern__ void add_category_to_loadable_list(Category cat) **********************************************************************/ __private_extern__ void remove_class_from_loadable_list(Class cls) { + recursive_mutex_assert_locked(&loadMethodLock); + if (loadable_classes) { int i; for (i = 0; i < loadable_classes_used; i++) { @@ -141,6 +151,8 @@ __private_extern__ void remove_class_from_loadable_list(Class cls) **********************************************************************/ __private_extern__ void remove_category_from_loadable_list(Category cat) { + recursive_mutex_assert_locked(&loadMethodLock); + if (loadable_categories) { int i; for (i = 0; i < loadable_categories_used; i++) { @@ -185,7 +197,7 @@ static void call_class_loads(void) if (PrintLoading) { _objc_inform("LOAD: +[%s load]\n", _class_getName(cls)); } - (*load_method) ((id) cls, @selector(load)); + (*load_method) ((id) cls, SEL_load); } // Destroy the detached list. @@ -232,7 +244,7 @@ static BOOL call_category_loads(void) _class_getName(cls), _category_getName(cat)); } - (*load_method) ((id) cls, @selector(load)); + (*load_method) ((id) cls, SEL_load); cats[i].cat = NULL; } } @@ -314,26 +326,19 @@ static BOOL call_category_loads(void) * ordering, even if a category +load triggers a new loadable class * and a new loadable category attached to that class. * -* fixme this is not thread-safe, but neither is the rest of image mapping. +* Locking: loadMethodLock must be held by the caller +* All other locks must not be held. **********************************************************************/ __private_extern__ void call_load_methods(void) { - static pthread_t load_method_thread NOBSS = NULL; + static BOOL loading = NO; BOOL more_categories; - if (load_method_thread) { - // +loads are already being called. Do nothing, but complain - // if it looks like multithreaded use of this thread-unsafe code. + recursive_mutex_assert_locked(&loadMethodLock); - if (! pthread_equal(load_method_thread, pthread_self())) { - _objc_inform("WARNING: multi-threaded library loading detected " - "(implementation is not thread-safe)"); - } - return; - } - - // Nobody else is calling +loads, so we should do it ourselves. - load_method_thread = pthread_self(); + // Re-entrant calls do nothing; the outermost call will finish the job. + if (loading) return; + loading = YES; do { // 1. Repeatedly call class +loads until there aren't any more @@ -347,7 +352,7 @@ __private_extern__ void call_load_methods(void) // 3. Run more +loads if there are classes OR more untried categories } while (loadable_classes_used > 0 || more_categories); - load_method_thread = NULL; + loading = NO; } diff --git a/runtime/objc-lockdebug.m b/runtime/objc-lockdebug.m index 014518c..ef40792 100644 --- a/runtime/objc-lockdebug.m +++ b/runtime/objc-lockdebug.m @@ -26,12 +26,30 @@ * Error-checking locks for debugging. **********************************************************************/ -#import "objc-private.h" +#include "objc-private.h" + +#if !defined(NDEBUG) && !TARGET_OS_WIN32 + +/*********************************************************************** +* Recording - per-thread list of mutexes and monitors held +**********************************************************************/ + +typedef struct { + void *l; // the lock itself + int k; // the kind of lock it is (MUTEX, MONITOR, etc) + int i; // the lock's nest count +} lockcount; + +#define MUTEX 1 +#define MONITOR 2 +#define RDLOCK 3 +#define WRLOCK 4 +#define RECURSIVE 5 typedef struct _objc_lock_list { int allocated; int used; - mutex_t list[0]; // variable-size + lockcount list[0]; } _objc_lock_list; static struct _objc_lock_list * @@ -48,8 +66,8 @@ getLocks(BOOL create) if (!create) { return NULL; } else { - locks = _calloc_internal(1, sizeof(_objc_lock_list) + sizeof(mutex_t) * 4); - locks->allocated = 4; + locks = _calloc_internal(1, sizeof(_objc_lock_list) + sizeof(lockcount) * 16); + locks->allocated = 16; locks->used = 0; data->lockList = locks; } @@ -59,10 +77,10 @@ getLocks(BOOL create) if (!create) { return locks; } else { - data->lockList = _calloc_internal(1, sizeof(_objc_lock_list) + 2 * locks->used * sizeof(mutex_t)); + data->lockList = _calloc_internal(1, sizeof(_objc_lock_list) + 2 * locks->used * sizeof(lockcount)); data->lockList->used = locks->used; data->lockList->allocated = locks->used * 2; - memcpy(data->lockList->list, locks->list, locks->used * sizeof(mutex_t)); + memcpy(data->lockList->list, locks->list, locks->used * sizeof(lockcount)); _free_internal(locks); locks = data->lockList; } @@ -71,78 +89,438 @@ getLocks(BOOL create) return locks; } - static BOOL -hasLock(_objc_lock_list *locks, mutex_t lock) +hasLock(_objc_lock_list *locks, void *lock, int kind) { int i; if (!locks) return NO; for (i = 0; i < locks->used; i++) { - if (locks->list[i] == lock) return YES; + if (locks->list[i].l == lock && locks->list[i].k == kind) return YES; } return NO; } static void -setLock(_objc_lock_list *locks, mutex_t lock) +setLock(_objc_lock_list *locks, void *lock, int kind) { - locks->list[locks->used++] = lock; + int i; + for (i = 0; i < locks->used; i++) { + if (locks->list[i].l == lock && locks->list[i].k == kind) { + locks->list[i].i++; + return; + } + } + + locks->list[locks->used].l = lock; + locks->list[locks->used].i = 1; + locks->list[locks->used].k = kind; + locks->used++; } static void -clearLock(_objc_lock_list *locks, mutex_t lock) +clearLock(_objc_lock_list *locks, void *lock, int kind) { int i; for (i = 0; i < locks->used; i++) { - if (locks->list[i] == lock) { - locks->list[i] = locks->list[--locks->used]; + if (locks->list[i].l == lock && locks->list[i].k == kind) { + if (--locks->list[i].i == 0) { + locks->list[i].l = NULL; + locks->list[i] = locks->list[--locks->used]; + } return; } } + + _objc_fatal("lock not found!"); +} + +__private_extern__ void +_destroyLockList(struct _objc_lock_list *locks) +{ + // fixme complain about any still-held locks? + if (locks) _free_internal(locks); +} + + +/*********************************************************************** +* Mutex checking +**********************************************************************/ + +__private_extern__ int +_mutex_lock_debug(mutex_t *lock, const char *name) +{ + _objc_lock_list *locks = getLocks(YES); + + if (! (DebuggerMode && isManagedDuringDebugger(lock))) { + if (hasLock(locks, lock, MUTEX)) { + _objc_fatal("deadlock: relocking mutex %s\n", name+1); + } + setLock(locks, lock, MUTEX); + } + + return _mutex_lock_nodebug(lock); +} + +__private_extern__ int +_mutex_try_lock_debug(mutex_t *lock, const char *name) +{ + _objc_lock_list *locks = getLocks(YES); + + // attempting to relock in try_lock is OK + int result = _mutex_try_lock_nodebug(lock); + + if (! (DebuggerMode && isManagedDuringDebugger(lock))) { + if (result) { + setLock(locks, lock, MUTEX); + } + } + return result; } +__private_extern__ int +_mutex_unlock_debug(mutex_t *lock, const char *name) +{ + _objc_lock_list *locks = getLocks(NO); + + if (! (DebuggerMode && isManagedDuringDebugger(lock))) { + if (!hasLock(locks, lock, MUTEX)) { + _objc_fatal("unlocking unowned mutex %s\n", name+1); + } + clearLock(locks, lock, MUTEX); + } + + return _mutex_unlock_nodebug(lock); +} __private_extern__ void -_lock_debug(mutex_t lock, const char *name) +_mutex_assert_locked_debug(mutex_t *lock, const char *name) +{ + _objc_lock_list *locks = getLocks(NO); + + if (! (DebuggerMode && isManagedDuringDebugger(lock))) { + if (!hasLock(locks, lock, MUTEX)) { + _objc_fatal("mutex %s incorrectly not held\n",name+1); + } + } +} + + +__private_extern__ void +_mutex_assert_unlocked_debug(mutex_t *lock, const char *name) +{ + _objc_lock_list *locks = getLocks(NO); + + if (! (DebuggerMode && isManagedDuringDebugger(lock))) { + if (hasLock(locks, lock, MUTEX)) { + _objc_fatal("mutex %s incorrectly held\n", name+1); + } + } +} + + +/*********************************************************************** +* Recursive mutex checking +**********************************************************************/ + +__private_extern__ int +_recursive_mutex_lock_debug(recursive_mutex_t *lock, const char *name) +{ + _objc_lock_list *locks = getLocks(YES); + + if (! (DebuggerMode && isManagedDuringDebugger(lock))) { + setLock(locks, lock, RECURSIVE); + } + + return _recursive_mutex_lock_nodebug(lock); +} + +__private_extern__ int +_recursive_mutex_try_lock_debug(recursive_mutex_t *lock, const char *name) { _objc_lock_list *locks = getLocks(YES); - if (hasLock(locks, lock)) _objc_fatal("deadlock: relocking %s\n", name+1); - setLock(locks, lock); - mutex_lock(lock); + + int result = _recursive_mutex_try_lock_nodebug(lock); + + if (! (DebuggerMode && isManagedDuringDebugger(lock))) { + if (result) { + setLock(locks, lock, RECURSIVE); + } + } + return result; } +__private_extern__ int +_recursive_mutex_unlock_debug(recursive_mutex_t *lock, const char *name) +{ + _objc_lock_list *locks = getLocks(NO); + + if (! (DebuggerMode && isManagedDuringDebugger(lock))) { + if (!hasLock(locks, lock, RECURSIVE)) { + _objc_fatal("unlocking unowned recursive mutex %s\n", name+1); + } + clearLock(locks, lock, RECURSIVE); + } + + return _recursive_mutex_unlock_nodebug(lock); +} __private_extern__ void -_checklock_debug(mutex_t lock, const char *name) +_recursive_mutex_assert_locked_debug(recursive_mutex_t *lock, const char *name) { _objc_lock_list *locks = getLocks(NO); - if (!hasLock(locks, lock)) _objc_fatal("%s incorrectly not held\n",name+1); + + if (! (DebuggerMode && isManagedDuringDebugger(lock))) { + if (!hasLock(locks, lock, RECURSIVE)) { + _objc_fatal("recursive mutex %s incorrectly not held\n",name+1); + } + } } __private_extern__ void -_checkunlock_debug(mutex_t lock, const char *name) +_recursive_mutex_assert_unlocked_debug(recursive_mutex_t *lock, const char *name) +{ + _objc_lock_list *locks = getLocks(NO); + + if (! (DebuggerMode && isManagedDuringDebugger(lock))) { + if (hasLock(locks, lock, RECURSIVE)) { + _objc_fatal("recursive mutex %s incorrectly held\n", name+1); + } + } +} + + +/*********************************************************************** +* Monitor checking +**********************************************************************/ + +__private_extern__ int +_monitor_enter_debug(monitor_t *lock, const char *name) +{ + _objc_lock_list *locks = getLocks(YES); + + if (! (DebuggerMode && isManagedDuringDebugger(lock))) { + if (hasLock(locks, lock, MONITOR)) { + _objc_fatal("deadlock: relocking monitor %s\n", name+1); + } + setLock(locks, lock, MONITOR); + } + + return _monitor_enter_nodebug(lock); +} + +__private_extern__ int +_monitor_exit_debug(monitor_t *lock, const char *name) +{ + _objc_lock_list *locks = getLocks(NO); + + if (! (DebuggerMode && isManagedDuringDebugger(lock))) { + if (!hasLock(locks, lock, MONITOR)) { + _objc_fatal("unlocking unowned monitor%s\n", name+1); + } + clearLock(locks, lock, MONITOR); + } + + return _monitor_exit_nodebug(lock); +} + +__private_extern__ int +_monitor_wait_debug(monitor_t *lock, const char *name) { _objc_lock_list *locks = getLocks(NO); - if (hasLock(locks, lock)) _objc_fatal("%s incorrectly held\n", name+1); + + if (! (DebuggerMode && isManagedDuringDebugger(lock))) { + if (!hasLock(locks, lock, MONITOR)) { + _objc_fatal("waiting in unowned monitor%s\n", name+1); + } + } + + return _monitor_wait_nodebug(lock); } +__private_extern__ void +_monitor_assert_locked_debug(monitor_t *lock, const char *name) +{ + _objc_lock_list *locks = getLocks(NO); + + if (! (DebuggerMode && isManagedDuringDebugger(lock))) { + if (!hasLock(locks, lock, MONITOR)) { + _objc_fatal("monitor %s incorrectly not held\n",name+1); + } + } +} __private_extern__ void -_unlock_debug(mutex_t lock, const char *name) +_monitor_assert_unlocked_debug(monitor_t *lock, const char *name) { _objc_lock_list *locks = getLocks(NO); - if (!hasLock(locks, lock)) _objc_fatal("unlocking unowned %s\n", name+1); - clearLock(locks, lock); - mutex_unlock(lock); + + if (! (DebuggerMode && isManagedDuringDebugger(lock))) { + if (hasLock(locks, lock, MONITOR)) { + _objc_fatal("monitor %s incorrectly held\n", name+1); + } + } } +/*********************************************************************** +* rwlock checking +**********************************************************************/ + __private_extern__ void -_destroyLockList(struct _objc_lock_list *locks) +_rwlock_read_debug(rwlock_t *lock, const char *name) { - // fixme complain about any still-held locks? - if (locks) _free_internal(locks); + _objc_lock_list *locks = getLocks(YES); + + if (! (DebuggerMode && isManagedDuringDebugger(lock))) { + if (hasLock(locks, lock, RDLOCK)) { + // Recursive rwlock read is bad (may deadlock vs pending writer) + _objc_fatal("recursive rwlock read %s\n", name+1); + } + if (hasLock(locks, lock, WRLOCK)) { + _objc_fatal("deadlock: read after write for rwlock %s\n", name+1); + } + setLock(locks, lock, RDLOCK); + } + + _rwlock_read_nodebug(lock); +} + +__private_extern__ int +_rwlock_try_read_debug(rwlock_t *lock, const char *name) +{ + _objc_lock_list *locks = getLocks(YES); + + // try-read when already reading is OK (won't deadlock against writer) + // try-read when already writing is OK (will fail) + int result = _rwlock_try_read_nodebug(lock); + + if (! (DebuggerMode && isManagedDuringDebugger(lock))) { + if (result) { + setLock(locks, lock, RDLOCK); + } + } + return result; +} + +__private_extern__ void +_rwlock_unlock_read_debug(rwlock_t *lock, const char *name) +{ + _objc_lock_list *locks = getLocks(NO); + + if (! (DebuggerMode && isManagedDuringDebugger(lock))) { + if (!hasLock(locks, lock, RDLOCK)) { + _objc_fatal("un-reading unowned rwlock %s\n", name+1); + } + clearLock(locks, lock, RDLOCK); + } + + _rwlock_unlock_read_nodebug(lock); } + +__private_extern__ void +_rwlock_write_debug(rwlock_t *lock, const char *name) +{ + _objc_lock_list *locks = getLocks(YES); + + if (! (DebuggerMode && isManagedDuringDebugger(lock))) { + if (hasLock(locks, lock, RDLOCK)) { + // Lock promotion not allowed (may deadlock) + _objc_fatal("deadlock: write after read for rwlock %s\n", name+1); + } + if (hasLock(locks, lock, WRLOCK)) { + _objc_fatal("recursive rwlock write %s\n", name+1); + } + setLock(locks, lock, WRLOCK); + } + + _rwlock_write_nodebug(lock); +} + + +__private_extern__ int +_rwlock_try_write_debug(rwlock_t *lock, const char *name) +{ + _objc_lock_list *locks = getLocks(YES); + + // try-write when already reading is OK (will fail) + // try-write when already writing is OK (will fail) + int result = _rwlock_try_write_nodebug(lock); + + if (! (DebuggerMode && isManagedDuringDebugger(lock))) { + if (result) { + setLock(locks, lock, WRLOCK); + } + } + return result; +} + +__private_extern__ void +_rwlock_unlock_write_debug(rwlock_t *lock, const char *name) +{ + _objc_lock_list *locks = getLocks(NO); + + if (! (DebuggerMode && isManagedDuringDebugger(lock))) { + if (!hasLock(locks, lock, WRLOCK)) { + _objc_fatal("un-writing unowned rwlock %s\n", name+1); + } + clearLock(locks, lock, WRLOCK); + } + + _rwlock_unlock_write_nodebug(lock); +} + + +__private_extern__ void +_rwlock_assert_reading_debug(rwlock_t *lock, const char *name) +{ + _objc_lock_list *locks = getLocks(NO); + + if (! (DebuggerMode && isManagedDuringDebugger(lock))) { + if (!hasLock(locks, lock, RDLOCK)) { + _objc_fatal("rwlock %s incorrectly not reading\n", name+1); + } + } +} + +__private_extern__ void +_rwlock_assert_writing_debug(rwlock_t *lock, const char *name) +{ + _objc_lock_list *locks = getLocks(NO); + + if (! (DebuggerMode && isManagedDuringDebugger(lock))) { + if (!hasLock(locks, lock, WRLOCK)) { + _objc_fatal("rwlock %s incorrectly not writing\n", name+1); + } + } +} + +__private_extern__ void +_rwlock_assert_locked_debug(rwlock_t *lock, const char *name) +{ + _objc_lock_list *locks = getLocks(NO); + + if (! (DebuggerMode && isManagedDuringDebugger(lock))) { + if (!hasLock(locks, lock, RDLOCK) && !hasLock(locks, lock, WRLOCK)) { + _objc_fatal("rwlock %s incorrectly neither reading nor writing\n", + name+1); + } + } +} + +__private_extern__ void +_rwlock_assert_unlocked_debug(rwlock_t *lock, const char *name) +{ + _objc_lock_list *locks = getLocks(NO); + + if (! (DebuggerMode && isManagedDuringDebugger(lock))) { + if (hasLock(locks, lock, RDLOCK) || hasLock(locks, lock, WRLOCK)) { + _objc_fatal("rwlock %s incorrectly not unlocked\n", name+1); + } + } +} + + +#endif diff --git a/runtime/objc-os.h b/runtime/objc-os.h new file mode 100644 index 0000000..e2f5613 --- /dev/null +++ b/runtime/objc-os.h @@ -0,0 +1,843 @@ +/* + * Copyright (c) 2007 Apple Inc. All Rights Reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +/*********************************************************************** +* objc-os.h +* OS portability layer. +**********************************************************************/ + +#ifndef _OBJC_OS_H +#define _OBJC_OS_H + +#include + +#if TARGET_OS_MAC + +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include "objc-probes.h" // generated dtrace probe definitions. + +# if __cplusplus +# include +# include + using namespace std; +# include + using namespace __gnu_cxx; +# endif + +#elif TARGET_OS_WIN32 + +# define WINVER 0x0501 // target Windows XP and later +# define _WIN32_WINNT 0x0501 // target Windows XP and later +# define WIN32_LEAN_AND_MEAN + // hack: windef.h typedefs BOOL as int +# define BOOL WINBOOL +# include +# undef BOOL + +# include +# include +# include +# include +# include +# include +# include +# include + +# if __cplusplus +# include +# include + using namespace std; +# include + using namespace stdext; +# define __BEGIN_DECLS extern "C" { +# define __END_DECLS } +# else +# define __BEGIN_DECLS /*empty*/ +# define __END_DECLS /*empty*/ +# endif + +# define __private_extern__ +# define __attribute__(x) +# define inline __inline + +/* stub out dtrace probes */ +# define OBJC_RUNTIME_OBJC_EXCEPTION_RETHROW() do {} while(0) +# define OBJC_RUNTIME_OBJC_EXCEPTION_THROW(arg0) do {} while(0) + +#else +# error unknown OS +#endif + + +#include +#include + +__BEGIN_DECLS + +extern void _objc_fatal(const char *fmt, ...) __attribute__((noreturn, format (printf, 1, 2))); + +#define INIT_ONCE_PTR(var, create, delete) \ + do { \ + if (var) break; \ + typeof(var) v = create; \ + while (!var) { \ + if (OSAtomicCompareAndSwapPtrBarrier(0, v, (void**)&var)) { \ + goto done; \ + } \ + } \ + delete; \ + done:; \ + } while (0) + +#define INIT_ONCE_32(var, create, delete) \ + do { \ + if (var) break; \ + typeof(var) v = create; \ + while (!var) { \ + if (OSAtomicCompareAndSwap32Barrier(0, v, (volatile int32_t *)&var)) { \ + goto done; \ + } \ + } \ + delete; \ + done:; \ + } while (0) + + +// Thread keys reserved by libc for our use. +// Keys [0..4] are used by autozone. +#if defined(__PTK_FRAMEWORK_OBJC_KEY5) +# define TLS_DIRECT_KEY ((tls_key_t)__PTK_FRAMEWORK_OBJC_KEY5) +# define SYNC_DATA_DIRECT_KEY ((tls_key_t)__PTK_FRAMEWORK_OBJC_KEY6) +# define SYNC_COUNT_DIRECT_KEY ((tls_key_t)__PTK_FRAMEWORK_OBJC_KEY7) +// define DIRECT_4_KEY ((tls_key_t)__PTK_FRAMEWORK_OBJC_KEY8) +// define DIRECT_5_KEY ((tls_key_t)__PTK_FRAMEWORK_OBJC_KEY9) +#else +# define NO_DIRECT_THREAD_KEYS 1 +#endif + + +#if TARGET_OS_WIN32 + +// Compiler compatibility + +// OS compatibility + +#define strdup _strdup + +#define issetugid() 0 + +#define MIN(x, y) ((x) < (y) ? (x) : (y)) + +static __inline void bcopy(const void *src, void *dst, size_t size) { memcpy(dst, src, size); } +static __inline void bzero(void *dst, size_t size) { memset(dst, 0, size); } + +int asprintf(char **dstp, const char *format, ...); + +typedef void * malloc_zone_t; + +static __inline malloc_zone_t malloc_default_zone(void) { return (malloc_zone_t)-1; } +static __inline void *malloc_zone_malloc(malloc_zone_t z, size_t size) { return malloc(size); } +static __inline void *malloc_zone_calloc(malloc_zone_t z, size_t size, size_t count) { return calloc(size, count); } +static __inline void *malloc_zone_realloc(malloc_zone_t z, void *p, size_t size) { return realloc(p, size); } +static __inline void malloc_zone_free(malloc_zone_t z, void *p) { free(p); } +static __inline malloc_zone_t malloc_zone_from_ptr(const void *p) { return (malloc_zone_t)-1; } +static __inline size_t malloc_size(const void *p) { return _msize((void*)p); /* fixme invalid pointer check? */ } + + +// AssertMacros + +#define require_action_string(cond, dest, act, msg) do { if (!(cond)) { { act; } goto dest; } } while (0) +#define require_noerr_string(err, dest, msg) do { if (err) goto dest; } while (0) +#define require_string(cond, dest, msg) do { if (!(cond)) goto dest; } while (0) + + +// OSAtomic + +static __inline BOOL OSAtomicCompareAndSwapLong(long oldl, long newl, long volatile *dst) +{ + // fixme barrier is overkill + long original = InterlockedCompareExchange(dst, newl, oldl); + return (original == oldl); +} + +static __inline BOOL OSAtomicCompareAndSwapPtrBarrier(void *oldp, void *newp, void * volatile *dst) +{ + void *original = InterlockedCompareExchangePointer(dst, newp, oldp); + return (original == oldp); +} + +static __inline BOOL OSAtomicCompareAndSwap32Barrier(int32_t oldl, int32_t newl, int32_t volatile *dst) +{ + long original = InterlockedCompareExchange((volatile long *)dst, newl, oldl); + return (original == oldl); +} + +static __inline int32_t OSAtomicDecrement32Barrier(volatile int32_t *dst) +{ + return InterlockedDecrement((volatile long *)dst); +} + +static __inline int32_t OSAtomicIncrement32Barrier(volatile int32_t *dst) +{ + return InterlockedIncrement((volatile long *)dst); +} + + +// Internal data types + +typedef DWORD objc_thread_t; // thread ID +static __inline int thread_equal(objc_thread_t t1, objc_thread_t t2) { + return t1 == t2; +} +static __inline objc_thread_t thread_self(void) { + return GetCurrentThreadId(); +} + +typedef struct { + DWORD key; + void (*dtor)(void *); +} tls_key_t; +static __inline void tls_create(tls_key_t *k, void (*dtor)(void*)) { + // fixme need dtor registry for DllMain to call on thread detach + k->key = TlsAlloc(); + k->dtor = dtor; +} +static __inline void *tls_get(tls_key_t k) { + return TlsGetValue(k.key); +} +static __inline void tls_set(tls_key_t k, void *value) { + TlsSetValue(k.key, value); +} + +typedef struct { + CRITICAL_SECTION *lock; +} mutex_t; +#define MUTEX_INITIALIZER {0}; +extern void mutex_init(mutex_t *m); +static __inline int _mutex_lock_nodebug(mutex_t *m) { + // fixme error check + if (!m->lock) { + mutex_init(m); + } + EnterCriticalSection(m->lock); + return 0; +} +static __inline int _mutex_try_lock_nodebug(mutex_t *m) { + // fixme error check + if (!m->lock) { + mutex_init(m); + } + return TryEnterCriticalSection(m->lock); +} +static __inline int _mutex_unlock_nodebug(mutex_t *m) { + // fixme error check + LeaveCriticalSection(m->lock); + return 0; +} + + +typedef mutex_t OSSpinLock; +#define OSSpinLockLock(l) mutex_lock(l) +#define OSSpinLockUnlock(l) mutex_unlock(l) +#define OS_SPINLOCK_INIT MUTEX_INITIALIZER + + +typedef struct { + HANDLE mutex; +} recursive_mutex_t; +#define RECURSIVE_MUTEX_INITIALIZER {0}; +#define RECURSIVE_MUTEX_NOT_LOCKED 1 +extern void recursive_mutex_init(recursive_mutex_t *m); +static __inline int _recursive_mutex_lock_nodebug(recursive_mutex_t *m) { + assert(m->mutex); + return WaitForSingleObject(m->mutex, INFINITE); +} +static __inline int _recursive_mutex_try_lock_nodebug(recursive_mutex_t *m) { + assert(m->mutex); + return (WAIT_OBJECT_0 == WaitForSingleObject(m->mutex, 0)); +} +static __inline int _recursive_mutex_unlock_nodebug(recursive_mutex_t *m) { + assert(m->mutex); + return ReleaseMutex(m->mutex) ? 0 : RECURSIVE_MUTEX_NOT_LOCKED; +} + + +/* +typedef HANDLE mutex_t; +static inline void mutex_init(HANDLE *m) { *m = CreateMutex(NULL, FALSE, NULL); } +static inline void _mutex_lock(mutex_t *m) { WaitForSingleObject(*m, INFINITE); } +static inline int mutex_try_lock(mutex_t *m) { return WaitForSingleObject(*m, 0) == WAIT_OBJECT_0; } +static inline void _mutex_unlock(mutex_t *m) { ReleaseMutex(*m); } +*/ + +// based on http://www.cs.wustl.edu/~schmidt/win32-cv-1.html +// Vista-only CONDITION_VARIABLE would be better +typedef struct { + HANDLE mutex; + HANDLE waiters; // semaphore for those in cond_wait() + HANDLE waitersDone; // auto-reset event after everyone gets a broadcast + CRITICAL_SECTION waitCountLock; // guards waitCount and didBroadcast + unsigned int waitCount; + int didBroadcast; +} monitor_t; +#define MONITOR_INITIALIZER { 0 } +#define MONITOR_NOT_ENTERED 1 +extern int monitor_init(monitor_t *c); + +static inline int _monitor_enter_nodebug(monitor_t *c) { + if (!c->mutex) { + int err = monitor_init(c); + if (err) return err; + } + return WaitForSingleObject(c->mutex, INFINITE); +} +static inline int _monitor_exit_nodebug(monitor_t *c) { + if (!ReleaseMutex(c->mutex)) return MONITOR_NOT_ENTERED; + else return 0; +} +static inline int _monitor_wait_nodebug(monitor_t *c) { + int last; + EnterCriticalSection(&c->waitCountLock); + c->waitCount++; + LeaveCriticalSection(&c->waitCountLock); + + SignalObjectAndWait(c->mutex, c->waiters, INFINITE, FALSE); + + EnterCriticalSection(&c->waitCountLock); + c->waitCount--; + last = c->didBroadcast && c->waitCount == 0; + LeaveCriticalSection(&c->waitCountLock); + + if (last) { + // tell broadcaster that all waiters have awoken + SignalObjectAndWait(c->waitersDone, c->mutex, INFINITE, FALSE); + } else { + WaitForSingleObject(c->mutex, INFINITE); + } + + // fixme error checking + return 0; +} +static inline int monitor_notify(monitor_t *c) { + int haveWaiters; + + EnterCriticalSection(&c->waitCountLock); + haveWaiters = c->waitCount > 0; + LeaveCriticalSection(&c->waitCountLock); + + if (haveWaiters) { + ReleaseSemaphore(c->waiters, 1, 0); + } + + // fixme error checking + return 0; +} +static inline int monitor_notifyAll(monitor_t *c) { + EnterCriticalSection(&c->waitCountLock); + if (c->waitCount == 0) { + LeaveCriticalSection(&c->waitCountLock); + return 0; + } + c->didBroadcast = 1; + ReleaseSemaphore(c->waiters, c->waitCount, 0); + LeaveCriticalSection(&c->waitCountLock); + + // fairness: wait for everyone to move from waiters to mutex + WaitForSingleObject(c->waitersDone, INFINITE); + // not under waitCountLock, but still under mutex + c->didBroadcast = 0; + + // fixme error checking + return 0; +} + + +// fixme no rwlock yet + +#define rwlock_t mutex_t +#define rwlock_init(r) mutex_init(r) +#define _rwlock_read_nodebug(m) _mutex_lock_nodebug(m) +#define _rwlock_write_nodebug(m) _mutex_lock_nodebug(m) +#define _rwlock_try_read_nodebug(m) _mutex_try_lock_nodebug(m) +#define _rwlock_try_write_nodebug(m) _mutex_try_lock_nodebug(m) +#define _rwlock_unlock_read_nodebug(m) _mutex_unlock_nodebug(m) +#define _rwlock_unlock_write_nodebug(m) _mutex_unlock_nodebug(m) + + +typedef struct { + struct objc_module **modules; + size_t moduleCount; + struct old_protocol **protocols; + size_t protocolCount; + void *imageinfo; + size_t imageinfoBytes; + SEL *selrefs; + size_t selrefCount; + struct objc_class **clsrefs; + size_t clsrefCount; +} os_header_info; + +typedef IMAGE_DOS_HEADER headerType; +// fixme YES bundle? NO bundle? sometimes? +#define headerIsBundle(hi) YES +OBJC_EXTERN IMAGE_DOS_HEADER __ImageBase; +#define libobjc_header ((headerType *)&__ImageBase) + +// Prototypes + + +#elif TARGET_OS_MAC + + +// OS headers + + +// Compiler compatibility + +// OS compatibility + +// Internal data types + +typedef pthread_t objc_thread_t; + +static __inline int thread_equal(objc_thread_t t1, objc_thread_t t2) { + return pthread_equal(t1, t2); +} +static __inline objc_thread_t thread_self(void) { + return pthread_self(); +} + + +typedef pthread_key_t tls_key_t; + +static inline void tls_create(tls_key_t *k, void (*dtor)(void*)) { + pthread_key_create(k, dtor); +} +static inline void *tls_get(tls_key_t k) { + return pthread_getspecific(k); +} +static inline void tls_set(tls_key_t k, void *value) { + pthread_setspecific(k, value); +} + +#ifndef NO_DIRECT_THREAD_KEYS +static inline void *tls_get_direct(tls_key_t k) +{ + assert(k == SYNC_DATA_DIRECT_KEY || + k == SYNC_COUNT_DIRECT_KEY); + + if (_pthread_has_direct_tsd()) { + return _pthread_getspecific_direct(k); + } else { + return pthread_getspecific(k); + } +} +static inline void tls_set_direct(tls_key_t k, void *value) +{ + assert(k == SYNC_DATA_DIRECT_KEY || + k == SYNC_COUNT_DIRECT_KEY); + + if (_pthread_has_direct_tsd()) { + _pthread_setspecific_direct(k, value); + } else { + pthread_setspecific(k, value); + } +} +#endif + + +typedef pthread_mutex_t mutex_t; +#define MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER; + +extern int DebuggerMode; +extern void gdb_objc_debuggerModeFailure(void); +extern BOOL isManagedDuringDebugger(void *lock); +extern BOOL isLockedDuringDebugger(mutex_t *lock); + +static inline int _mutex_lock_nodebug(mutex_t *m) { + if (DebuggerMode && isManagedDuringDebugger(m)) { + if (! isLockedDuringDebugger(m)) { + gdb_objc_debuggerModeFailure(); + } + return 0; + } + return pthread_mutex_lock(m); +} +static inline int _mutex_try_lock_nodebug(mutex_t *m) { + if (DebuggerMode && isManagedDuringDebugger(m)) { + if (! isLockedDuringDebugger(m)) { + gdb_objc_debuggerModeFailure(); + } + return 1; + } + return !pthread_mutex_trylock(m); +} +static inline int _mutex_unlock_nodebug(mutex_t *m) { + if (DebuggerMode && isManagedDuringDebugger(m)) { + return 0; + } + return pthread_mutex_unlock(m); +} + + +typedef struct { + pthread_mutex_t *mutex; +} recursive_mutex_t; +#define RECURSIVE_MUTEX_INITIALIZER {0}; +#define RECURSIVE_MUTEX_NOT_LOCKED EPERM +extern void recursive_mutex_init(recursive_mutex_t *m); + +static inline int _recursive_mutex_lock_nodebug(recursive_mutex_t *m) { + assert(m->mutex); + if (DebuggerMode && isManagedDuringDebugger(m)) { + if (! isLockedDuringDebugger((mutex_t *)m)) { + gdb_objc_debuggerModeFailure(); + } + return 0; + } + return pthread_mutex_lock(m->mutex); +} +static inline int _recursive_mutex_try_lock_nodebug(recursive_mutex_t *m) { + assert(m->mutex); + if (DebuggerMode && isManagedDuringDebugger(m)) { + if (! isLockedDuringDebugger((mutex_t *)m)) { + gdb_objc_debuggerModeFailure(); + } + return 1; + } + return !pthread_mutex_trylock(m->mutex); +} +static inline int _recursive_mutex_unlock_nodebug(recursive_mutex_t *m) { + assert(m->mutex); + if (DebuggerMode && isManagedDuringDebugger(m)) { + return 0; + } + return pthread_mutex_unlock(m->mutex); +} + + +typedef struct { + pthread_mutex_t mutex; + pthread_cond_t cond; +} monitor_t; +#define MONITOR_INITIALIZER { PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER } +#define MONITOR_NOT_ENTERED EPERM + +static inline int monitor_init(monitor_t *c) { + int err = pthread_mutex_init(&c->mutex, NULL); + if (err) return err; + err = pthread_cond_init(&c->cond, NULL); + if (err) { + pthread_mutex_destroy(&c->mutex); + return err; + } + return 0; +} +static inline int _monitor_enter_nodebug(monitor_t *c) { + assert(!isManagedDuringDebugger(c)); + return pthread_mutex_lock(&c->mutex); +} +static inline int _monitor_exit_nodebug(monitor_t *c) { + return pthread_mutex_unlock(&c->mutex); +} +static inline int _monitor_wait_nodebug(monitor_t *c) { + return pthread_cond_wait(&c->cond, &c->mutex); +} +static inline int monitor_notify(monitor_t *c) { + return pthread_cond_signal(&c->cond); +} +static inline int monitor_notifyAll(monitor_t *c) { + return pthread_cond_broadcast(&c->cond); +} + + +// semaphore_create formatted for INIT_ONCE use +static inline semaphore_t create_semaphore(void) +{ + semaphore_t sem; + kern_return_t k; + k = semaphore_create(mach_task_self(), &sem, SYNC_POLICY_FIFO, 0); + if (k) _objc_fatal("semaphore_create failed (0x%x)", k); + return sem; +} + + +/* Custom read-write lock + - reader is atomic add/subtract + - writer is pthread mutex plus atomic add/subtract + - fairness: new readers wait if a writer wants in + - fairness: when writer completes, readers (probably) precede new writer + + state: xxxxxxxx xxxxxxxx yyyyyyyy yyyyyyyz + x: blocked reader count + y: active reader count + z: readers allowed flag +*/ +typedef struct { + volatile int32_t state; + semaphore_t readersDone; + semaphore_t writerDone; + pthread_mutex_t writerMutex; +} rwlock_t; + +extern BOOL isReadingDuringDebugger(rwlock_t *lock); +extern BOOL isWritingDuringDebugger(rwlock_t *lock); + +static inline void rwlock_init(rwlock_t *l) +{ + l->state = 1; + l->readersDone = create_semaphore(); + l->writerDone = create_semaphore(); + l->writerMutex = (mutex_t)MUTEX_INITIALIZER; +} + +static inline void _rwlock_read_nodebug(rwlock_t *l) +{ + if (DebuggerMode && isManagedDuringDebugger(l)) { + if (! isReadingDuringDebugger(l)) { + gdb_objc_debuggerModeFailure(); + } + return; + } + while (1) { + // Increment "blocked readers" or "active readers" count. + int32_t old = l->state; + if (old % 2 == 1) { + // Readers OK. Increment active reader count. + if (OSAtomicCompareAndSwap32Barrier(old, old + 2, &l->state)) { + // Success. Read lock acquired. + return; + } else { + // CAS failed (writer or another reader). Redo from start. + } + } + else { + // Readers not OK. Increment blocked reader count. + if (OSAtomicCompareAndSwap32(old, old + 0x10000, &l->state)) { + // Success. Wait for writer to complete, then retry. + semaphore_wait(l->writerDone); + } else { + // CAS failed (writer or another reader). Redo from start. + } + } + } +} + +static inline void _rwlock_unlock_read_nodebug(rwlock_t *l) +{ + if (DebuggerMode && isManagedDuringDebugger(l)) { + return; + } + // Decrement "active readers" count. + int32_t newState = OSAtomicAdd32Barrier(-2, &l->state); + if ((newState & 0xffff) == 0) { + // No active readers, and readers OK flag is clear. + // We're the last reader out and there's a writer waiting. Wake it. + semaphore_signal(l->readersDone); + } +} + + +static inline int _rwlock_try_read_nodebug(rwlock_t *l) +{ + int i; + if (DebuggerMode && isManagedDuringDebugger(l)) { + if (! isReadingDuringDebugger(l)) { + gdb_objc_debuggerModeFailure(); + } + return 1; + } + for (i = 0; i < 16; i++) { + int32_t old = l->state; + if (old % 2 != 1) { + // Readers not OK. Fail. + return 0; + } else { + // Readers OK. + if (OSAtomicCompareAndSwap32Barrier(old, old + 2, &l->state)) { + // Success. Read lock acquired. + return 1; + } else { + // CAS failed (writer or another reader). Redo from start. + // trylock will fail against writer, + // but retry a few times against reader. + } + } + } + + // Too many retries. Give up. + return 0; +} + + +static inline void _rwlock_write_nodebug(rwlock_t *l) +{ + if (DebuggerMode && isManagedDuringDebugger(l)) { + if (! isWritingDuringDebugger(l)) { + gdb_objc_debuggerModeFailure(); + } + return; + } + + // Only one writer allowed at a time. + pthread_mutex_lock(&l->writerMutex); + + // Clear "readers OK" bit and "blocked readers" count. + int32_t newState = OSAtomicAnd32(0x0000fffe, (uint32_t *)&l->state); + + if (newState == 0) { + // No "active readers". Success. + OSMemoryBarrier(); + } else { + // Wait for "active readers" to complete. + semaphore_wait(l->readersDone); + } +} + +static inline void _rwlock_unlock_write_nodebug(rwlock_t *l) +{ + if (DebuggerMode && isManagedDuringDebugger(l)) { + return; + } + + // Reinstate "readers OK" bit and clear reader counts. + int32_t oldState; + do { + oldState = l->state; + } while (!OSAtomicCompareAndSwap32Barrier(oldState, 0x1, &l->state)); + + // Unblock any "blocked readers" that arrived while we held the lock + oldState = oldState >> 16; + while (oldState--) { + semaphore_signal(l->writerDone); + } + + // Allow a new writer. + pthread_mutex_unlock(&l->writerMutex); +} + +static inline int _rwlock_try_write_nodebug(rwlock_t *l) +{ + if (DebuggerMode && isManagedDuringDebugger(l)) { + if (! isWritingDuringDebugger(l)) { + gdb_objc_debuggerModeFailure(); + } + return 1; + } + + if (pthread_mutex_trylock(&l->writerMutex)) { + // Some other writer is in the way - fail + return 0; + } + + // Similar to _rwlock_write_nodebug, but less intrusive with readers active + + int32_t oldState, newState; + oldState = l->state; + newState = oldState & 0x0000fffe; + if (newState != 0) { + // Readers active. Give up. + pthread_mutex_unlock(&l->writerMutex); + return 0; + } + if (!OSAtomicCompareAndSwap32Barrier(oldState, newState, &l->state)) { + // CAS failed (reader interupted). Give up. + pthread_mutex_unlock(&l->writerMutex); + return 0; + } + + return 1; +} + + +#ifndef __LP64__ +typedef struct mach_header headerType; +typedef struct segment_command segmentType; +typedef struct section sectionType; +#else +typedef struct mach_header_64 headerType; +typedef struct segment_command_64 segmentType; +typedef struct section_64 sectionType; +#endif +#define headerIsBundle(hi) (hi->mhdr->filetype == MH_BUNDLE) +#define libobjc_header ((headerType *)&_mh_dylib_header) + +typedef struct { + Dl_info dl_info; + const segmentType * objcSegmentHeader; + const segmentType * dataSegmentHeader; + ptrdiff_t image_slide; +#if !__OBJC2__ + struct old_protocol **proto_refs; +#endif +} os_header_info; + +// Prototypes + +/* Secure /tmp usage */ +extern int secure_open(const char *filename, int flags, uid_t euid); + + +#else + + +#error unknown OS + + +#endif + +__END_DECLS + +#endif diff --git a/runtime/objc-os.m b/runtime/objc-os.m new file mode 100644 index 0000000..5993e9d --- /dev/null +++ b/runtime/objc-os.m @@ -0,0 +1,913 @@ +/* + * Copyright (c) 2007 Apple Inc. All Rights Reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +/*********************************************************************** +* objc-os.m +* OS portability layer. +**********************************************************************/ + +#define OLD 1 +#include "objc-os.h" +#include "objc-private.h" +#include "objc-loadmethod.h" + +#if TARGET_OS_WIN32 + +#include "objcrt.h" + +malloc_zone_t *_objc_internal_zone(void) +{ + return NULL; +} + +int monitor_init(monitor_t *c) +{ + // fixme error checking + HANDLE mutex = CreateMutex(NULL, TRUE, NULL); + while (!c->mutex) { + // fixme memory barrier here? + if (0 == InterlockedCompareExchangePointer(&c->mutex, mutex, 0)) { + // we win - finish construction + c->waiters = CreateSemaphore(NULL, 0, 0x7fffffff, NULL); + c->waitersDone = CreateEvent(NULL, FALSE, FALSE, NULL); + InitializeCriticalSection(&c->waitCountLock); + c->waitCount = 0; + c->didBroadcast = 0; + ReleaseMutex(c->mutex); + return 0; + } + } + + // someone else allocated the mutex and constructed the monitor + ReleaseMutex(mutex); + CloseHandle(mutex); + return 0; +} + +void mutex_init(mutex_t *m) +{ + while (!m->lock) { + CRITICAL_SECTION *newlock = malloc(sizeof(CRITICAL_SECTION)); + InitializeCriticalSection(newlock); + // fixme memory barrier here? + if (0 == InterlockedCompareExchangePointer(&m->lock, newlock, 0)) { + return; + } + // someone else installed their lock first + DeleteCriticalSection(newlock); + free(newlock); + } +} + + +void recursive_mutex_init(recursive_mutex_t *m) +{ + // fixme error checking + HANDLE newmutex = CreateMutex(NULL, FALSE, NULL); + while (!m->mutex) { + // fixme memory barrier here? + if (0 == InterlockedCompareExchangePointer(&m->mutex, newmutex, 0)) { + // we win + return; + } + } + + // someone else installed their lock first + CloseHandle(newmutex); +} + + +WINBOOL APIENTRY DllMain( HMODULE hModule, + DWORD ul_reason_for_call, + LPVOID lpReserved + ) +{ + switch (ul_reason_for_call) { + case DLL_PROCESS_ATTACH: + environ_init(); + tls_init(); + lock_init(); + sel_init(NO); + exception_init(); + break; + + case DLL_THREAD_ATTACH: + break; + + case DLL_THREAD_DETACH: + case DLL_PROCESS_DETACH: + break; + } + return TRUE; +} + +OBJC_EXPORT void *_objc_init_image(HMODULE image, const objc_sections *sects) +{ + header_info *hi = _malloc_internal(sizeof(header_info)); + size_t count, i; + + hi->mhdr = (const headerType *)image; + hi->info = sects->iiStart; + hi->allClassesRealized = NO; + hi->os.modules = sects->modStart ? (Module *)((void **)sects->modStart+1) : 0; + hi->os.moduleCount = (Module *)sects->modEnd - hi->os.modules; + hi->os.protocols = sects->protoStart ? (struct old_protocol **)((void **)sects->protoStart+1) : 0; + hi->os.protocolCount = (struct old_protocol **)sects->protoEnd - hi->os.protocols; + hi->os.imageinfo = NULL; + hi->os.imageinfoBytes = 0; + // hi->os.imageinfo = sects->iiStart ? (uint8_t *)((void **)sects->iiStart+1) : 0;; +// hi->os.imageinfoBytes = (uint8_t *)sects->iiEnd - hi->os.imageinfo; + hi->os.selrefs = sects->selrefsStart ? (SEL *)((void **)sects->selrefsStart+1) : 0; + hi->os.selrefCount = (SEL *)sects->selrefsEnd - hi->os.selrefs; + hi->os.clsrefs = sects->clsrefsStart ? (Class *)((void **)sects->clsrefsStart+1) : 0; + hi->os.clsrefCount = (Class *)sects->clsrefsEnd - hi->os.clsrefs; + + count = 0; + for (i = 0; i < hi->os.moduleCount; i++) { + if (hi->os.modules[i]) count++; + } + hi->mod_count = 0; + hi->mod_ptr = 0; + if (count > 0) { + hi->mod_ptr = malloc(count * sizeof(struct objc_module)); + for (i = 0; i < hi->os.moduleCount; i++) { + if (hi->os.modules[i]) memcpy(&hi->mod_ptr[hi->mod_count++], hi->os.modules[i], sizeof(struct objc_module)); + } + } + + _objc_appendHeader(hi); + + if (PrintImages) { + _objc_inform("IMAGES: loading image for %s%s%s\n", + _nameForHeader(hi->mhdr), + headerIsBundle(hi) ? " (bundle)" : "", + _objcHeaderIsReplacement(hi) ? " (replacement)":""); + } + + _read_images(&hi, 1); + + return hi; +} + +OBJC_EXPORT void _objc_load_image(HMODULE image, header_info *hinfo) +{ + prepare_load_methods(hinfo); + call_load_methods(); +} + +OBJC_EXPORT void _objc_unload_image(HMODULE image, header_info *hinfo) +{ + _objc_fatal("image unload not supported"); +} + + +// TARGET_OS_WIN32 +#elif TARGET_OS_MAC + +__private_extern__ void mutex_init(mutex_t *m) +{ + pthread_mutex_init(m, NULL); +} + + +__private_extern__ void recursive_mutex_init(recursive_mutex_t *m) +{ + // fixme error checking + pthread_mutex_t *newmutex; + + // Build recursive mutex attributes, if needed + static pthread_mutexattr_t *attr; + if (!attr) { + pthread_mutexattr_t *newattr = + _malloc_internal(sizeof(pthread_mutexattr_t)); + pthread_mutexattr_init(newattr); + pthread_mutexattr_settype(newattr, PTHREAD_MUTEX_RECURSIVE); + while (!attr) { + if (OSAtomicCompareAndSwapPtrBarrier(0, newattr, (void**)&attr)) { + // we win + goto attr_done; + } + } + // someone else built the attr first + _free_internal(newattr); + } + attr_done: + + // Build the mutex itself + newmutex = _malloc_internal(sizeof(pthread_mutex_t)); + pthread_mutex_init(newmutex, attr); + while (!m->mutex) { + if (OSAtomicCompareAndSwapPtrBarrier(0, newmutex, (void**)&m->mutex)) { + // we win + return; + } + } + + // someone else installed their mutex first + pthread_mutex_destroy(newmutex); +} + + +/*********************************************************************** +* bad_magic. +* Return YES if the header has invalid Mach-o magic. +**********************************************************************/ +__private_extern__ BOOL bad_magic(const headerType *mhdr) +{ + return (mhdr->magic != MH_MAGIC && mhdr->magic != MH_MAGIC_64 && + mhdr->magic != MH_CIGAM && mhdr->magic != MH_CIGAM_64); +} + + +static const segmentType * +getsegbynamefromheader(const headerType *head, const char *segname) +{ +#ifndef __LP64__ +#define SEGMENT_CMD LC_SEGMENT +#else +#define SEGMENT_CMD LC_SEGMENT_64 +#endif + const segmentType *sgp; + unsigned long i; + + sgp = (const segmentType *) (head + 1); + for (i = 0; i < head->ncmds; i++){ + if (sgp->cmd == SEGMENT_CMD) { + if (strncmp(sgp->segname, segname, sizeof(sgp->segname)) == 0) { + return sgp; + } + } + sgp = (const segmentType *)((char *)sgp + sgp->cmdsize); + } + return NULL; +#undef SEGMENT_CMD +} + + +static header_info * _objc_addHeader(const headerType *mhdr) +{ + size_t info_size = 0; + const segmentType *objc_segment; + const objc_image_info *image_info; + const segmentType *data_segment; + header_info *result; + ptrdiff_t image_slide; + + if (bad_magic(mhdr)) return NULL; + + // Weed out duplicates + for (result = FirstHeader; result; result = result->next) { + if (mhdr == result->mhdr) return NULL; + } + + // Locate the __OBJC segment + image_slide = _getImageSlide(mhdr); + image_info = _getObjcImageInfo(mhdr, image_slide, &info_size); + objc_segment = getsegbynamefromheader(mhdr, SEG_OBJC); + data_segment = getsegbynamefromheader(mhdr, SEG_DATA); + if (!objc_segment && !image_info) return NULL; + + // Allocate a header_info entry. + result = _calloc_internal(sizeof(header_info), 1); + + // Set up the new header_info entry. + result->mhdr = mhdr; + result->os.image_slide = image_slide; + result->os.objcSegmentHeader = objc_segment; + result->os.dataSegmentHeader = data_segment; +#if !__OBJC2__ + // mhdr and image_slide must already be set + result->mod_count = 0; + result->mod_ptr = _getObjcModules(result, &result->mod_count); +#endif + result->info = image_info; + dladdr(result->mhdr, &result->os.dl_info); + result->allClassesRealized = NO; + + // dylibs are not allowed to unload + // ...except those with image_info and nothing else (5359412) + if (result->mhdr->filetype == MH_DYLIB && _hasObjcContents(result)) { + dlopen(result->os.dl_info.dli_fname, RTLD_NOLOAD); + } + + // Make sure every copy of objc_image_info in this image is the same. + // This means same version and same bitwise contents. + if (result->info) { + const objc_image_info *start = result->info; + const objc_image_info *end = + (objc_image_info *)(info_size + (uint8_t *)start); + const objc_image_info *info = start; + while (info < end) { + // version is byte size, except for version 0 + size_t struct_size = info->version; + if (struct_size == 0) struct_size = 2 * sizeof(uint32_t); + if (info->version != start->version || + 0 != memcmp(info, start, struct_size)) + { + _objc_inform("'%s' has inconsistently-compiled Objective-C " + "code. Please recompile all code in it.", + _nameForHeader(mhdr)); + } + info = (objc_image_info *)(struct_size + (uint8_t *)info); + } + } + + _objc_appendHeader(result); + + return result; +} + + +#ifndef NO_GC + +/*********************************************************************** +* _gcForHInfo. +**********************************************************************/ +__private_extern__ const char *_gcForHInfo(const header_info *hinfo) +{ + if (_objcHeaderRequiresGC(hinfo)) return "requires GC"; + else if (_objcHeaderSupportsGC(hinfo)) return "supports GC"; + else return "does not support GC"; +} +__private_extern__ const char *_gcForHInfo2(const header_info *hinfo) +{ + if (_objcHeaderRequiresGC(hinfo)) return " (requires GC)"; + else if (_objcHeaderSupportsGC(hinfo)) return " (supports GC)"; + else return ""; +} + + +/*********************************************************************** +* check_gc +* Check whether the executable supports or requires GC, and make sure +* all already-loaded libraries support the executable's GC mode. +* Returns TRUE if the executable wants GC on. +**********************************************************************/ +static BOOL check_wants_gc(void) +{ + const header_info *hi; + BOOL appWantsGC; + + // Environment variables can override the following. + if (DisableGC) { + _objc_inform("GC: forcing GC OFF because OBJC_DISABLE_GC is set"); + appWantsGC = NO; + } + else { + // Find the executable and check its GC bits. + // If the executable cannot be found, default to NO. + // (The executable will not be found if the executable contains + // no Objective-C code.) + appWantsGC = NO; + for (hi = FirstHeader; hi != NULL; hi = hi->next) { + if (hi->mhdr->filetype == MH_EXECUTE) { + appWantsGC = _objcHeaderSupportsGC(hi) ? YES : NO; + if (PrintGC) { + _objc_inform("GC: executable '%s' %s", + _nameForHeader(hi->mhdr), _gcForHInfo(hi)); + } + } + } + } + return appWantsGC; +} + + +/*********************************************************************** +* verify_gc_readiness +* if we want gc, verify that every header describes files compiled +* and presumably ready for gc. +************************************************************************/ +static void verify_gc_readiness(BOOL wantsGC, header_info **hList, + uint32_t hCount) +{ + BOOL busted = NO; + uint32_t i; + + // Find the libraries and check their GC bits against the app's request + for (i = 0; i < hCount; i++) { + header_info *hi = hList[i]; + if (hi->mhdr->filetype == MH_EXECUTE) { + continue; + } + else if (hi->mhdr == &_mh_dylib_header) { + // libobjc itself works with anything even though it is not + // compiled with -fobjc-gc (fixme should it be?) + } + else if (wantsGC && ! _objcHeaderSupportsGC(hi)) { + // App wants GC but library does not support it - bad + _objc_inform_now_and_on_crash + ("'%s' was not compiled with -fobjc-gc or -fobjc-gc-only, " + "but the application requires GC", + _nameForHeader(hi->mhdr)); + busted = YES; + } + else if (!wantsGC && _objcHeaderRequiresGC(hi)) { + // App doesn't want GC but library requires it - bad + _objc_inform_now_and_on_crash + ("'%s' was compiled with -fobjc-gc-only, " + "but the application does not support GC", + _nameForHeader(hi->mhdr)); + busted = YES; + } + + if (PrintGC) { + _objc_inform("GC: library '%s' %s", + _nameForHeader(hi->mhdr), _gcForHInfo(hi)); + } + } + + if (busted) { + // GC state is not consistent. + // Kill the process unless one of the forcing flags is set. + if (!DisableGC) { + _objc_fatal("*** GC capability of application and some libraries did not match"); + } + } +} + + +/*********************************************************************** +* gc_enforcer +* Make sure that images about to be loaded by dyld are GC-acceptable. +* Images linked to the executable are always permitted; they are +* enforced inside map_images() itself. +**********************************************************************/ +static BOOL InitialDyldRegistration = NO; +static const char *gc_enforcer(enum dyld_image_states state, + uint32_t infoCount, + const struct dyld_image_info info[]) +{ + uint32_t i; + + // Linked images get a free pass + if (InitialDyldRegistration) return NULL; + + if (PrintImages) { + _objc_inform("IMAGES: checking %d images for compatibility...", + infoCount); + } + + for (i = 0; i < infoCount; i++) { + const headerType *mhdr = (const headerType *)info[i].imageLoadAddress; + if (bad_magic(mhdr)) continue; + + objc_image_info *image_info; + size_t size; + + if (mhdr == &_mh_dylib_header) { + // libobjc itself - OK + continue; + } + +#if !__OBJC2__ + // 32-bit: __OBJC seg but no image_info means no GC support + if (!getsegbynamefromheader(mhdr, SEG_OBJC)) { + // not objc - assume OK + continue; + } + image_info = _getObjcImageInfo(mhdr, _getImageSlide(mhdr), &size); + if (!image_info) { + // No image_info - assume GC unsupported + if (!UseGC) { + // GC is OFF - ok + continue; + } else { + // GC is ON - bad + if (PrintImages || PrintGC) { + _objc_inform("IMAGES: rejecting %d images because %s doesn't support GC (no image_info)", infoCount, info[i].imageFilePath); + } + return "GC capability mismatch"; + } + } +#else + // 64-bit: no image_info means no objc at all + image_info = _getObjcImageInfo(mhdr, _getImageSlide(mhdr), &size); + if (!image_info) { + // not objc - assume OK + continue; + } +#endif + + if (UseGC && !_objcInfoSupportsGC(image_info)) { + // GC is ON, but image does not support GC + if (PrintImages || PrintGC) { + _objc_inform("IMAGES: rejecting %d images because %s doesn't support GC", infoCount, info[i].imageFilePath); + } + return "GC capability mismatch"; + } + if (!UseGC && _objcInfoRequiresGC(image_info)) { + // GC is OFF, but image requires GC + if (PrintImages || PrintGC) { + _objc_inform("IMAGES: rejecting %d images because %s requires GC", infoCount, info[i].imageFilePath); + } + return "GC capability mismatch"; + } + } + + return NULL; +} + +// !defined(NO_GC) +#endif + + +/*********************************************************************** +* map_images_nolock +* Process the given images which are being mapped in by dyld. +* All class registration and fixups are performed (or deferred pending +* discovery of missing superclasses etc), and +load methods are called. +* +* info[] is in bottom-up order i.e. libobjc will be earlier in the +* array than any library that links to libobjc. +* +* Locking: loadMethodLock(old) or runtimeLock(new) acquired by map_images. +**********************************************************************/ +__private_extern__ const char * +map_images_nolock(enum dyld_image_states state, uint32_t infoCount, + const struct dyld_image_info infoList[]) +{ + static BOOL firstTime = YES; + static BOOL wantsGC NOBSS = NO; + uint32_t i; + header_info *hi; + header_info *hList[infoCount]; + uint32_t hCount; + + // Perform first-time initialization if necessary. + // This function is called before ordinary library initializers. + // fixme defer initialization until an objc-using image is found? + if (firstTime) { +#ifndef NO_GC + InitialDyldRegistration = YES; + dyld_register_image_state_change_handler(dyld_image_state_mapped, 0 /* batch */, &gc_enforcer); + InitialDyldRegistration = NO; +#endif + } + + if (PrintImages) { + _objc_inform("IMAGES: processing %u newly-mapped images...\n", infoCount); + } + + + // Find all images with Objective-C metadata. + hCount = 0; + i = infoCount; + while (i--) { + const headerType *mhdr = (headerType *)infoList[i].imageLoadAddress; + + hi = _objc_addHeader(mhdr); + if (!hi) { + // no objc data in this entry + continue; + } + + hList[hCount++] = hi; + + + if (PrintImages) { + _objc_inform("IMAGES: loading image for %s%s%s%s%s\n", + _nameForHeader(mhdr), + mhdr->filetype == MH_BUNDLE ? " (bundle)" : "", + _objcHeaderIsReplacement(hi) ? " (replacement)" : "", + _objcHeaderOptimizedByDyld(hi)?" (preoptimized)" : "", + _gcForHInfo2(hi)); + } + } + + // Perform one-time runtime initialization that must be deferred until + // the executable itself is found. This needs to be done before + // further initialization. + // (The executable may not be present in this infoList if the + // executable does not contain Objective-C code but Objective-C + // is dynamically loaded later. In that case, check_wants_gc() + // will do the right thing.) +#ifndef NO_GC + if (firstTime) { + wantsGC = check_wants_gc(); + + verify_gc_readiness(wantsGC, hList, hCount); + + gc_init(wantsGC); // needs executable for GC decision + rtp_init(); // needs GC decision first + } else { + verify_gc_readiness(wantsGC, hList, hCount); + } + + if (wantsGC) { + // tell the collector about the data segment ranges. + for (i = 0; i < hCount; ++i) { + hi = hList[i]; + const segmentType *dataSegment = hi->os.dataSegmentHeader; + const segmentType *objcSegment = hi->os.objcSegmentHeader; + if (dataSegment) { + gc_register_datasegment(dataSegment->vmaddr + hi->os.image_slide, dataSegment->vmsize); + } + if (objcSegment) { + // __OBJC contains no GC data, but pointers to it are + // used as associated reference values (rdar://6953570) + gc_register_datasegment(objcSegment->vmaddr + hi->os.image_slide, objcSegment->vmsize); + } + } + } +#endif + + if (firstTime) { + extern SEL FwdSel; // in objc-msg-*.s + sel_init(wantsGC); + FwdSel = sel_registerName("forward::"); + } + + _read_images(hList, hCount); + + firstTime = NO; + + return NULL; +} + + +/*********************************************************************** +* load_images_nolock +* Prepares +load in the given images which are being mapped in by dyld. +* Returns YES if there are now +load methods to be called by call_load_methods. +* +* Locking: loadMethodLock(both) and runtimeLock(new) acquired by load_images +**********************************************************************/ +__private_extern__ BOOL +load_images_nolock(enum dyld_image_states state,uint32_t infoCount, + const struct dyld_image_info infoList[]) +{ + BOOL found = NO; + uint32_t i; + + i = infoCount; + while (i--) { + header_info *hi; + for (hi = FirstHeader; hi != NULL; hi = hi->next) { + const headerType *mhdr = (headerType*)infoList[i].imageLoadAddress; + if (hi->mhdr == mhdr) { + prepare_load_methods(hi); + found = YES; + } + } + } + + return found; +} + + +/*********************************************************************** +* unmap_image_nolock +* Process the given image which is about to be unmapped by dyld. +* mh is mach_header instead of headerType because that's what +* dyld_priv.h says even for 64-bit. +* +* Locking: loadMethodLock(both) and runtimeLock(new) acquired by unmap_image. +**********************************************************************/ +__private_extern__ void +unmap_image_nolock(const struct mach_header *mh, intptr_t vmaddr_slide) +{ + if (PrintImages) { + _objc_inform("IMAGES: processing 1 newly-unmapped image...\n"); + } + + header_info *hi; + + // Find the runtime's header_info struct for the image + for (hi = FirstHeader; hi != NULL; hi = hi->next) { + if (hi->mhdr == (const headerType *)mh) { + break; + } + } + + if (!hi) return; + + if (PrintImages) { + _objc_inform("IMAGES: unloading image for %s%s%s%s\n", + _nameForHeader(hi->mhdr), + hi->mhdr->filetype == MH_BUNDLE ? " (bundle)" : "", + _objcHeaderIsReplacement(hi) ? " (replacement)" : "", + _gcForHInfo2(hi)); + } + +#ifndef NO_GC + if (UseGC) { + const segmentType *dataSegment = hi->os.dataSegmentHeader; + const segmentType *objcSegment = hi->os.objcSegmentHeader; + if (dataSegment) { + gc_unregister_datasegment(dataSegment->vmaddr + hi->os.image_slide, dataSegment->vmsize); + } + if (objcSegment) { + gc_unregister_datasegment(objcSegment->vmaddr + hi->os.image_slide, objcSegment->vmsize); + } + } +#endif + + _unload_image(hi); + + // Remove header_info from header list + _objc_removeHeader(hi); + _free_internal(hi); +} + + +/*********************************************************************** +* _objc_init +* Static initializer. Registers our image notifier with dyld. +**********************************************************************/ +static __attribute__((constructor)) +void _objc_init(void) +{ + // fixme defer initialization until an objc-using image is found? + environ_init(); + tls_init(); + lock_init(); + exception_init(); + + // Register for unmap first, in case some +load unmaps something + _dyld_register_func_for_remove_image(&unmap_image); + dyld_register_image_state_change_handler(dyld_image_state_bound, + 1/*batch*/, &map_images); + dyld_register_image_state_change_handler(dyld_image_state_dependents_initialized, 0/*not batch*/, &load_images); +} + + +/*********************************************************************** +* _headerForAddress. +* addr can be a class or a category +**********************************************************************/ +static const header_info *_headerForAddress(void *addr) +{ + unsigned long size; + unsigned long seg; + header_info * hi; + + // Check all headers in the vector + for (hi = FirstHeader; hi != NULL; hi = hi->next) + { + // Locate header data, if any + const segmentType *segHeader; +#if __OBJC2__ + segHeader = hi->os.dataSegmentHeader; +#else + segHeader = hi->os.objcSegmentHeader; +#endif + if (!segHeader) continue; + seg = segHeader->vmaddr + hi->os.image_slide; + size = segHeader->filesize; + + // Is the class in this header? + if ((seg <= (unsigned long) addr) && + ((unsigned long) addr < (seg + size))) + return hi; + } + + // Not found + return 0; +} + + +/*********************************************************************** +* _headerForClass +* Return the image header containing this class, or NULL. +* Returns NULL on runtime-constructed classes, and the NSCF classes. +**********************************************************************/ +__private_extern__ const header_info *_headerForClass(Class cls) +{ + return _headerForAddress(cls); +} + + +/********************************************************************** +* secure_open +* Securely open a file from a world-writable directory (like /tmp) +* If the file does not exist, it will be atomically created with mode 0600 +* If the file exists, it must be, and remain after opening: +* 1. a regular file (in particular, not a symlink) +* 2. owned by euid +* 3. permissions 0600 +* 4. link count == 1 +* Returns a file descriptor or -1. Errno may or may not be set on error. +**********************************************************************/ +__private_extern__ int secure_open(const char *filename, int flags, uid_t euid) +{ + struct stat fs, ls; + int fd = -1; + BOOL truncate = NO; + BOOL create = NO; + + if (flags & O_TRUNC) { + // Don't truncate the file until after it is open and verified. + truncate = YES; + flags &= ~O_TRUNC; + } + if (flags & O_CREAT) { + // Don't create except when we're ready for it + create = YES; + flags &= ~O_CREAT; + flags &= ~O_EXCL; + } + + if (lstat(filename, &ls) < 0) { + if (errno == ENOENT && create) { + // No such file - create it + fd = open(filename, flags | O_CREAT | O_EXCL, 0600); + if (fd >= 0) { + // File was created successfully. + // New file does not need to be truncated. + return fd; + } else { + // File creation failed. + return -1; + } + } else { + // lstat failed, or user doesn't want to create the file + return -1; + } + } else { + // lstat succeeded - verify attributes and open + if (S_ISREG(ls.st_mode) && // regular file? + ls.st_nlink == 1 && // link count == 1? + ls.st_uid == euid && // owned by euid? + (ls.st_mode & ALLPERMS) == (S_IRUSR | S_IWUSR)) // mode 0600? + { + // Attributes look ok - open it and check attributes again + fd = open(filename, flags, 0000); + if (fd >= 0) { + // File is open - double-check attributes + if (0 == fstat(fd, &fs) && + fs.st_nlink == ls.st_nlink && // link count == 1? + fs.st_uid == ls.st_uid && // owned by euid? + fs.st_mode == ls.st_mode && // regular file, 0600? + fs.st_ino == ls.st_ino && // same inode as before? + fs.st_dev == ls.st_dev) // same device as before? + { + // File is open and OK + if (truncate) ftruncate(fd, 0); + return fd; + } else { + // Opened file looks funny - close it + close(fd); + return -1; + } + } else { + // File didn't open + return -1; + } + } else { + // Unopened file looks funny - don't open it + return -1; + } + } +} + + +/*********************************************************************** +* _objc_internal_zone. +* Malloc zone for internal runtime data. +* By default this is the default malloc zone, but a dedicated zone is +* used if environment variable OBJC_USE_INTERNAL_ZONE is set. +**********************************************************************/ +__private_extern__ malloc_zone_t *_objc_internal_zone(void) +{ + static malloc_zone_t *z = (malloc_zone_t *)-1; + if (z == (malloc_zone_t *)-1) { + if (UseInternalZone) { + z = malloc_create_zone(vm_page_size, 0); + malloc_set_zone_name(z, "ObjC"); + } else { + z = malloc_default_zone(); + } + } + return z; +} + + +// TARGET_OS_MAC +#else + + +#error unknown OS + + +#endif diff --git a/runtime/objc-private.h b/runtime/objc-private.h index 3bbfc69..b147f1a 100644 --- a/runtime/objc-private.h +++ b/runtime/objc-private.h @@ -25,28 +25,60 @@ * Copyright 1988-1996, NeXT Software, Inc. */ -#if !defined(_OBJC_PRIVATE_H_) +#ifndef _OBJC_PRIVATE_H_ #define _OBJC_PRIVATE_H_ -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import - -#import "objc.h" -#import "runtime.h" -#import "maptable.h" -#import "auto_zone.h" +#include "objc-os.h" + +#include "objc.h" +#include "runtime.h" +#include "maptable.h" +#include "hashtable2.h" +#include "objc-api.h" +#include "objc-config.h" +#include "objc-rtp.h" +#include "objc-references.h" +#include "objc-initialize.h" +#include "objc-loadmethod.h" +#include "objc-internal.h" + +#include "objc-auto.h" + +#define __APPLE_API_PRIVATE +#include "objc-gdb.h" +#undef __APPLE_API_PRIVATE + +/* Do not include message.h here. */ +/* #include "message.h" */ + + +__BEGIN_DECLS + +#if defined(OBJC_NO_GC) != defined(NO_GC) +# error OBJC_NO_GC and NO_GC inconsistent +#endif + +#ifndef NO_GC +# include + extern BOOL UseGC; // equivalent to calling objc_collecting_enabled() + extern auto_zone_t *gc_zone; // the GC zone, or NULL if no GC + extern void objc_addRegisteredClass(Class c); + extern void objc_removeRegisteredClass(Class c); +#else +# define UseGC NO +# define gc_zone NULL +# define objc_assign_ivar_internal objc_assign_ivar +# define objc_addRegisteredClass(c) do {} while(0) +# define objc_removeRegisteredClass(c) do {} while(0) + /* Uses of the following must be protected with UseGC. */ + extern id gc_unsupported_dont_call(); +# define auto_zone_allocate_object gc_unsupported_dont_call +# define auto_zone_retain gc_unsupported_dont_call +# define auto_zone_release gc_unsupported_dont_call +# define auto_zone_is_valid_pointer gc_unsupported_dont_call +# define auto_zone_write_barrier_memmove gc_unsupported_dont_call +# define AUTO_OBJECT_SCANNED 0 +#endif struct old_category; struct old_method_list; @@ -122,9 +154,6 @@ struct old_method { IMP method_imp; }; -// Fixed-up method lists get mlist->obsolete = _OBJC_FIXED_UP. -#define _OBJC_FIXED_UP ((void *)1771) - struct old_method_list { struct old_method_list *obsolete; @@ -172,37 +201,6 @@ struct objc_property_list { struct objc_property first; }; - -#import "objc-api.h" -#import "objc-config.h" -#import "hashtable2.h" - -#import "Object.h" - -#define mutex_alloc() (pthread_mutex_t*)calloc(1, sizeof(pthread_mutex_t)) -#define mutex_init(m) pthread_mutex_init(m, NULL) -#define mutex_lock(m) pthread_mutex_lock(m) -#define mutex_try_lock(m) (! pthread_mutex_trylock(m)) -#define mutex_unlock(m) pthread_mutex_unlock(m) -#define mutex_clear(m) -#define mutex_t pthread_mutex_t* -#define mutex MUTEX_DEFINE_ERROR - - -/* Opaque cookie used in _getObjc... routines. File format independant. - * This is used in place of the mach_header. In fact, when compiling - * for NEXTSTEP, this is really a (struct mach_header *). - * - * had been: typedef void *objc_header; - */ -#ifndef __LP64__ -typedef struct mach_header headerType; -typedef struct segment_command segmentType; -#else -typedef struct mach_header_64 headerType; -typedef struct segment_command_64 segmentType; -#endif - typedef struct { uint32_t version; // currently 0 uint32_t flags; @@ -212,6 +210,7 @@ typedef struct { #define OBJC_IMAGE_IS_REPLACEMENT (1<<0) #define OBJC_IMAGE_SUPPORTS_GC (1<<1) #define OBJC_IMAGE_REQUIRES_GC (1<<2) +#define OBJC_IMAGE_OPTIMIZED_BY_DYLD (1<<3) #define _objcHeaderIsReplacement(h) ((h)->info && ((h)->info->flags & OBJC_IMAGE_IS_REPLACEMENT)) @@ -239,31 +238,42 @@ typedef struct { if executable image compiled this way, then all subsequent libraries etc. must also be this way */ +#define _objcHeaderOptimizedByDyld(h) ((h)->info && ((h)->info->flags & OBJC_IMAGE_OPTIMIZED_BY_DYLD)) + +/* OBJC_IMAGE_OPTIMIZED_BY_DYLD: + Assorted metadata precooked in the dyld shared cache. + Never set for images outside the shared cache file itself. +*/ + -typedef struct _header_info -{ +typedef struct _header_info { struct _header_info *next; const headerType * mhdr; - ptrdiff_t image_slide; - const segmentType * objcSegmentHeader; - const segmentType * dataSegmentHeader; struct objc_module *mod_ptr; size_t mod_count; const objc_image_info *info; - Dl_info dl_info; BOOL allClassesRealized; + os_header_info os; } header_info; +extern header_info *FirstHeader; +extern header_info *LastHeader; +extern int HeaderCount; + +extern void _objc_appendHeader(header_info *hi); +extern void _objc_removeHeader(header_info *hi); +extern const char *_nameForHeader(const headerType*); extern objc_image_info *_getObjcImageInfo(const headerType *head, ptrdiff_t slide, size_t *size); -extern const segmentType *getsegbynamefromheader(const headerType *head, const char *segname); extern const char *_getObjcHeaderName(const headerType *head); extern ptrdiff_t _getImageSlide(const headerType *header); -extern Module _getObjcModules(const headerType *head, ptrdiff_t slide, size_t *count); + +extern Module _getObjcModules(const header_info *hi, size_t *count); extern SEL *_getObjcSelectorRefs(const header_info *hi, size_t *count); +extern BOOL _hasObjcContents(const header_info *hi); #if !__OBJC2__ -extern struct old_protocol *_getObjcProtocols(const header_info *head, size_t *count); +extern struct old_protocol **_getObjcProtocols(const header_info *head, size_t *count); extern struct old_class **_getObjcClassRefs(const header_info *hi, size_t *count); extern const char *_getObjcClassNames(const header_info *hi, size_t *size); #endif @@ -282,59 +292,80 @@ extern struct protocol_t **_getObjc2ProtocolRefs(const header_info *head, size_t #define END_OF_METHODS_LIST ((struct old_method_list*)-1) -OBJC_EXPORT header_info *_objc_headerStart (); -OBJC_EXPORT const char *_nameForHeader(const headerType*); +/* selectors */ +extern void sel_init(BOOL gc); +extern SEL sel_registerNameNoLock(const char *str, BOOL copy); +extern void sel_lock(void); +extern void sel_unlock(void); +extern BOOL sel_preoptimizationValid(const header_info *hi); +extern void disableSelectorPreoptimization(void); + +extern SEL SEL_load; +extern SEL SEL_initialize; +extern SEL SEL_resolveClassMethod; +extern SEL SEL_resolveInstanceMethod; +extern SEL SEL_cxx_construct; +extern SEL SEL_cxx_destruct; +extern SEL SEL_retain; +extern SEL SEL_release; +extern SEL SEL_autorelease; +extern SEL SEL_copy; +extern SEL SEL_finalize; -OBJC_EXPORT SEL sel_registerNameNoLock(const char *str, BOOL copy); -OBJC_EXPORT void sel_lock(void); -OBJC_EXPORT void sel_unlock(void); /* optional malloc zone for runtime data */ -OBJC_EXPORT malloc_zone_t *_objc_internal_zone(void); -OBJC_EXPORT void *_malloc_internal(size_t size); -OBJC_EXPORT void *_calloc_internal(size_t count, size_t size); -OBJC_EXPORT void *_realloc_internal(void *ptr, size_t size); -OBJC_EXPORT char *_strdup_internal(const char *str); -OBJC_EXPORT char *_strdupcat_internal(const char *s1, const char *s2); -OBJC_EXPORT void *_memdup_internal(const void *mem, size_t size); -OBJC_EXPORT void _free_internal(void *ptr); +extern malloc_zone_t *_objc_internal_zone(void); +extern void *_malloc_internal(size_t size); +extern void *_calloc_internal(size_t count, size_t size); +extern void *_realloc_internal(void *ptr, size_t size); +extern char *_strdup_internal(const char *str); +extern char *_strdupcat_internal(const char *s1, const char *s2); +extern void *_memdup_internal(const void *mem, size_t size); +extern void _free_internal(void *ptr); + +extern Class _calloc_class(size_t size); #if !__OBJC2__ -OBJC_EXPORT Class objc_getOrigClass (const char *name); -OBJC_EXPORT IMP lookupNamedMethodInMethodList(struct old_method_list *mlist, const char *meth_name); -OBJC_EXPORT void _objc_insertMethods(struct old_class *cls, struct old_method_list *mlist, struct old_category *cat); -OBJC_EXPORT void _objc_removeMethods(struct old_class *cls, struct old_method_list *mlist); -OBJC_EXPORT void _objc_flush_caches (Class cls); +extern Class objc_getOrigClass (const char *name); +extern IMP lookupNamedMethodInMethodList(struct old_method_list *mlist, const char *meth_name); +extern void _objc_insertMethods(struct old_class *cls, struct old_method_list *mlist, struct old_category *cat); +extern void _objc_removeMethods(struct old_class *cls, struct old_method_list *mlist); +extern void _objc_flush_caches (Class cls); extern void _class_addProperties(struct old_class *cls, struct objc_property_list *additions); extern void change_class_references(struct old_class *imposter, struct old_class *original, struct old_class *copy, BOOL changeSuperRefs); extern void flush_marked_caches(void); extern void set_superclass(struct old_class *cls, struct old_class *supercls); #endif -OBJC_EXPORT IMP _cache_getImp(Class cls, SEL sel); -OBJC_EXPORT Method _cache_getMethod(Class cls, SEL sel, IMP objc_msgForward_imp); +extern IMP lookUpMethod(Class, SEL, BOOL initialize, BOOL cache); +extern void lockForMethodLookup(void); +extern void unlockForMethodLookup(void); +extern IMP prepareForMethodLookup(Class cls, SEL sel, BOOL initialize); + +extern IMP _cache_getImp(Class cls, SEL sel); +extern Method _cache_getMethod(Class cls, SEL sel, IMP objc_msgForward_internal_imp); /* message dispatcher */ -OBJC_EXPORT IMP _class_lookupMethodAndLoadCache(Class, SEL); -OBJC_EXPORT id _objc_msgForward (id self, SEL sel, ...); +extern IMP _class_lookupMethodAndLoadCache(Class, SEL); +extern id _objc_msgForward_internal(id self, SEL sel, ...); extern id _objc_ignored_method(id self, SEL _cmd); /* errors */ -OBJC_EXPORT void _objc_fatal(const char *fmt, ...) __attribute__((noreturn, format (printf, 1, 2))); -OBJC_EXPORT void __objc_error(id, const char *, ...) __attribute__((format (printf, 2, 3))); -OBJC_EXPORT void _objc_inform(const char *fmt, ...) __attribute__((format (printf, 1, 2))); -OBJC_EXPORT void _objc_inform_on_crash(const char *fmt, ...) __attribute__((format (printf, 1, 2))); -OBJC_EXPORT void _objc_inform_now_and_on_crash(const char *fmt, ...) __attribute__((format (printf, 1, 2))); -OBJC_EXPORT void _objc_warn_deprecated(const char *old, const char *new) __attribute__((noinline)); -OBJC_EXPORT void _objc_error(id, const char *, va_list); +extern void __objc_error(id, const char *, ...) __attribute__((format (printf, 2, 3))); +extern void _objc_inform(const char *fmt, ...) __attribute__((format (printf, 1, 2))); +extern void _objc_inform_on_crash(const char *fmt, ...) __attribute__((format (printf, 1, 2))); +extern void _objc_inform_now_and_on_crash(const char *fmt, ...) __attribute__((format (printf, 1, 2))); +extern void _objc_warn_deprecated(const char *oldname, const char *newname) __attribute__((noinline)); +extern void _objc_error(id, const char *, va_list); +extern void inform_duplicate(const char *name, Class oldCls, Class cls); /* magic */ -OBJC_EXPORT Class _objc_getFreedObjectClass (void); +extern Class _objc_getFreedObjectClass (void); #ifndef OBJC_INSTRUMENTED -OBJC_EXPORT const struct objc_cache _objc_empty_cache; +extern const struct objc_cache _objc_empty_cache; #else -OBJC_EXPORT struct objc_cache _objc_empty_cache; +extern struct objc_cache _objc_empty_cache; #endif #if __OBJC2__ extern IMP _objc_empty_vtable[128]; @@ -345,55 +376,177 @@ extern void *NXMapKeyCopyingInsert(NXMapTable *table, const void *key, const voi extern void *NXMapKeyFreeingRemove(NXMapTable *table, const void *key); /* locking */ -#define OBJC_DECLARE_LOCK(MTX) pthread_mutex_t MTX = PTHREAD_MUTEX_INITIALIZER -#ifdef NDEBUG -#define OBJC_LOCK(MUTEX) mutex_lock (MUTEX) -#define OBJC_UNLOCK(MUTEX) mutex_unlock (MUTEX) -#define OBJC_CHECK_LOCKED(MUTEX) do { } while (0) -#define OBJC_CHECK_UNLOCKED(MUTEX) do { } while (0) +/* Every lock used anywhere must be declared here. + * Locks not declared here may cause gdb deadlocks. */ +extern void lock_init(void); +extern rwlock_t selLock; +extern mutex_t cacheUpdateLock; +extern recursive_mutex_t loadMethodLock; +#if __OBJC2__ +extern rwlock_t runtimeLock; #else -#define OBJC_LOCK(MUTEX) _lock_debug (MUTEX, #MUTEX) -#define OBJC_UNLOCK(MUTEX) _unlock_debug (MUTEX, #MUTEX) -#define OBJC_CHECK_LOCKED(MUTEX) _checklock_debug (MUTEX, #MUTEX) -#define OBJC_CHECK_UNLOCKED(MUTEX) _checkunlock_debug (MUTEX, #MUTEX) +extern mutex_t classLock; +extern mutex_t methodListLock; #endif -OBJC_EXPORT pthread_mutex_t classLock; -OBJC_EXPORT pthread_mutex_t methodListLock; +/* Debugger mode for gdb */ +#define DEBUGGER_OFF 0 +#define DEBUGGER_PARTIAL 1 +#define DEBUGGER_FULL 2 +extern int startDebuggerMode(void); +extern void endDebuggerMode(void); + +#if defined(NDEBUG) || TARGET_OS_WIN32 + +#define _destroyLockList(x) do { } while (0) + +#define mutex_lock(m) _mutex_lock_nodebug(m) +#define mutex_try_lock(m) _mutex_try_lock_nodebug(m) +#define mutex_unlock(m) _mutex_unlock_nodebug(m) +#define mutex_assert_locked(m) do { } while (0) +#define mutex_assert_unlocked(m) do { } while (0) + +#define recursive_mutex_lock(m) _recursive_mutex_lock_nodebug(m) +#define recursive_mutex_try_lock(m) _recursive_mutex_try_lock_nodebug(m) +#define recursive_mutex_unlock(m) _recursive_mutex_unlock_nodebug(m) +#define recursive_mutex_assert_locked(m) do { } while (0) +#define recursive_mutex_assert_unlocked(m) do { } while (0) + +#define monitor_enter(m) _monitor_enter_nodebug(m) +#define monitor_exit(m) _monitor_exit_nodebug(m) +#define monitor_wait(m) _monitor_wait_nodebug(m) +#define monitor_assert_locked(m) do { } while (0) +#define monitor_assert_unlocked(m) do { } while (0) + +#define rwlock_read(m) _rwlock_read_nodebug(m) +#define rwlock_write(m) _rwlock_write_nodebug(m) +#define rwlock_try_read(m) _rwlock_try_read_nodebug(m) +#define rwlock_try_write(m) _rwlock_try_write_nodebug(m) +#define rwlock_unlock_read(m) _rwlock_unlock_read_nodebug(m) +#define rwlock_unlock_write(m) _rwlock_unlock_write_nodebug(m) +#define rwlock_assert_reading(m) do { } while (0) +#define rwlock_assert_writing(m) do { } while (0) +#define rwlock_assert_locked(m) do { } while (0) +#define rwlock_assert_unlocked(m) do { } while (0) + +#else -OBJC_EXPORT NXHashTable *class_hash; +struct _objc_lock_list; +extern void _destroyLockList(struct _objc_lock_list *locks); +extern int _mutex_lock_debug(mutex_t *lock, const char *name); +extern int _mutex_try_lock_debug(mutex_t *lock, const char *name); +extern int _mutex_unlock_debug(mutex_t *lock, const char *name); +extern void _mutex_assert_locked_debug(mutex_t *lock, const char *name); +extern void _mutex_assert_unlocked_debug(mutex_t *lock, const char *name); + +extern int _recursive_mutex_lock_debug(recursive_mutex_t *lock, const char *name); +extern int _recursive_mutex_try_lock_debug(recursive_mutex_t *lock, const char *name); +extern int _recursive_mutex_unlock_debug(recursive_mutex_t *lock, const char *name); +extern void _recursive_mutex_assert_locked_debug(recursive_mutex_t *lock, const char *name); +extern void _recursive_mutex_assert_unlocked_debug(recursive_mutex_t *lock, const char *name); + +extern int _monitor_enter_debug(monitor_t *lock, const char *name); +extern int _monitor_exit_debug(monitor_t *lock, const char *name); +extern int _monitor_wait_debug(monitor_t *lock, const char *name); +extern void _monitor_assert_locked_debug(monitor_t *lock, const char *name); +extern void _monitor_assert_unlocked_debug(monitor_t *lock, const char *name); + +extern void _rwlock_read_debug(rwlock_t *l, const char *name); +extern void _rwlock_write_debug(rwlock_t *l, const char *name); +extern int _rwlock_try_read_debug(rwlock_t *l, const char *name); +extern int _rwlock_try_write_debug(rwlock_t *l, const char *name); +extern void _rwlock_unlock_read_debug(rwlock_t *l, const char *name); +extern void _rwlock_unlock_write_debug(rwlock_t *l, const char *name); +extern void _rwlock_assert_reading_debug(rwlock_t *l, const char *name); +extern void _rwlock_assert_writing_debug(rwlock_t *l, const char *name); +extern void _rwlock_assert_locked_debug(rwlock_t *l, const char *name); +extern void _rwlock_assert_unlocked_debug(rwlock_t *l, const char *name); + +#define mutex_lock(m) _mutex_lock_debug (m, #m) +#define mutex_try_lock(m) _mutex_try_lock_debug (m, #m) +#define mutex_unlock(m) _mutex_unlock_debug (m, #m) +#define mutex_assert_locked(m) _mutex_assert_locked_debug (m, #m) +#define mutex_assert_unlocked(m) _mutex_assert_unlocked_debug (m, #m) + +#define recursive_mutex_lock(m) _recursive_mutex_lock_debug (m, #m) +#define recursive_mutex_try_lock(m) _recursive_mutex_try_lock_debug (m, #m) +#define recursive_mutex_unlock(m) _recursive_mutex_unlock_debug (m, #m) +#define recursive_mutex_assert_locked(m) _recursive_mutex_assert_locked_debug (m, #m) +#define recursive_mutex_assert_unlocked(m) _recursive_mutex_assert_unlocked_debug (m, #m) + +#define monitor_enter(m) _monitor_enter_debug(m, #m) +#define monitor_exit(m) _monitor_exit_debug(m, #m) +#define monitor_wait(m) _monitor_wait_debug(m, #m) +#define monitor_assert_locked(m) _monitor_assert_locked_debug(m, #m) +#define monitor_assert_unlocked(m) _monitor_assert_unlocked_debug(m, #m) + +#define rwlock_read(m) _rwlock_read_debug(m, #m) +#define rwlock_write(m) _rwlock_write_debug(m, #m) +#define rwlock_try_read(m) _rwlock_try_read_debug(m, #m) +#define rwlock_try_write(m) _rwlock_try_write_debug(m, #m) +#define rwlock_unlock_read(m) _rwlock_unlock_read_debug(m, #m) +#define rwlock_unlock_write(m) _rwlock_unlock_write_debug(m, #m) +#define rwlock_assert_reading(m) _rwlock_assert_reading_debug(m, #m) +#define rwlock_assert_writing(m) _rwlock_assert_writing_debug(m, #m) +#define rwlock_assert_locked(m) _rwlock_assert_locked_debug(m, #m) +#define rwlock_assert_unlocked(m) _rwlock_assert_unlocked_debug(m, #m) + +#endif + +#define rwlock_unlock(m, s) \ + do { \ + if ((s) == RDONLY) rwlock_unlock_read(m); \ + else if ((s) == RDWR) rwlock_unlock_write(m); \ + } while (0) + + +extern NXHashTable *class_hash; + +#if !TARGET_OS_WIN32 /* nil handler object */ -OBJC_EXPORT id _objc_nilReceiver; -OBJC_EXPORT id _objc_setNilReceiver(id newNilReceiver); -OBJC_EXPORT id _objc_getNilReceiver(void); +extern id _objc_nilReceiver; +extern id _objc_setNilReceiver(id newNilReceiver); +extern id _objc_getNilReceiver(void); +#endif /* forward handler functions */ -OBJC_EXPORT void *_objc_forward_handler; -OBJC_EXPORT void *_objc_forward_stret_handler; - -/* C++ interoperability */ -OBJC_EXPORT SEL cxx_construct_sel; -OBJC_EXPORT SEL cxx_destruct_sel; -OBJC_EXPORT const char *cxx_construct_name; -OBJC_EXPORT const char *cxx_destruct_name; +extern void *_objc_forward_handler; +extern void *_objc_forward_stret_handler; /* GC and RTP startup */ -OBJC_EXPORT void gc_init(BOOL on); -OBJC_EXPORT void rtp_init(void); +extern void gc_init(BOOL on); +extern void rtp_init(void); /* Exceptions */ struct alt_handler_list; -OBJC_EXPORT void exception_init(void); -OBJC_EXPORT void _destroyAltHandlerList(struct alt_handler_list *list); +extern void exception_init(void); +extern void _destroyAltHandlerList(struct alt_handler_list *list); + +/* Class change notifications (gdb only for now) */ +#define OBJC_CLASS_ADDED (1<<0) +#define OBJC_CLASS_REMOVED (1<<1) +#define OBJC_CLASS_IVARS_CHANGED (1<<2) +#define OBJC_CLASS_METHODS_CHANGED (1<<3) +extern void gdb_objc_class_changed(Class cls, unsigned long changes, const char *classname) + __attribute__((noinline)); /* Write barrier implementations */ -OBJC_EXPORT id objc_assign_strongCast_gc(id val, id *dest); -OBJC_EXPORT id objc_assign_global_gc(id val, id *dest); -OBJC_EXPORT id objc_assign_ivar_gc(id value, id dest, ptrdiff_t offset); -OBJC_EXPORT id objc_assign_strongCast_non_gc(id value, id *dest); -OBJC_EXPORT id objc_assign_global_non_gc(id value, id *dest); -OBJC_EXPORT id objc_assign_ivar_non_gc(id value, id dest, ptrdiff_t offset); +extern id objc_assign_strongCast_non_gc(id value, id *dest); +extern id objc_assign_global_non_gc(id value, id *dest); +extern id objc_assign_ivar_non_gc(id value, id dest, ptrdiff_t offset); +extern id objc_assign_strongCast_gc(id val, id *dest); +extern id objc_assign_global_gc(id val, id *dest); +extern id objc_assign_ivar_gc(id value, id dest, ptrdiff_t offset); + +#ifndef NO_GC + +/* GC weak reference fixup. */ +extern void gc_fixup_weakreferences(id newObject, id oldObject); + +/* GC datasegment registration. */ +extern void gc_register_datasegment(uintptr_t base, size_t size); +extern void gc_unregister_datasegment(uintptr_t base, size_t size); /* objc_assign_ivar, objc_assign_global, and objc_assign_strongCast MUST NOT be called directly @@ -405,11 +558,13 @@ OBJC_EXPORT id objc_assign_ivar_non_gc(id value, id dest, ptrdiff_t offset); extern id (*objc_assign_ivar_internal)(id, id, ptrdiff_t); +#endif + /* Code modification */ -OBJC_EXPORT size_t objc_branch_size(void *entry, void *target); -OBJC_EXPORT size_t objc_write_branch(void *entry, void *target); -OBJC_EXPORT size_t objc_cond_branch_size(void *entry, void *target, unsigned cond); -OBJC_EXPORT size_t objc_write_cond_branch(void *entry, void *target, unsigned cond); +extern size_t objc_branch_size(void *entry, void *target); +extern size_t objc_write_branch(void *entry, void *target); +extern size_t objc_cond_branch_size(void *entry, void *target, unsigned cond); +extern size_t objc_write_cond_branch(void *entry, void *target, unsigned cond); #if defined(__ppc__) || defined(__ppc64__) #define COND_ALWAYS 0x02800000 /* BO=10100, BI=00000 */ #define COND_NE 0x00820000 /* BO=00100, BI=00010 */ @@ -421,56 +576,60 @@ OBJC_EXPORT size_t objc_write_cond_branch(void *entry, void *target, unsigned co /* Thread-safe info field */ #if !__OBJC2__ -OBJC_EXPORT void _class_setInfo(Class cls, long set); -OBJC_EXPORT void _class_clearInfo(Class cls, long clear); -OBJC_EXPORT void _class_changeInfo(Class cls, long set, long clear); +extern void _class_setInfo(Class cls, long set); +extern void _class_clearInfo(Class cls, long clear); +extern void _class_changeInfo(Class cls, long set, long clear); #endif -/* Secure /tmp usage */ -OBJC_EXPORT int secure_open(const char *filename, int flags, uid_t euid); - #if !defined(SEG_OBJC) #define SEG_OBJC "__OBJC" /* objective-C runtime segment */ #endif -#if !defined(SEG_OBJC2) -#define SEG_OBJC2 "__OBJC2" -#endif // Settings from environment variables -OBJC_EXPORT int PrintImages; // env OBJC_PRINT_IMAGES -OBJC_EXPORT int PrintLoading; // env OBJC_PRINT_LOAD_METHODS -OBJC_EXPORT int PrintInitializing; // env OBJC_PRINT_INITIALIZE_METHODS -OBJC_EXPORT int PrintResolving; // env OBJC_PRINT_RESOLVED_METHODS -OBJC_EXPORT int PrintConnecting; // env OBJC_PRINT_CLASS_SETUP -OBJC_EXPORT int PrintProtocols; // env OBJC_PRINT_PROTOCOL_SETUP -OBJC_EXPORT int PrintIvars; // env OBJC_PRINT_IVAR_SETUP -OBJC_EXPORT int PrintFuture; // env OBJC_PRINT_FUTURE_CLASSES -OBJC_EXPORT int PrintRTP; // env OBJC_PRINT_RTP -OBJC_EXPORT int PrintGC; // env OBJC_PRINT_GC -OBJC_EXPORT int PrintSharing; // env OBJC_PRINT_SHARING -OBJC_EXPORT int PrintCxxCtors; // env OBJC_PRINT_CXX_CTORS -OBJC_EXPORT int PrintExceptions; // env OBJC_PRINT_EXCEPTIONS -OBJC_EXPORT int PrintAltHandlers; // env OBJC_PRINT_ALT_HANDLERS -OBJC_EXPORT int PrintDeprecation;// env OBJC_PRINT_DEPRECATION_WARNINGS -OBJC_EXPORT int PrintReplacedMethods; // env OBJC_PRINT_REPLACED_METHODS -OBJC_EXPORT int PrintCacheCollection; // env OBJC_PRINT_CACHE_COLLECTION -OBJC_EXPORT int UseInternalZone; // env OBJC_USE_INTERNAL_ZONE -OBJC_EXPORT int AllowInterposing;// env OBJC_ALLOW_INTERPOSING - -OBJC_EXPORT int DebugUnload; // env OBJC_DEBUG_UNLOAD -OBJC_EXPORT int DebugFragileSuperclasses; // env OBJC_DEBUG_FRAGILE_SUPERCLASSES -OBJC_EXPORT int DebugFinalizers; // env OBJC_DEBUG_FINALIZERS -OBJC_EXPORT int DebugNilSync; // env OBJC_DEBUG_NIL_SYNC - -OBJC_EXPORT int DisableGC; // env OBJC_DISABLE_GC - -/* GC state */ -OBJC_EXPORT BOOL UseGC; // equivalent to calling objc_collecting_enabled() -OBJC_EXPORT auto_zone_t *gc_zone; // the GC zone, or NULL if no GC - -static __inline__ int _objc_strcmp(const char *s1, const char *s2) { +#if NO_ENVIRON +# define ENV(x) enum { x = 0 } +#else +# define ENV(x) extern int x +#endif +ENV(PrintImages); // env OBJC_PRINT_IMAGES +ENV(PrintLoading); // env OBJC_PRINT_LOAD_METHODS +ENV(PrintInitializing); // env OBJC_PRINT_INITIALIZE_METHODS +ENV(PrintResolving); // env OBJC_PRINT_RESOLVED_METHODS +ENV(PrintConnecting); // env OBJC_PRINT_CLASS_SETUP +ENV(PrintProtocols); // env OBJC_PRINT_PROTOCOL_SETUP +ENV(PrintIvars); // env OBJC_PRINT_IVAR_SETUP +ENV(PrintVtables); // env OBJC_PRINT_VTABLE_SETUP +ENV(PrintVtableImages); // env OBJC_PRINT_VTABLE_IMAGES +ENV(PrintFuture); // env OBJC_PRINT_FUTURE_CLASSES +ENV(PrintRTP); // env OBJC_PRINT_RTP +ENV(PrintGC); // env OBJC_PRINT_GC +ENV(PrintPreopt); // env OBJC_PRINT_PREOPTIMIZATION +ENV(PrintCxxCtors); // env OBJC_PRINT_CXX_CTORS +ENV(PrintExceptions); // env OBJC_PRINT_EXCEPTIONS +ENV(PrintAltHandlers); // env OBJC_PRINT_ALT_HANDLERS +ENV(PrintDeprecation); // env OBJC_PRINT_DEPRECATION_WARNINGS +ENV(PrintReplacedMethods); // env OBJC_PRINT_REPLACED_METHODS +ENV(PrintCaches); // env OBJC_PRINT_CACHE_SETUP +ENV(UseInternalZone); // env OBJC_USE_INTERNAL_ZONE + +ENV(DebugUnload); // env OBJC_DEBUG_UNLOAD +ENV(DebugFragileSuperclasses); // env OBJC_DEBUG_FRAGILE_SUPERCLASSES +ENV(DebugFinalizers); // env OBJC_DEBUG_FINALIZERS +ENV(DebugNilSync); // env OBJC_DEBUG_NIL_SYNC + +ENV(DisableGC); // env OBJC_DISABLE_GC +ENV(DisableVtables); // env OBJC_DISABLE_VTABLES +ENV(DisablePreopt); // env OBJC_DISABLE_PREOPTIMIZATION +#undef ENV + +extern void environ_init(void); + +extern void logReplacedMethod(const char *className, SEL s, BOOL isMeta, const char *catName, IMP oldImp, IMP newImp); + + +static __inline int _objc_strcmp(const char *s1, const char *s2) { char c1, c2; for ( ; (c1 = *s1) == (c2 = *s2); s1++, s2++) if (c1 == '\0') @@ -478,8 +637,8 @@ static __inline__ int _objc_strcmp(const char *s1, const char *s2) { return (c1 - c2); } -static __inline__ uintptr_t _objc_strhash(const char *s) { - uintptr_t hash = 0; +static __inline uint32_t _objc_strhash(const char *s) { + uint32_t hash = 0; for (;;) { int a = *s++; if (0 == a) break; @@ -501,7 +660,8 @@ typedef struct { } _objc_pthread_data; -OBJC_EXPORT _objc_pthread_data *_objc_fetch_pthread_data(BOOL create); +extern _objc_pthread_data *_objc_fetch_pthread_data(BOOL create); +extern void tls_init(void); // Class state @@ -520,15 +680,22 @@ OBJC_EXPORT _objc_pthread_data *_objc_fetch_pthread_data(BOOL create); #define NOBSS __attribute__((section("__DATA,__data"))) // cache.h +#if TARGET_OS_WIN32 + +#else +static inline int isPowerOf2(unsigned long l) { return 1 == __builtin_popcountl(l); } +#endif extern void flush_caches(Class cls, BOOL flush_meta); extern void flush_cache(Class cls); extern BOOL _cache_fill(Class cls, Method smt, SEL sel); extern void _cache_addForwardEntry(Class cls, SEL sel); extern void _cache_free(Cache cache); + +extern mutex_t cacheUpdateLock; + #if !__OBJC2__ // used by flush_caches outside objc-cache.m extern void _cache_flush(Class cls); -extern pthread_mutex_t cacheUpdateLock; #ifdef OBJC_INSTRUMENTED extern unsigned int LinearFlushCachesCount; extern unsigned int LinearFlushCachesVisitedCount; @@ -542,6 +709,11 @@ extern unsigned int MaxIdealFlushCachesCount; #endif #endif +// objc-gdb.h +#if !TARGET_OS_WIN32 +BOOL _objc_dumpHeap(auto_zone_t *zone, const char *filename); +#endif + // encoding.h extern unsigned int encoding_getNumberOfArguments(const char *typedesc); extern unsigned int encoding_getSizeOfArguments(const char *typedesc); @@ -551,13 +723,6 @@ extern char * encoding_copyReturnType(const char *t); extern void encoding_getArgumentType(const char *t, unsigned int index, char *dst, size_t dst_len); extern char *encoding_copyArgumentType(const char *t, unsigned int index); -// lock.h -extern void _lock_debug(mutex_t lock, const char *name); -extern void _checklock_debug(mutex_t lock, const char *name); -extern void _checkunlock_debug(mutex_t lock, const char *name); -extern void _unlock_debug(mutex_t lock, const char *name); -extern void _destroyLockList(struct _objc_lock_list *locks); - // sync.h extern void _destroySyncCache(struct SyncCache *cache); @@ -577,10 +742,18 @@ extern void layout_bitmap_slide(layout_bitmap *bits, size_t oldPos, size_t newPo extern BOOL layout_bitmap_splat(layout_bitmap dst, layout_bitmap src, size_t oldSrcInstanceSize); extern BOOL layout_bitmap_or(layout_bitmap dst, layout_bitmap src, const char *msg); +extern BOOL layout_bitmap_clear(layout_bitmap dst, layout_bitmap src, const char *msg); +extern void layout_bitmap_print(layout_bitmap bits); // fixme runtime extern id look_up_class(const char *aClassName, BOOL includeUnconnected, BOOL includeClassHandler); +extern const char *map_images(enum dyld_image_states state, uint32_t infoCount, const struct dyld_image_info infoList[]); +extern const char *map_images_nolock(enum dyld_image_states state, uint32_t infoCount, const struct dyld_image_info infoList[]); +extern const char * load_images(enum dyld_image_states state, uint32_t infoCount, const struct dyld_image_info infoList[]); +extern BOOL load_images_nolock(enum dyld_image_states state, uint32_t infoCount, const struct dyld_image_info infoList[]); +extern void unmap_image(const struct mach_header *mh, intptr_t vmaddr_slide); +extern void unmap_image_nolock(const struct mach_header *mh, intptr_t vmaddr_slide); extern void _read_images(header_info **hList, uint32_t hCount); extern void prepare_load_methods(header_info *hi); extern void _unload_image(header_info *hi); @@ -611,23 +784,28 @@ extern BOOL _class_isInitialized(Class cls); extern void _class_setInitializing(Class cls); extern void _class_setInitialized(Class cls); extern Class _class_getNonMetaClass(Class cls); -extern Method _class_getMethodNoSuper(Class cls, SEL sel); extern Method _class_getMethod(Class cls, SEL sel); +extern Method _class_getMethodNoSuper(Class cls, SEL sel); +extern Method _class_getMethodNoSuper_nolock(Class cls, SEL sel); extern BOOL _class_isLoadable(Class cls); extern IMP _class_getLoadMethod(Class cls); extern BOOL _class_hasLoadMethod(Class cls); extern BOOL _class_hasCxxStructorsNoSuper(Class cls); extern BOOL _class_shouldFinalizeOnMainThread(Class cls); extern void _class_setFinalizeOnMainThread(Class cls); +extern BOOL _class_instancesHaveAssociatedObjects(Class cls); +extern void _class_assertInstancesHaveAssociatedObjects(Class cls); extern BOOL _class_shouldGrowCache(Class cls); extern void _class_setGrowCache(Class cls, BOOL grow); extern Ivar _class_getVariable(Class cls, const char *name); -extern Class _class_getFreedObjectClass(void); -extern Class _class_getNonexistentObjectClass(void); + extern id _internal_class_createInstanceFromZone(Class cls, size_t extraBytes, void *zone); extern id _internal_object_dispose(id anObject); +extern Class gdb_class_getClass(Class cls); +extern BOOL class_instancesHaveAssociatedObjects(Class cls); +OBJC_EXPORT BOOL gdb_objc_isRuntimeLocked(); extern const char *_category_getName(Category cat); extern const char *_category_getClassName(Category cat); @@ -646,11 +824,15 @@ static inline struct old_class *_class_asOld(Class cls) { return (struct old_cla static inline struct old_category *_category_asOld(Category cat) { return (struct old_category *)cat; } extern void unload_class(struct old_class *cls); +Class _class_getNonexistentObjectClass(void); #endif extern BOOL object_cxxConstruct(id obj); extern void object_cxxDestruct(id obj); +extern Method _class_resolveMethod(Class cls, SEL sel); +extern void log_and_fill_cache(Class cls, Class implementer, Method meth, SEL sel); + #if !__OBJC2__ #define CLS_CLASS 0x1 #define CLS_META 0x2 @@ -689,6 +871,8 @@ extern void object_cxxDestruct(id obj); #define CLS_CONSTRUCTED 0x400000 // class is leaf for cache flushing #define CLS_LEAF 0x800000 +// class instances may have associative references +#define CLS_INSTANCES_HAVE_ASSOCIATED_OBJECTS 0x1000000 #endif #define OBJC_WARN_DEPRECATED \ @@ -700,16 +884,7 @@ extern void object_cxxDestruct(id obj); } \ } while (0) \ -/* Method prototypes */ -@interface DoesNotExist -+ class; -+ initialize; -- (id)description; -- (const char *)UTF8String; -- (unsigned long)hash; -- (BOOL)isEqual:(id)object; -- free; -@end +__END_DECLS #endif /* _OBJC_PRIVATE_H_ */ diff --git a/runtime/objc-probes.d b/runtime/objc-probes.d new file mode 100644 index 0000000..4a1e224 --- /dev/null +++ b/runtime/objc-probes.d @@ -0,0 +1,5 @@ +provider objc_runtime +{ + probe objc_exception_throw(void *id); + probe objc_exception_rethrow(); +}; diff --git a/runtime/Accessors.subproj/objc-accessors-arch.s b/runtime/objc-references.h similarity index 67% rename from runtime/Accessors.subproj/objc-accessors-arch.s rename to runtime/objc-references.h index b44adff..e573d7d 100644 --- a/runtime/Accessors.subproj/objc-accessors-arch.s +++ b/runtime/objc-references.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006 Apple Inc. All Rights Reserved. + * Copyright (c) 2008 Apple Inc. All Rights Reserved. * * @APPLE_LICENSE_HEADER_START@ * @@ -20,15 +20,22 @@ * * @APPLE_LICENSE_HEADER_END@ */ +/* + * objc-references.h + */ + +#if !defined(_OBJC_REFERENCES_H_) +#define _OBJC_REFERENCES_H_ + +#include "objc-api.h" +#include "objc-config.h" + +__BEGIN_DECLS + +extern void _object_set_associative_reference(id object, void *key, id value, uintptr_t policy); +extern id _object_get_associative_reference(id object, void *key); +extern void _object_remove_assocations(id object); + +__END_DECLS -#if defined (__i386__) || defined (i386) - #include "objc-accessors-i386.s" -#elif defined (__ppc__) || defined(ppc) - #include "objc-accessors-ppc.s" -#elif defined (__ppc64__) || defined(ppc64) - #include "objc-accessors-ppc64.s" -#elif defined (__x86_64__) - #include "objc-accessors-x86_64.s" -#else - #error Architecture not supported #endif diff --git a/runtime/objc-references.mm b/runtime/objc-references.mm new file mode 100644 index 0000000..cada135 --- /dev/null +++ b/runtime/objc-references.mm @@ -0,0 +1,305 @@ +/* + * Copyright (c) 2004-2007 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +/* + Implementation of the weak / associative references for non-GC mode. +*/ + + +#include "objc-private.h" +#include + + +// wrap all the murky C++ details in a namespace to get them out of the way. + +namespace objc_references_support { + struct ObjcPointerEqual { + bool operator()(void *p1, void *p2) const { + return p1 == p2; + } + }; + + struct ObjcPointerClear { + void operator() (void *pointer) { + void **location = (void **)pointer; + *location = NULL; + } + }; + + struct ObjcPointerHash { + uintptr_t operator()(void *p) const { + uintptr_t k = (uintptr_t)p; + + // borrowed from CFSet.c + #if __LP64__ + uintptr_t a = 0x4368726973746F70ULL; + uintptr_t b = 0x686572204B616E65ULL; + #else + uintptr_t a = 0x4B616E65UL; + uintptr_t b = 0x4B616E65UL; + #endif + uintptr_t c = 1; + a += k; + #if __LP64__ + a -= b; a -= c; a ^= (c >> 43); + b -= c; b -= a; b ^= (a << 9); + c -= a; c -= b; c ^= (b >> 8); + a -= b; a -= c; a ^= (c >> 38); + b -= c; b -= a; b ^= (a << 23); + c -= a; c -= b; c ^= (b >> 5); + a -= b; a -= c; a ^= (c >> 35); + b -= c; b -= a; b ^= (a << 49); + c -= a; c -= b; c ^= (b >> 11); + a -= b; a -= c; a ^= (c >> 12); + b -= c; b -= a; b ^= (a << 18); + c -= a; c -= b; c ^= (b >> 22); + #else + a -= b; a -= c; a ^= (c >> 13); + b -= c; b -= a; b ^= (a << 8); + c -= a; c -= b; c ^= (b >> 13); + a -= b; a -= c; a ^= (c >> 12); + b -= c; b -= a; b ^= (a << 16); + c -= a; c -= b; c ^= (b >> 5); + a -= b; a -= c; a ^= (c >> 3); + b -= c; b -= a; b ^= (a << 10); + c -= a; c -= b; c ^= (b >> 15); + #endif + return c; + } + }; + + // STL allocator that uses the runtime's internal allocator. + + template struct ObjcAllocator { + typedef T value_type; + typedef value_type* pointer; + typedef const value_type *const_pointer; + typedef value_type& reference; + typedef const value_type& const_reference; + typedef size_t size_type; + typedef ptrdiff_t difference_type; + + template struct rebind { typedef ObjcAllocator other; }; + + template ObjcAllocator(const ObjcAllocator&) {} + ObjcAllocator() {} + ObjcAllocator(const ObjcAllocator&) {} + ~ObjcAllocator() {} + + pointer address(reference x) const { return &x; } + const_pointer address(const_reference x) const { + return x; + } + + pointer allocate(size_type n, const_pointer = 0) { + return static_cast(::_malloc_internal(n * sizeof(T))); + } + + void deallocate(pointer p, size_type) { ::_free_internal(p); } + + size_type max_size() const { + return static_cast(-1) / sizeof(T); + } + + void construct(pointer p, const value_type& x) { + new(p) value_type(x); + } + + void destroy(pointer p) { p->~value_type(); } + + void operator=(const ObjcAllocator&); + + }; + + template<> struct ObjcAllocator { + typedef void value_type; + typedef void* pointer; + typedef const void *const_pointer; + template struct rebind { typedef ObjcAllocator other; }; + }; + + struct ObjcAssociation { + uintptr_t policy; + id value; + ObjcAssociation(uintptr_t newPolicy, id newValue) : policy(newPolicy), value(newValue) { } + ObjcAssociation() : policy(0), value(0) { } + }; + + // typedef vector > PtrVector; + // typedef hash_set > PtrHashSet; + // typedef hash_map > PtrPtrHashMap; +#if TARGET_OS_WIN32 + typedef hash_map ObjectAssocationHashMap; + typedef hash_map AssocationsHashMap; +#else + typedef hash_map > ObjectAssocationHashMap; + typedef hash_map > AssocationsHashMap; +#endif +} + +using namespace objc_references_support; + +// class AssociationsManager manages a lock / hash table singleton pair. +// Allocating an instance acquires the lock, and calling its assocations() method +// lazily allocates it. + +class AssociationsManager { + static OSSpinLock _lock; + static AssocationsHashMap *_map; // associative references: object pointer -> PtrPtrHashMap. +public: + AssociationsManager() { OSSpinLockLock(&_lock); } + ~AssociationsManager() { OSSpinLockUnlock(&_lock); } + + AssocationsHashMap &associations() { + if (_map == NULL) + _map = new(::_malloc_internal(sizeof(AssocationsHashMap))) AssocationsHashMap(); + return *_map; + } +}; + +OSSpinLock AssociationsManager::_lock = OS_SPINLOCK_INIT; +AssocationsHashMap *AssociationsManager::_map = NULL; + +// expanded policy bits. + +enum { + OBJC_ASSOCIATION_SETTER_ASSIGN = 0, + OBJC_ASSOCIATION_SETTER_RETAIN = 1, + OBJC_ASSOCIATION_SETTER_COPY = 3, // NOTE: both bits are set, so we can simply test 1 bit in releaseValue below. + OBJC_ASSOCIATION_GETTER_READ = (0 << 8), + OBJC_ASSOCIATION_GETTER_RETAIN = (1 << 8), + OBJC_ASSOCIATION_GETTER_AUTORELEASE = (2 << 8) +}; + +__private_extern__ id _object_get_associative_reference(id object, void *key) { + id value = nil; + uintptr_t policy = OBJC_ASSOCIATION_ASSIGN; + { + AssociationsManager manager; + AssocationsHashMap &associations(manager.associations()); + AssocationsHashMap::iterator i = associations.find(object); + if (i != associations.end()) { + ObjectAssocationHashMap &refs = i->second; + ObjectAssocationHashMap::iterator j = refs.find(key); + if (j != refs.end()) { + ObjcAssociation &entry = j->second; + value = (id)entry.value; + policy = entry.policy; + if (policy & OBJC_ASSOCIATION_GETTER_RETAIN) objc_msgSend(value, SEL_retain); + } + } + } + if (value && (policy & OBJC_ASSOCIATION_GETTER_AUTORELEASE)) { + objc_msgSend(value, SEL_autorelease); + } + return value; +} + +static id acquireValue(id value, uintptr_t policy) { + switch (policy & 0xFF) { + case OBJC_ASSOCIATION_SETTER_RETAIN: + return objc_msgSend(value, SEL_retain); + case OBJC_ASSOCIATION_SETTER_COPY: + return objc_msgSend(value, SEL_copy); + } + return value; +} + +static void releaseValue(id value, uintptr_t policy) { + if (policy & OBJC_ASSOCIATION_SETTER_RETAIN) { + objc_msgSend(value, SEL_release); + } +} + +struct ReleaseValue { + void operator() (ObjcAssociation &association) { + releaseValue(association.value, association.policy); + } +}; + +__private_extern__ void _object_set_associative_reference(id object, void *key, id value, uintptr_t policy) { + // retain the new value (if any) outside the lock. + uintptr_t old_policy = 0; // NOTE: old_policy is always assigned to when old_value is non-nil. + id new_value = value ? acquireValue(value, policy) : nil, old_value = nil; + { + AssociationsManager manager; + AssocationsHashMap &associations(manager.associations()); + if (new_value) { + // break any existing association. + AssocationsHashMap::iterator i = associations.find(object); + if (i != associations.end()) { + // secondary table exists + ObjectAssocationHashMap &refs = i->second; + ObjectAssocationHashMap::iterator j = refs.find(key); + if (j != refs.end()) { + ObjcAssociation &old_entry = j->second; + old_policy = old_entry.policy; + old_value = old_entry.value; + old_entry.policy = policy; + old_entry.value = new_value; + } else { + refs[key] = ObjcAssociation(policy, new_value); + } + } else { + // create the new association (first time). + associations[object][key] = ObjcAssociation(policy, new_value); + _class_assertInstancesHaveAssociatedObjects(object->isa); + } + } else { + // setting the association to nil breaks the association. + AssocationsHashMap::iterator i = associations.find(object); + if (i != associations.end()) { + ObjectAssocationHashMap &refs = i->second; + ObjectAssocationHashMap::iterator j = refs.find(key); + if (j != refs.end()) { + ObjcAssociation &old_entry = j->second; + old_policy = old_entry.policy; + old_value = (id) old_entry.value; + refs.erase(j); + } + } + } + } + // release the old value (outside of the lock). + if (old_value) releaseValue(old_value, old_policy); +} + +__private_extern__ void _object_remove_assocations(id object) { + vector elements; + { + AssociationsManager manager; + AssocationsHashMap &associations(manager.associations()); + if (associations.size() == 0) return; + AssocationsHashMap::iterator i = associations.find(object); + if (i != associations.end()) { + // copy all of the associations that need to be removed. + ObjectAssocationHashMap &refs = i->second; + for (ObjectAssocationHashMap::iterator j = refs.begin(); j != refs.end(); ++j) { + elements.push_back(j->second); + } + // remove the secondary table. + associations.erase(i); + } + } + // the calls to releaseValue() happen outside of the lock. + for_each(elements.begin(), elements.end(), ReleaseValue()); +} diff --git a/runtime/objc-rtp-sym.s b/runtime/objc-rtp-sym.s deleted file mode 100644 index c095ef3..0000000 --- a/runtime/objc-rtp-sym.s +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (c) 2004 Apple Inc. All rights reserved. - * - * @APPLE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_LICENSE_HEADER_END@ - */ -/* - This file is used to regenerate symbols for routines in the ObjC runtime pages. - - Build this file with: - cc objc-rtp-syms.c -c -o objc-rtp-syms.o.temp - ld -seg1addr kRTPagesLo objc-rtp-syms.o.temp -r -o objc-rtp-syms.o - and then use `-sectcreate __DATA __commpage objc-rtp-syms.o` when linking. - - IMPORTANT - declarations need to be declared in address order. -*/ - -#undef OBJC_ASM -#define OBJC_ASM -#include "objc-rtp.h" - - .text - .globl _objc_kIgnore_rtp - .org kRTAddress_ignoredSelector-kRTPagesLo // unnormalized with ld -seg1addr kRTPagesLo -_objc_kIgnore_rtp: - nop - - // note that macro expansion does not work well with .org, had to go long hand - jml - - .globl _objc_assign_strongCast_rtp - .org kRTAddress_objc_assign_strongCast-kRTPagesLo // unnormalized with ld -seg1addr kRTPagesLo -_objc_assign_strongCast_rtp: - nop - - .globl _objc_assign_global_rtp - .org kRTAddress_objc_assign_global-kRTPagesLo // unnormalized with ld -seg1addr kRTPagesLo -_objc_assign_global_rtp: - nop - - .globl _objc_assign_ivar_rtp - .org kRTAddress_objc_assign_ivar-kRTPagesLo // unnormalized with ld -seg1addr kRTPagesLo -_objc_assign_ivar_rtp: - nop - - .globl _objc_msgSend_rtp - .org kRTAddress_objc_msgSend -kRTPagesLo // unnormalized with ld -seg1addr kRTPagesLo -_objc_msgSend_rtp: - nop - - // Extra symbol at the end of the RTP area. - // This pacifies gdb and other debugging tools. - .globl _objc_msgSend_rtp_exit - .org kRTPagesHi - kRTPagesLo // unnormalized with ld -seg1adr kRTPagesLo - - .data - .long 0 diff --git a/runtime/objc-rtp.h b/runtime/objc-rtp.h index 9b701e4..f433993 100644 --- a/runtime/objc-rtp.h +++ b/runtime/objc-rtp.h @@ -79,6 +79,8 @@ # define kRTPagesLo OBJC_UINTPTR_T(-24 * 0x1000) // i386 0xfffe8000 #elif defined(__x86_64__) # define kRTPagesLo OBJC_UINTPTR_T(-24 * 0x1000) // x86_64 0xfffffffffffe8000 +#elif defined(__arm__) || defined(TARGET_OS_WIN32) +# define kRTPagesLo OBJC_UINTPTR_T(0) #else #error unknown architecture #endif diff --git a/runtime/objc-rtp.m b/runtime/objc-rtp.m index a69d1fe..c903eb5 100644 --- a/runtime/objc-rtp.m +++ b/runtime/objc-rtp.m @@ -25,43 +25,15 @@ in high memory that can be reached via an absolute branch. */ -#import "objc-rtp.h" #import "objc-private.h" -#import "objc-auto.h" +#import -#import -#import - -// Local prototypes - -#if defined(__ppc__) || defined(__ppc64__) -// from Libc, but no prototype yet (#3850825) -extern void sys_icache_invalidate(const void * newcode, size_t len); +#if defined(__ppc__) static size_t rtp_copy_code(unsigned* dest, unsigned* source, size_t max_insns); -#endif - - -#if defined(__ppc64__) - -__private_extern__ void rtp_init(void) -{ - if (PrintRTP) { - _objc_inform("RTP: no rtp implementation for this platform"); - } -} - -#else - -#if defined(__ppc__) static void rtp_set_up_objc_msgSend(uintptr_t address, size_t maxsize); static void rtp_set_up_other(uintptr_t address, size_t maxsize, const char *name, void *gc_code, void *non_gc_code); -#endif - -#if defined(__i386__) || defined(__x86_64__) -static void rtp_swap_imp(unsigned *address, void *code, const char *name); -#endif /********************************************************************** * rtp_init @@ -70,8 +42,6 @@ static void rtp_swap_imp(unsigned *address, void *code, const char *name); **********************************************************************/ __private_extern__ void rtp_init(void) { -#if defined(__ppc__) - kern_return_t ret; vm_address_t objcRTPages = (vm_address_t)(kRTPagesHi - kRTPagesSize); @@ -94,7 +64,11 @@ __private_extern__ void rtp_init(void) // initialize code in ObjC runtime pages rtp_set_up_objc_msgSend(kRTAddress_objc_msgSend, kRTSize_objc_msgSend); - +#ifdef NO_GC + #define objc_assign_ivar_gc objc_assign_ivar_non_gc + #define objc_assign_global_gc objc_assign_global_non_gc + #define objc_assign_strongCast_gc objc_assign_strongCast_non_gc +#endif rtp_set_up_other(kRTAddress_objc_assign_ivar, kRTSize_objc_assign_ivar, "objc_assign_ivar", objc_assign_ivar_gc, objc_assign_ivar_non_gc); @@ -106,7 +80,7 @@ __private_extern__ void rtp_init(void) // initialize data in ObjC runtime pages memset((char *)kRTAddress_zero, 0, 16); - strcpy((char *)kIgnore, ""); + strlcpy((char *)kIgnore, "", OBJC_SIZE_T(19)); // re-protect the ObjC runtime pages for execution ret = vm_protect(mach_task_self(), @@ -115,33 +89,8 @@ __private_extern__ void rtp_init(void) if (ret != KERN_SUCCESS) { _objc_inform("RTP: Could not re-protect Objective-C runtime pages!"); } - -#elif defined(__i386__) || defined(__x86_64__) - - // At load time, the page on which the objc_assign_* routines live is not - // marked as executable. We fix that here, regardless of the GC choice. - if (UseGC) - { - rtp_swap_imp((unsigned*)objc_assign_ivar, - objc_assign_ivar_gc, "objc_assign_ivar"); - rtp_swap_imp((unsigned*)objc_assign_global, - objc_assign_global_gc, "objc_assign_global"); - rtp_swap_imp((unsigned*)objc_assign_strongCast, - objc_assign_strongCast_gc, "objc_assign_strongCast"); - } - else - { // Not GC, just make the page executable. - if (vm_protect(mach_task_self(), (vm_address_t)objc_assign_ivar, 1, - FALSE, VM_PROT_READ | VM_PROT_EXECUTE) != KERN_SUCCESS) - _objc_fatal("Could not reprotect objc_assign_*."); - } - -#else -#error undefined architecture -#endif } -#if defined(__ppc__) /********************************************************************** * rtp_set_up_objc_msgSend @@ -152,7 +101,6 @@ __private_extern__ void rtp_init(void) **********************************************************************/ static void rtp_set_up_objc_msgSend(uintptr_t address, size_t maxsize) { -#if defined(__ppc__) || defined(__ppc64__) // Location in the runtime pages of the new function. unsigned *buffer = (unsigned *)address; @@ -173,20 +121,6 @@ static void rtp_set_up_objc_msgSend(uintptr_t address, size_t maxsize) return; #endif - // If function interposing is enabled, call the full implementation - // via a dyld-recognizable stub. - if (AllowInterposing) { - extern void objc_msgSend_stub(void); - size_t written = objc_write_branch(buffer, objc_msgSend_stub); - sys_icache_invalidate(buffer, written*4); - if (PrintRTP) { - _objc_inform("RTP: interposing enabled - objc_msgSend " - "in RTP at %p is a %zu instruction branch", - buffer, written); - } - return; - } - if (PrintRTP) { _objc_inform("RTP: writing objc_msgSend at [%p..%p) ...", (void *)address, (void *)(address+maxsize)); @@ -271,12 +205,6 @@ static void rtp_set_up_objc_msgSend(uintptr_t address, size_t maxsize) _objc_inform("RTP: wrote objc_msgSend at [%p..%p)", (void *)address, (void *)(address + i*sizeof(unsigned))); } - -#elif defined(__i386__) - #warning needs implementation -#else - #error unknown architecture -#endif } @@ -291,7 +219,6 @@ static void rtp_set_up_objc_msgSend(uintptr_t address, size_t maxsize) * non_gc_code is the code to use if collecting is not enabled (assumed to be small enough to copy.) **********************************************************************/ static void rtp_set_up_other(uintptr_t address, size_t maxsize, const char *name, void *gc_code, void *non_gc_code) { -#if defined(__ppc__) || defined(__ppc64__) // location in the runtime pages of this function unsigned *buffer = (unsigned *)address; @@ -335,12 +262,6 @@ static void rtp_set_up_other(uintptr_t address, size_t maxsize, const char *name name, (void *)address, (void *)(address + i * sizeof(unsigned))); } - -#elif defined(__i386__) - #warning needs implementation -#else // defined(architecture) - #error unknown architecture -#endif // defined(architecture) } @@ -369,10 +290,9 @@ static size_t rtp_copy_code(unsigned* dest, unsigned* source, size_t max_insns) return i + 1; } -// defined(__ppc__) || defined(__ppc64__) -#endif -#if defined(__i386__) || defined(__x86_64__) +#elif defined(__i386__) + /********************************************************************** * rtp_swap_imp @@ -396,8 +316,41 @@ static void rtp_swap_imp(unsigned *address, void *code, const char *name) } } -// defined(__i386__) || defined(__x86_64__) + +__private_extern__ void rtp_init(void) +{ + // At load time, the page on which the objc_assign_* routines live is not + // marked as executable. We fix that here, regardless of the GC choice. +#ifndef NO_GC + if (UseGC) + { + rtp_swap_imp((unsigned*)objc_assign_ivar, + objc_assign_ivar_gc, "objc_assign_ivar"); + rtp_swap_imp((unsigned*)objc_assign_global, + objc_assign_global_gc, "objc_assign_global"); + rtp_swap_imp((unsigned*)objc_assign_strongCast, + objc_assign_strongCast_gc, "objc_assign_strongCast"); + } + else #endif + { // Not GC, just make the page executable. + if (vm_protect(mach_task_self(), (vm_address_t)objc_assign_ivar, 1, + FALSE, VM_PROT_READ | VM_PROT_EXECUTE) != KERN_SUCCESS) + _objc_fatal("Could not reprotect objc_assign_*."); + } +} + + +#else + + +__private_extern__ void rtp_init(void) +{ + if (PrintRTP) { + _objc_inform("RTP: no rtp implementation for this platform"); + } +} + -// !defined(__ppc64__) #endif + diff --git a/runtime/objc-runtime-new.h b/runtime/objc-runtime-new.h index ec96fb9..1f84e36 100644 --- a/runtime/objc-runtime-new.h +++ b/runtime/objc-runtime-new.h @@ -35,6 +35,10 @@ #define RO_HIDDEN (1<<4) // class has attribute(objc_exception): OBJC_EHTYPE_$_ThisClass is non-weak #define RO_EXCEPTION (1<<5) +// class is in an unloadable bundle - must never be set by compiler +#define RO_FROM_BUNDLE (1<<29) +// class is unrealized future class - must never be set by compiler +#define RO_FUTURE (1<<30) // class is realized - must never be set by compiler #define RO_REALIZED (1<<31) @@ -43,8 +47,8 @@ // Their presence should be considered in future ABI versions. // class_t->data is class_rw_t, not class_ro_t #define RW_REALIZED (1<<31) -// class's method lists are fixed up -#define RW_METHODIZED (1<<30) +// class is unresolved future class +#define RW_FUTURE (1<<30) // class is initialized #define RW_INITIALIZED (1<<29) // class is initializing @@ -59,6 +63,10 @@ #define RW_FINALIZE_ON_MAIN_THREAD (1<<24) // class +load has been called #define RW_LOADED (1<<23) +// class does not share super's vtable +#define RW_SPECIALIZED_VTABLE (1<<22) +// class instances may have associative references +#define RW_INSTANCES_HAVE_ASSOCIATED_OBJECTS (1<<21) typedef struct method_t { SEL name; @@ -67,7 +75,7 @@ typedef struct method_t { } method_t; typedef struct method_list_t { - uint32_t entsize; + uint32_t entsize_NEVER_USE; // low 2 bits used for fixup markers uint32_t count; struct method_t first; } method_list_t; @@ -78,7 +86,8 @@ typedef struct ivar_t { uintptr_t *offset; const char *name; const char *type; - uint32_t alignment; + // alignment is sometimes -1; use ivar_alignment() instead + uint32_t alignment __attribute__((deprecated)); uint32_t size; } ivar_t; @@ -88,6 +97,8 @@ typedef struct ivar_list_t { struct ivar_t first; } ivar_list_t; +typedef uintptr_t protocol_ref_t; // protocol_t *, but unremapped + typedef struct protocol_t { id isa; const char *name; @@ -102,14 +113,16 @@ typedef struct protocol_t { typedef struct protocol_list_t { // count is 64-bit by accident. uintptr_t count; - protocol_t *list[0]; // variable-size + protocol_ref_t list[0]; // variable-size } protocol_list_t; typedef struct class_ro_t { uint32_t flags; uint32_t instanceStart; uint32_t instanceSize; +#ifdef __LP64__ uint32_t reserved; +#endif const uint8_t * ivarLayout; @@ -128,9 +141,9 @@ typedef struct class_rw_t { const class_ro_t *ro; - struct chained_method_list *methods; + struct method_list_t **methods; struct chained_property_list *properties; - struct protocol_list_t ** protocols; // these are UNREMAPPED protocols! + struct protocol_list_t ** protocols; struct class_t *firstSubclass; struct class_t *nextSiblingClass; diff --git a/runtime/objc-runtime-new.m b/runtime/objc-runtime-new.m index ced3cc1..a1c4d9c 100644 --- a/runtime/objc-runtime-new.m +++ b/runtime/objc-runtime-new.m @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005-2007 Apple Inc. All Rights Reserved. + * Copyright (c) 2005-2008 Apple Inc. All Rights Reserved. * * @APPLE_LICENSE_HEADER_START@ * @@ -30,12 +30,7 @@ #include "objc-private.h" #include "objc-runtime-new.h" -#include "objc-loadmethod.h" -#include "objc-rtp.h" -#include "maptable.h" -#include -#include -#include +#include #define newcls(cls) ((struct class_t *)cls) #define newcat(cat) ((struct category_t *)cat) @@ -44,33 +39,745 @@ #define newcategory(cat) ((struct category_t *)cat) #define newprotocol(p) ((struct protocol_t *)p) +#ifdef __LP64__ +#define WORD_SHIFT 3UL +#define WORD_MASK 7UL +#else +#define WORD_SHIFT 2UL +#define WORD_MASK 3UL +#endif + static const char *getName(struct class_t *cls); static uint32_t instanceSize(struct class_t *cls); static BOOL isMetaClass(struct class_t *cls); static struct class_t *getSuperclass(struct class_t *cls); -static void unload_class(class_t *cls); +static void unload_class(class_t *cls, BOOL isMeta); static class_t *setSuperclass(class_t *cls, class_t *newSuper); static class_t *realizeClass(class_t *cls); +static void flushCaches(class_t *cls); +static void flushVtables(class_t *cls); +static method_t *getMethodNoSuper_nolock(struct class_t *cls, SEL sel); +static method_t *getMethod_nolock(class_t *cls, SEL sel); +static void changeInfo(class_t *cls, unsigned int set, unsigned int clear); +static IMP _method_getImplementation(method_t *m); + + +/*********************************************************************** +* Lock management +* Every lock used anywhere must be managed here. +* Locks not managed here may cause gdb deadlocks. +**********************************************************************/ +__private_extern__ rwlock_t runtimeLock = {0}; +__private_extern__ rwlock_t selLock = {0}; +__private_extern__ mutex_t cacheUpdateLock = MUTEX_INITIALIZER; +__private_extern__ recursive_mutex_t loadMethodLock = RECURSIVE_MUTEX_INITIALIZER; +static int debugger_runtimeLock; +static int debugger_selLock; +static int debugger_cacheUpdateLock; +static int debugger_loadMethodLock; +#define RDONLY 1 +#define RDWR 2 + +__private_extern__ void lock_init(void) +{ + rwlock_init(&selLock); + rwlock_init(&runtimeLock); + recursive_mutex_init(&loadMethodLock); +} + + +/*********************************************************************** +* startDebuggerMode +* Attempt to acquire some locks for debugger mode. +* Returns 0 if debugger mode failed because too many locks are unavailable. +* +* Locks successfully acquired are held until endDebuggerMode(). +* Locks not acquired are off-limits until endDebuggerMode(); any +* attempt to manipulate them will cause a trap. +* Locks not handled here may cause deadlocks in gdb. +**********************************************************************/ +__private_extern__ int startDebuggerMode(void) +{ + int result = DEBUGGER_FULL; + + // runtimeLock is required (can't do much without it) + if (rwlock_try_write(&runtimeLock)) { + debugger_runtimeLock = RDWR; + } else if (rwlock_try_read(&runtimeLock)) { + debugger_runtimeLock = RDONLY; + result = DEBUGGER_PARTIAL; + } else { + return DEBUGGER_OFF; + } + + // cacheUpdateLock is required (must not fail a necessary cache flush) + // must be AFTER runtimeLock to avoid lock inversion + if (mutex_try_lock(&cacheUpdateLock)) { + debugger_cacheUpdateLock = RDWR; + } else { + rwlock_unlock(&runtimeLock, debugger_runtimeLock); + debugger_runtimeLock = 0; + return DEBUGGER_OFF; + } + + // selLock is optional + if (rwlock_try_write(&selLock)) { + debugger_selLock = RDWR; + } else if (rwlock_try_read(&selLock)) { + debugger_selLock = RDONLY; + result = DEBUGGER_PARTIAL; + } else { + debugger_selLock = 0; + result = DEBUGGER_PARTIAL; + } + + // loadMethodLock is optional + if (recursive_mutex_try_lock(&loadMethodLock)) { + debugger_loadMethodLock = RDWR; + } else { + debugger_loadMethodLock = 0; + result = DEBUGGER_PARTIAL; + } + + return result; +} + +/*********************************************************************** +* endDebuggerMode +* Relinquish locks acquired in startDebuggerMode(). +**********************************************************************/ +__private_extern__ void endDebuggerMode(void) +{ + assert(debugger_runtimeLock != 0); + + rwlock_unlock(&runtimeLock, debugger_runtimeLock); + debugger_runtimeLock = 0; + + rwlock_unlock(&selLock, debugger_selLock); + debugger_selLock = 0; + + assert(debugger_cacheUpdateLock == RDWR); + mutex_unlock(&cacheUpdateLock); + debugger_cacheUpdateLock = 0; + + if (debugger_loadMethodLock) { + recursive_mutex_unlock(&loadMethodLock); + debugger_loadMethodLock = 0; + } +} + +/*********************************************************************** +* isManagedDuringDebugger +* Returns YES if the given lock is handled specially during debugger +* mode (i.e. debugger mode tries to acquire it). +**********************************************************************/ +__private_extern__ BOOL isManagedDuringDebugger(void *lock) +{ + if (lock == &selLock) return YES; + if (lock == &cacheUpdateLock) return YES; + if (lock == &runtimeLock) return YES; + if (lock == &loadMethodLock) return YES; + return NO; +} + +/*********************************************************************** +* isLockedDuringDebugger +* Returns YES if the given mutex was acquired by debugger mode. +* Locking a managed mutex during debugger mode causes a trap unless +* this returns YES. +**********************************************************************/ +__private_extern__ BOOL isLockedDuringDebugger(mutex_t *lock) +{ + assert(DebuggerMode); + + if (lock == &cacheUpdateLock) return YES; + if (lock == (mutex_t *)&loadMethodLock) return YES; + + return NO; +} + +/*********************************************************************** +* isReadingDuringDebugger +* Returns YES if the given rwlock was read-locked by debugger mode. +* Read-locking a managed rwlock during debugger mode causes a trap unless +* this returns YES. +**********************************************************************/ +__private_extern__ BOOL isReadingDuringDebugger(rwlock_t *lock) +{ + assert(DebuggerMode); + + // read-lock is allowed even if debugger mode actually write-locked it + if (debugger_runtimeLock && lock == &runtimeLock) return YES; + if (debugger_selLock && lock == &selLock) return YES; + + return NO; +} + +/*********************************************************************** +* isWritingDuringDebugger +* Returns YES if the given rwlock was write-locked by debugger mode. +* Write-locking a managed rwlock during debugger mode causes a trap unless +* this returns YES. +**********************************************************************/ +__private_extern__ BOOL isWritingDuringDebugger(rwlock_t *lock) +{ + assert(DebuggerMode); + + if (debugger_runtimeLock == RDWR && lock == &runtimeLock) return YES; + if (debugger_selLock == RDWR && lock == &selLock) return YES; + + return NO; +} + + +/*********************************************************************** +* vtable dispatch +* +* Every class gets a vtable pointer. The vtable is an array of IMPs. +* The selectors represented in the vtable are the same for all classes +* (i.e. no class has a bigger or smaller vtable). +* Each vtable index has an associated trampoline which dispatches to +* the IMP at that index for the receiver class's vtable (after +* checking for NULL). Dispatch fixup uses these trampolines instead +* of objc_msgSend. +* Fragility: The vtable size and list of selectors is chosen at launch +* time. No compiler-generated code depends on any particular vtable +* configuration, or even the use of vtable dispatch at all. +* Memory size: If a class's vtable is identical to its superclass's +* (i.e. the class overrides none of the vtable selectors), then +* the class points directly to its superclass's vtable. This means +* selectors to be included in the vtable should be chosen so they are +* (1) frequently called, but (2) not too frequently overridden. In +* particular, -dealloc is a bad choice. +* Forwarding: If a class doesn't implement some vtable selector, that +* selector's IMP is set to objc_msgSend in that class's vtable. +* +initialize: Each class keeps the default vtable (which always +* redirects to objc_msgSend) until its +initialize is completed. +* Otherwise, the first message to a class could be a vtable dispatch, +* and the vtable trampoline doesn't include +initialize checking. +* Changes: Categories, addMethod, and setImplementation all force vtable +* reconstruction for the class and all of its subclasses, if the +* vtable selectors are affected. +**********************************************************************/ + +#define X8(x) \ + x, x, x, x, x, x, x, x +#define X64(x) \ + X8(x), X8(x), X8(x), X8(x), X8(x), X8(x), X8(x), X8(x) +#define X128(x) \ + X64(x), X64(x) + +#define vtableMax 128 + +IMP _objc_empty_vtable[vtableMax] = { + X128(objc_msgSend) +}; + +#ifndef NO_VTABLE + +// Trampoline descriptors for gdb. + +objc_trampoline_header *gdb_objc_trampolines = NULL; + +void gdb_objc_trampolines_changed(objc_trampoline_header *thdr) __attribute__((noinline)); +void gdb_objc_trampolines_changed(objc_trampoline_header *thdr) +{ + rwlock_assert_writing(&runtimeLock); + assert(thdr == gdb_objc_trampolines); + + if (PrintVtables) { + _objc_inform("VTABLES: gdb_objc_trampolines_changed(%p)", thdr); + } +} + +// fixme workaround for rdar://6667753 +static void appendTrampolines(objc_trampoline_header *thdr) __attribute__((noinline)); + +static void appendTrampolines(objc_trampoline_header *thdr) +{ + rwlock_assert_writing(&runtimeLock); + assert(thdr->next == NULL); + + if (gdb_objc_trampolines != thdr->next) { + thdr->next = gdb_objc_trampolines; + } + gdb_objc_trampolines = thdr; + + gdb_objc_trampolines_changed(thdr); +} + +// Vtable management. + +static size_t vtableStrlen; +static size_t vtableCount; +static SEL *vtableSelectors; +static IMP *vtableTrampolines; +static const char * const defaultVtable[] = { + "allocWithZone:", + "alloc", + "class", + "self", + "isKindOfClass:", + "respondsToSelector:", + "isFlipped", + "length", + "objectForKey:", + "count", + "objectAtIndex:", + "isEqualToString:", + "isEqual:", + "retain", + "release", + "autorelease", +}; +static const char * const defaultVtableGC[] = { + "allocWithZone:", + "alloc", + "class", + "self", + "isKindOfClass:", + "respondsToSelector:", + "isFlipped", + "length", + "objectForKey:", + "count", + "objectAtIndex:", + "isEqualToString:", + "isEqual:", + "hash", + "addObject:", + "countByEnumeratingWithState:objects:count:", +}; + +extern id objc_msgSend_vtable0(id, SEL, ...); +extern id objc_msgSend_vtable1(id, SEL, ...); +extern id objc_msgSend_vtable2(id, SEL, ...); +extern id objc_msgSend_vtable3(id, SEL, ...); +extern id objc_msgSend_vtable4(id, SEL, ...); +extern id objc_msgSend_vtable5(id, SEL, ...); +extern id objc_msgSend_vtable6(id, SEL, ...); +extern id objc_msgSend_vtable7(id, SEL, ...); +extern id objc_msgSend_vtable8(id, SEL, ...); +extern id objc_msgSend_vtable9(id, SEL, ...); +extern id objc_msgSend_vtable10(id, SEL, ...); +extern id objc_msgSend_vtable11(id, SEL, ...); +extern id objc_msgSend_vtable12(id, SEL, ...); +extern id objc_msgSend_vtable13(id, SEL, ...); +extern id objc_msgSend_vtable14(id, SEL, ...); +extern id objc_msgSend_vtable15(id, SEL, ...); + +static IMP const defaultVtableTrampolines[] = { + objc_msgSend_vtable0, + objc_msgSend_vtable1, + objc_msgSend_vtable2, + objc_msgSend_vtable3, + objc_msgSend_vtable4, + objc_msgSend_vtable5, + objc_msgSend_vtable6, + objc_msgSend_vtable7, + objc_msgSend_vtable8, + objc_msgSend_vtable9, + objc_msgSend_vtable10, + objc_msgSend_vtable11, + objc_msgSend_vtable12, + objc_msgSend_vtable13, + objc_msgSend_vtable14, + objc_msgSend_vtable15, +}; +extern objc_trampoline_header defaultVtableTrampolineDescriptors; + +static void check_vtable_size(void) __unused; +static void check_vtable_size(void) +{ + // Fail to compile if vtable sizes don't match. + int c1[sizeof(defaultVtableTrampolines)-sizeof(defaultVtable)] __unused; + int c2[sizeof(defaultVtable)-sizeof(defaultVtableTrampolines)] __unused; + int c3[sizeof(defaultVtableTrampolines)-sizeof(defaultVtableGC)] __unused; + int c4[sizeof(defaultVtableGC)-sizeof(defaultVtableTrampolines)] __unused; + + // Fail to compile if vtableMax is too small + int c5[vtableMax - sizeof(defaultVtable)] __unused; + int c6[vtableMax - sizeof(defaultVtableGC)] __unused; +} + +/* + x86_64 + + monomorphic (self rdi, sel* rsi, temp r10 and r11) { + test %rdi, %rdi + jeq returnZero // nil check + movq 8(%rsi), %rsi // load _cmd (fixme schedule) + movq $xxxx, %r10 + cmp 0(%rdi), %r10 // isa check + jeq imp // fixme long branches + movq $yyyy, %r10 + cmp 0(%rdi), %r10 // fixme load rdi once for multiple isas + jeq imp2 // fixme long branches + jmp objc_msgSend // fixme long branches + } + +*/ +extern uint8_t vtable_prototype; +extern uint8_t vtable_ignored; +extern int vtable_prototype_size; +extern int vtable_prototype_index_offset; +static size_t makeVtableTrampoline(uint8_t *dst, size_t index) +{ + // copy boilerplate + memcpy(dst, &vtable_prototype, vtable_prototype_size); + + // insert index +#if defined(__x86_64__) + uint16_t *p = (uint16_t *)(dst + vtable_prototype_index_offset + 3); + if (*p != 0x7fff) _objc_fatal("vtable_prototype busted"); + *p = index * 8; +#else +# warning unknown architecture +#endif + + return vtable_prototype_size; +} + + +static void initVtables(void) +{ + if (DisableVtables) { + if (PrintVtables) { + _objc_inform("VTABLES: vtable dispatch disabled by OBJC_DISABLE_VTABLES"); + } + vtableCount = 0; + vtableSelectors = NULL; + vtableTrampolines = NULL; + return; + } + + const char * const *names; + size_t i; + + if (UseGC) { + names = defaultVtableGC; + vtableCount = sizeof(defaultVtableGC) / sizeof(defaultVtableGC[0]); + } else { + names = defaultVtable; + vtableCount = sizeof(defaultVtable) / sizeof(defaultVtable[0]); + } + if (vtableCount > vtableMax) vtableCount = vtableMax; + + vtableSelectors = _malloc_internal(vtableCount * sizeof(SEL)); + vtableTrampolines = _malloc_internal(vtableCount * sizeof(IMP)); + + // Built-in trampolines and their descriptors + + size_t defaultVtableTrampolineCount = + sizeof(defaultVtableTrampolines) / sizeof(defaultVtableTrampolines[0]); +#ifndef NDEBUG + // debug: use generated code for 3/4 of the table + defaultVtableTrampolineCount /= 4; +#endif + + for (i = 0; i < defaultVtableTrampolineCount && i < vtableCount; i++) { + vtableSelectors[i] = sel_registerName(names[i]); + vtableTrampolines[i] = defaultVtableTrampolines[i]; + } + appendTrampolines(&defaultVtableTrampolineDescriptors); + + + // Generated trampolines and their descriptors + + if (vtableCount > defaultVtableTrampolineCount) { + // Memory for trampoline code + size_t generatedCount = + vtableCount - defaultVtableTrampolineCount; + + const int align = 16; + size_t codeSize = + round_page(sizeof(objc_trampoline_header) + align + + generatedCount * (sizeof(objc_trampoline_descriptor) + + vtable_prototype_size + align)); + void *codeAddr = mmap(0, codeSize, PROT_READ|PROT_WRITE, + MAP_PRIVATE|MAP_ANON, + VM_MAKE_TAG(VM_MEMORY_OBJC_DISPATCHERS), 0); + uint8_t *t = (uint8_t *)codeAddr; + + // Trampoline header + objc_trampoline_header *thdr = (objc_trampoline_header *)t; + thdr->headerSize = sizeof(objc_trampoline_header); + thdr->descSize = sizeof(objc_trampoline_descriptor); + thdr->descCount = (uint32_t)generatedCount; + thdr->next = NULL; + + // Trampoline descriptors + objc_trampoline_descriptor *tdesc = (objc_trampoline_descriptor *)(thdr+1); + t = (uint8_t *)&tdesc[generatedCount]; + t += align - ((uintptr_t)t % align); + + // Dispatch code + size_t tdi; + for (i = defaultVtableTrampolineCount, tdi = 0; + i < vtableCount; + i++, tdi++) + { + vtableSelectors[i] = sel_registerName(names[i]); + if (vtableSelectors[i] == (SEL)kIgnore) { + vtableTrampolines[i] = (IMP)&vtable_ignored; + tdesc[tdi].offset = 0; + tdesc[tdi].flags = 0; + } else { + vtableTrampolines[i] = (IMP)t; + tdesc[tdi].offset = + (uint32_t)((uintptr_t)t - (uintptr_t)&tdesc[tdi]); + tdesc[tdi].flags = + OBJC_TRAMPOLINE_MESSAGE|OBJC_TRAMPOLINE_VTABLE; + + t += makeVtableTrampoline(t, i); + t += align - ((uintptr_t)t % align); + } + } + + appendTrampolines(thdr); + sys_icache_invalidate(codeAddr, codeSize); + mprotect(codeAddr, codeSize, PROT_READ|PROT_EXEC); + } + + + if (PrintVtables) { + for (i = 0; i < vtableCount; i++) { + _objc_inform("VTABLES: vtable[%zu] %p %s", + i, vtableTrampolines[i], + sel_getName(vtableSelectors[i])); + } + } + + if (PrintVtableImages) { + _objc_inform("VTABLE IMAGES: '#' implemented by class"); + _objc_inform("VTABLE IMAGES: '-' inherited from superclass"); + _objc_inform("VTABLE IMAGES: ' ' not implemented"); + for (i = 0; i <= vtableCount; i++) { + char spaces[vtableCount+1+1]; + size_t j; + for (j = 0; j < i; j++) { + spaces[j] = '|'; + } + spaces[j] = '\0'; + _objc_inform("VTABLE IMAGES: %s%s", spaces, + idata->flags & RW_SPECIALIZED_VTABLE) { + // Once you have your own vtable, you never go back + needVtable = YES; + } + else { + for (i = 0; i < vtableCount; i++) { + if (vtableSelectors[i] == (SEL)kIgnore) continue; + method_t *m = getMethodNoSuper_nolock(cls, vtableSelectors[i]); + // assume any local implementation differs from super's + if (m) { + needVtable = YES; + break; + } + } + } + + // Build a vtable for this class, or not. + + if (!needVtable) { + if (PrintVtables) { + _objc_inform("VTABLES: USING SUPERCLASS vtable for class %s%s", + getName(cls), isMetaClass(cls) ? "(meta)" : ""); + } + cls->vtable = supercls->vtable; + } + else { + if (PrintVtables) { + _objc_inform("VTABLES: %s vtable for class %s%s", + (cls->data->flags & RW_SPECIALIZED_VTABLE) ? + "UPDATING SPECIALIZED" : "CREATING SPECIALIZED", + getName(cls), isMetaClass(cls) ? "(meta)" : ""); + } + if (PrintVtables || PrintVtableImages) { + printVtableOverrides(cls, supercls); + } + + IMP *new_vtable = cls->vtable; + IMP *super_vtable = supercls ? supercls->vtable : _objc_empty_vtable; + // fixme use msgForward (instead of msgSend from empty vtable) ? + + if (cls->data->flags & RW_SPECIALIZED_VTABLE) { + // update cls->vtable in place + new_vtable = cls->vtable; + assert(new_vtable != _objc_empty_vtable); + } else { + // make new vtable + new_vtable = malloc(vtableCount * sizeof(IMP)); + changeInfo(cls, RW_SPECIALIZED_VTABLE, 0); + } + + for (i = 0; i < vtableCount; i++) { + if (vtableSelectors[i] == (SEL)kIgnore) { + new_vtable[i] = (IMP)&vtable_ignored; + } else { + method_t *m = getMethodNoSuper_nolock(cls, vtableSelectors[i]); + if (m) new_vtable[i] = _method_getImplementation(m); + else new_vtable[i] = super_vtable[i]; + } + } + + if (cls->vtable != new_vtable) { + // don't let other threads see uninitialized parts of new_vtable + OSMemoryBarrier(); + cls->vtable = new_vtable; + } + } +} + +// ! NO_VTABLE +#else +// NO_VTABLE + +static void initVtables(void) +{ + if (PrintVtables) { + _objc_inform("VTABLES: no vtables on this architecture"); + } +} +static BOOL vtable_containsSelector(SEL sel) +{ + return NO; +} + +static void updateVtable(class_t *cls, BOOL force) +{ +} + +// NO_VTABLE +#endif + +typedef struct { + category_t *cat; + BOOL fromBundle; +} category_pair_t; typedef struct { uint32_t count; - category_t *list[0]; // variable-size + category_pair_t list[0]; // variable-size } category_list; -typedef struct chained_method_list { - struct chained_method_list *next; - uint32_t count; - method_t list[0]; // variable-size -} chained_method_list; +#define FOREACH_METHOD_LIST(_mlist, _cls, code) \ + do { \ + const method_list_t *_mlist; \ + if (_cls->data->methods) { \ + method_list_t **_mlistp; \ + for (_mlistp = _cls->data->methods; *_mlistp; _mlistp++) { \ + _mlist = *_mlistp; \ + code \ + } \ + } \ + } while (0) -static size_t chained_mlist_size(const chained_method_list *mlist) -{ - return sizeof(chained_method_list) + mlist->count * sizeof(method_t); -} // fixme don't chain property lists typedef struct chained_property_list { @@ -79,6 +786,36 @@ typedef struct chained_property_list { struct objc_property list[0]; // variable-size } chained_property_list; +/* + Low two bits of mlist->entsize is used as the fixed-up marker. + PREOPTIMIZED VERSION: + Fixed-up method lists get entsize&3 == 3. + dyld shared cache sets this for method lists it preoptimizes. + UN-PREOPTIMIZED VERSION: + Fixed-up method lists get entsize&3 == 1. + dyld shared cache uses 3, but those aren't trusted. +*/ + +static uint32_t fixed_up_method_list = 3; + +__private_extern__ void +disableSelectorPreoptimization(void) +{ + fixed_up_method_list = 1; +} + +static BOOL isMethodListFixedUp(const method_list_t *mlist) +{ + return (mlist->entsize_NEVER_USE & 3) == fixed_up_method_list; +} + +static void setMethodListFixedUp(method_list_t *mlist) +{ + rwlock_assert_writing(&runtimeLock); + assert(!isMethodListFixedUp(mlist)); + mlist->entsize_NEVER_USE = (mlist->entsize_NEVER_USE & ~3) | fixed_up_method_list; +} + /* static size_t chained_property_list_size(const chained_property_list *plist) { @@ -92,14 +829,26 @@ static size_t protocol_list_size(const protocol_list_t *plist) } */ -static size_t ivar_list_size(const ivar_list_t *ilist) +// low bit used by dyld shared cache +static uint32_t method_list_entsize(const method_list_t *mlist) { - return sizeof(ivar_list_t) + (ilist->count-1) * ilist->entsize; + return mlist->entsize_NEVER_USE & ~(uint32_t)3; +} + +static size_t method_list_size(const method_list_t *mlist) +{ + return sizeof(method_list_t) + (mlist->count-1)*method_list_entsize(mlist); } static method_t *method_list_nth(const method_list_t *mlist, uint32_t i) { - return (method_t *)(i*mlist->entsize + (char *)&mlist->first); + return (method_t *)(i*method_list_entsize(mlist) + (char *)&mlist->first); +} + + +static size_t ivar_list_size(const ivar_list_t *ilist) +{ + return sizeof(ivar_list_t) + (ilist->count-1) * ilist->entsize; } static ivar_t *ivar_list_nth(const ivar_list_t *ilist, uint32_t i) @@ -108,6 +857,45 @@ static ivar_t *ivar_list_nth(const ivar_list_t *ilist, uint32_t i) } +static method_list_t *cat_method_list(const category_t *cat, BOOL isMeta) +{ + if (!cat) return NULL; + + if (isMeta) return cat->classMethods; + else return cat->instanceMethods; +} + +static uint32_t cat_method_count(const category_t *cat, BOOL isMeta) +{ + method_list_t *cmlist = cat_method_list(cat, isMeta); + return cmlist ? cmlist->count : 0; +} + +static method_t *cat_method_nth(const category_t *cat, BOOL isMeta, uint32_t i) +{ + method_list_t *cmlist = cat_method_list(cat, isMeta); + if (!cmlist) return NULL; + + return method_list_nth(cmlist, i); +} + + +// part of ivar_t, with non-deprecated alignment +typedef struct { + uintptr_t *offset; + const char *name; + const char *type; + uint32_t alignment; +} ivar_alignment_t; + +static uint32_t ivar_alignment(const ivar_t *ivar) +{ + uint32_t alignment = ((ivar_alignment_t *)ivar)->alignment; + if (alignment == (uint32_t)-1) alignment = (uint32_t)WORD_SHIFT; + return 1<flags & RW_COPIED_RO) { // already writeable, do nothing @@ -141,7 +929,7 @@ static class_ro_t *make_ro_writeable(class_rw_t *rw) **********************************************************************/ static NXMapTable *unattachedCategories(void) { - OBJC_CHECK_LOCKED(&runtimeLock); + rwlock_assert_writing(&runtimeLock); static NXMapTable *category_map = NULL; @@ -160,9 +948,12 @@ static NXMapTable *unattachedCategories(void) * Records an unattached category. * Locking: runtimeLock must be held by the caller. **********************************************************************/ -static void addUnattachedCategoryForClass(category_t *cat, class_t *cls) +static void addUnattachedCategoryForClass(category_t *cat, class_t *cls, + header_info *catHeader) { - OBJC_CHECK_LOCKED(&runtimeLock); + rwlock_assert_writing(&runtimeLock); + + BOOL catFromBundle = (catHeader->mhdr->filetype == MH_BUNDLE) ? YES: NO; // DO NOT use cat->cls! // cls may be cat->cls->isa, or cat->cls may have been remapped. @@ -171,11 +962,11 @@ static void addUnattachedCategoryForClass(category_t *cat, class_t *cls) list = NXMapGet(cats, cls); if (!list) { - list = _calloc_internal(sizeof(*list) + sizeof(category_t *), 1); + list = _calloc_internal(sizeof(*list) + sizeof(list->list[0]), 1); } else { - list = _realloc_internal(list, sizeof(*list) + sizeof(category_t *) * (list->count + 1)); + list = _realloc_internal(list, sizeof(*list) + sizeof(list->list[0]) * (list->count + 1)); } - list->list[list->count++] = cat; + list->list[list->count++] = (category_pair_t){cat, catFromBundle}; NXMapInsert(cats, cls, list); } @@ -187,7 +978,7 @@ static void addUnattachedCategoryForClass(category_t *cat, class_t *cls) **********************************************************************/ static void removeUnattachedCategoryForClass(category_t *cat, class_t *cls) { - OBJC_CHECK_LOCKED(&runtimeLock); + rwlock_assert_writing(&runtimeLock); // DO NOT use cat->cls! // cls may be cat->cls->isa, or cat->cls may have been remapped. @@ -199,10 +990,10 @@ static void removeUnattachedCategoryForClass(category_t *cat, class_t *cls) uint32_t i; for (i = 0; i < list->count; i++) { - if (list->list[i] == cat) { + if (list->list[i].cat == cat) { // shift entries to preserve list order memmove(&list->list[i], &list->list[i+1], - (list->count-i-1) * sizeof(category_t *)); + (list->count-i-1) * sizeof(list->list[i])); list->count--; return; } @@ -219,94 +1010,202 @@ static void removeUnattachedCategoryForClass(category_t *cat, class_t *cls) **********************************************************************/ static category_list *unattachedCategoriesForClass(class_t *cls) { - OBJC_CHECK_LOCKED(&runtimeLock); + rwlock_assert_writing(&runtimeLock); return NXMapRemove(unattachedCategories(), cls); } /*********************************************************************** -* isRealized -* Returns YES if class cls has been realized. +* isRealized +* Returns YES if class cls has been realized. +* Locking: To prevent concurrent realization, hold runtimeLock. +**********************************************************************/ +static BOOL isRealized(class_t *cls) +{ + return (cls->data->flags & RW_REALIZED) ? YES : NO; +} + + +/*********************************************************************** +* isFuture +* Returns YES if class cls is an unrealized future class. * Locking: To prevent concurrent realization, hold runtimeLock. **********************************************************************/ -static BOOL isRealized(class_t *cls) +static BOOL isFuture(class_t *cls) { - return (cls->data->flags & RW_REALIZED) ? YES : NO; + return (cls->data->flags & RW_FUTURE) ? YES : NO; } /*********************************************************************** -* isMethodized. -* Returns YES if class cls has ever been methodized. -* Note that its method lists may still be out of date. -* Locking: To prevent concurrent methodization, hold runtimeLock. +* printReplacements +* Implementation of PrintReplacedMethods / OBJC_PRINT_REPLACED_METHODS. +* Warn about methods from cats that override other methods in cats or cls. +* Assumes no methods from cats have been added to cls yet. **********************************************************************/ -static BOOL isMethodized(class_t *cls) +static void printReplacements(class_t *cls, category_list *cats) +{ + uint32_t c; + BOOL isMeta = isMetaClass(cls); + + if (!cats) return; + + // Newest categories are LAST in cats + // Later categories override earlier ones. + for (c = 0; c < cats->count; c++) { + category_t *cat = cats->list[c].cat; + uint32_t cmCount = cat_method_count(cat, isMeta); + uint32_t m; + for (m = 0; m < cmCount; m++) { + uint32_t c2, m2; + method_t *meth2 = NULL; + method_t *meth = cat_method_nth(cat, isMeta, m); + SEL s = sel_registerName((const char *)meth->name); + + // Don't warn about GC-ignored selectors + if (s == (SEL)kIgnore) continue; + + // Look for method in earlier categories + for (c2 = 0; c2 < c; c2++) { + category_t *cat2 = cats->list[c2].cat; + uint32_t cm2Count = cat_method_count(cat2, isMeta); + for (m2 = 0; m2 < cm2Count; m2++) { + meth2 = cat_method_nth(cat2, isMeta, m2); + SEL s2 = sel_registerName((const char *)meth2->name); + if (s == s2) goto whine; + } + } + + // Look for method in cls + FOREACH_METHOD_LIST(mlist, cls, { + for (m2 = 0; m2 < mlist->count; m2++) { + meth2 = method_list_nth(mlist, m2); + SEL s2 = sel_registerName((const char *)meth2->name); + if (s == s2) goto whine; + } + }); + + // Didn't find any override. + continue; + + whine: + // Found an override. + logReplacedMethod(getName(cls), s, isMetaClass(cls), cat->name, + _method_getImplementation(meth2), + _method_getImplementation(meth)); + } + } +} + + +static BOOL isBundleClass(class_t *cls) { - if (!isRealized(cls)) return NO; - return (cls->data->flags & RW_METHODIZED) ? YES : NO; + return (cls->data->ro->flags & RO_FROM_BUNDLE) ? YES : NO; } -static chained_method_list * -buildMethodList(const method_list_t *mlist, category_list *cats, BOOL isMeta) + +static void +fixupMethodList(method_list_t *mlist, BOOL bundleCopy) { - // Do NOT use cat->cls! It may have been remapped. - chained_method_list *newlist; - uint32_t count = 0; - uint32_t m, c; + assert(!isMethodListFixedUp(mlist)); - // Count methods in all lists. - if (mlist) count = mlist->count; - if (cats) { - for (c = 0; c < cats->count; c++) { - if (isMeta && cats->list[c]->classMethods) { - count += cats->list[c]->classMethods->count; - } - else if (!isMeta && cats->list[c]->instanceMethods) { - count += cats->list[c]->instanceMethods->count; - } + // fixme lock less in attachMethodLists ? + sel_lock(); + + uint32_t m; + for (m = 0; m < mlist->count; m++) { + method_t *meth = method_list_nth(mlist, m); + SEL sel = sel_registerNameNoLock((const char *)meth->name, bundleCopy); + meth->name = sel; + + if (sel == (SEL)kIgnore) { + meth->imp = (IMP)&_objc_ignored_method; } } - - // Allocate new list. - newlist = _malloc_internal(sizeof(*newlist) + count * sizeof(method_t)); - newlist->count = 0; - newlist->next = NULL; - // Copy methods; newest categories first, then ordinary methods - if (cats) { - c = cats->count; - while (c--) { - method_list_t *cmlist; - if (isMeta) { - cmlist = cats->list[c]->classMethods; - } else { - cmlist = cats->list[c]->instanceMethods; - } - if (cmlist) { - for (m = 0; m < cmlist->count; m++) { - newlist->list[newlist->count++] = - *method_list_nth(cmlist, m); - } - } - } + sel_unlock(); + + setMethodListFixedUp(mlist); +} + +static void +attachMethodLists(class_t *cls, method_list_t **lists, int count, + BOOL methodsFromBundle, BOOL *outVtablesAffected) +{ + rwlock_assert_writing(&runtimeLock); + + BOOL vtablesAffected = NO; + size_t listsSize = count * sizeof(*lists); + + // Create or extend method list array + // Leave `count` empty slots at the start of the array to be filled below. + + if (!cls->data->methods) { + // no bonus method lists yet + cls->data->methods = _calloc_internal(1 + count, sizeof(*lists)); + } else { + size_t oldSize = malloc_size(cls->data->methods); + cls->data->methods = + _realloc_internal(cls->data->methods, oldSize + listsSize); + memmove(cls->data->methods + count, cls->data->methods, oldSize); } - if (mlist) { - for (m = 0; m < mlist->count; m++) { - newlist->list[newlist->count++] = *method_list_nth(mlist, m); + + // Add method lists to array. + // Reallocate un-fixed method lists. + + int i; + for (i = 0; i < count; i++) { + method_list_t *mlist = lists[i]; + if (!mlist) continue; + + // Fixup selectors if necessary + if (!isMethodListFixedUp(mlist)) { + mlist = _memdup_internal(mlist, method_list_size(mlist)); + fixupMethodList(mlist, methodsFromBundle); + } + + // Scan for vtable updates + if (outVtablesAffected && !vtablesAffected) { + uint32_t m; + for (m = 0; m < mlist->count; m++) { + SEL sel = method_list_nth(mlist, m)->name; + if (vtable_containsSelector(sel)) vtablesAffected = YES; + } } + + // Fill method list array + cls->data->methods[i] = mlist; } - assert(newlist->count == count); - for (m = 0; m < newlist->count; m++) { - newlist->list[m].name = - sel_registerName((const char *)newlist->list[m].name); - if (newlist->list[m].name == (SEL)kRTAddress_ignoredSelector) { - newlist->list[m].imp = (IMP)&_objc_ignored_method; + if (outVtablesAffected) *outVtablesAffected = vtablesAffected; +} + +static void +attachCategoryMethods(class_t *cls, category_list *cats, + BOOL *outVtablesAffected) +{ + if (!cats) return; + if (PrintReplacedMethods) printReplacements(cls, cats); + + BOOL isMeta = isMetaClass(cls); + method_list_t **mlists = _malloc_internal(cats->count * sizeof(*mlists)); + + // Count backwards through cats to get newest categories first + int mcount = 0; + int i = cats->count; + BOOL fromBundle = NO; + while (i--) { + method_list_t *mlist = cat_method_list(cats->list[i].cat, isMeta); + if (mlist) { + mlists[mcount++] = mlist; + fromBundle |= cats->list[i].fromBundle; } } - return newlist; + attachMethodLists(cls, mlists, mcount, fromBundle, outVtablesAffected); + + _free_internal(mlists); + } @@ -322,13 +1221,14 @@ buildPropertyList(const struct objc_property_list *plist, category_list *cats, B if (plist) count = plist->count; if (cats) { for (c = 0; c < cats->count; c++) { + category_t *cat = cats->list[c].cat; /* - if (isMeta && cats->list[c]->classProperties) { - count += cats->list[c]->classProperties->count; + if (isMeta && cat->classProperties) { + count += cat->classProperties->count; } else*/ - if (!isMeta && cats->list[c]->instanceProperties) { - count += cats->list[c]->instanceProperties->count; + if (!isMeta && cat->instanceProperties) { + count += cat->instanceProperties->count; } } } @@ -345,12 +1245,13 @@ buildPropertyList(const struct objc_property_list *plist, category_list *cats, B c = cats->count; while (c--) { struct objc_property_list *cplist; + category_t *cat = cats->list[c].cat; /* if (isMeta) { - cplist = cats->list[c]->classProperties; + cplist = cat->classProperties; } else */ { - cplist = cats->list[c]->instanceProperties; + cplist = cat->instanceProperties; } if (cplist) { for (p = 0; p < cplist->count; p++) { @@ -387,7 +1288,7 @@ buildProtocolList(category_list *cats, struct protocol_list_t *base, // count protocol lists in cats if (cats) for (i = 0; i < cats->count; i++) { - category_t *cat = cats->list[i]; + category_t *cat = cats->list[i].cat; if (cat->protocols) count++; } @@ -414,7 +1315,7 @@ buildProtocolList(category_list *cats, struct protocol_list_t *base, } if (cats) for (i = 0; i < cats->count; i++) { - category_t *cat = cats->list[i]; + category_t *cat = cats->list[i].cat; if (cat->protocols) { *newp++ = cat->protocols; } @@ -430,90 +1331,110 @@ buildProtocolList(category_list *cats, struct protocol_list_t *base, * methodizeClass * Fixes up cls's method list, protocol list, and property list. * Attaches any outstanding categories. +* Builds vtable. * Locking: runtimeLock must be held by the caller **********************************************************************/ static void methodizeClass(struct class_t *cls) { - OBJC_CHECK_LOCKED(&runtimeLock); - category_list *cats; + BOOL isMeta; - if (!cls) return; - assert(isRealized(cls)); + rwlock_assert_writing(&runtimeLock); - if (!(cls->data->flags & RW_METHODIZED)) { - // Methodizing for the first time - if (PrintConnecting) { - _objc_inform("CLASS: methodizing class '%s' %s", - getName(cls), - isMetaClass(cls) ? "(meta)" : ""); - } - - // Build method and protocol and property lists. - // Include methods and protocols and properties from categories, if any - // Do NOT use cat->cls! It may have been remapped. - cats = unattachedCategoriesForClass(cls); - if (cats || cls->data->ro->baseMethods) { - cls->data->methods = - buildMethodList(cls->data->ro->baseMethods, cats, - isMetaClass(cls)); - } + isMeta = isMetaClass(cls); - if (cats || cls->data->ro->baseProperties) { - cls->data->properties = - buildPropertyList(cls->data->ro->baseProperties, cats, - isMetaClass(cls)); - } + // Methodizing for the first time + if (PrintConnecting) { + _objc_inform("CLASS: methodizing class '%s' %s", + getName(cls), isMeta ? "(meta)" : ""); + } + + // Build method and protocol and property lists. + // Include methods and protocols and properties from categories, if any + // Do NOT use cat->cls! It may have been remapped. - if (cats || cls->data->ro->baseProtocols) { - cls->data->protocols = - buildProtocolList(cats, cls->data->ro->baseProtocols, NULL); - } + attachMethodLists(cls, (method_list_t **)&cls->data->ro->baseMethods, 1, + isBundleClass(cls), NULL); - if (PrintConnecting) { - uint32_t i; - if (cats) for (i = 0; i < cats->count; i++) { + cats = unattachedCategoriesForClass(cls); + attachCategoryMethods(cls, cats, NULL); + + if (cats || cls->data->ro->baseProperties) { + cls->data->properties = + buildPropertyList(cls->data->ro->baseProperties, cats, isMeta); + } + + if (cats || cls->data->ro->baseProtocols) { + cls->data->protocols = + buildProtocolList(cats, cls->data->ro->baseProtocols, NULL); + } + + if (PrintConnecting) { + uint32_t i; + if (cats) { + for (i = 0; i < cats->count; i++) { _objc_inform("CLASS: attached category %c%s(%s)", - isMetaClass(cls) ? '+' : '-', - getName(cls), cats->list[i]->name); + isMeta ? '+' : '-', + getName(cls), cats->list[i].cat->name); } } + } + + if (cats) _free_internal(cats); - if (cats) _free_internal(cats); + // No vtable until +initialize completes + assert(cls->vtable == _objc_empty_vtable); +} - cls->data->flags |= RW_METHODIZED; - } - else { - // Re-methodizing: check for more categories - if ((cats = unattachedCategoriesForClass(cls))) { - chained_method_list *newlist; - chained_property_list *newproperties; - struct protocol_list_t **newprotos; - - if (PrintConnecting) { - _objc_inform("CLASS: attaching categories to class '%s' %s", - getName(cls), - isMetaClass(cls) ? "(meta)" : ""); - } - newlist = buildMethodList(NULL, cats, isMetaClass(cls)); - newlist->next = cls->data->methods; - cls->data->methods = newlist; +/*********************************************************************** +* remethodizeClass +* Attach outstanding categories to an existing class. +* Fixes up cls's method list, protocol list, and property list. +* Updates method caches and vtables for cls and its subclasses. +* Locking: runtimeLock must be held by the caller +**********************************************************************/ +static void remethodizeClass(struct class_t *cls) +{ + category_list *cats; + BOOL isMeta; - newproperties = buildPropertyList(NULL, cats, isMetaClass(cls)); - if (newproperties) { - newproperties->next = cls->data->properties; - cls->data->properties = newproperties; - } + rwlock_assert_writing(&runtimeLock); - newprotos = buildProtocolList(cats, NULL, cls->data->protocols); - if (cls->data->protocols && cls->data->protocols != newprotos) { - _free_internal(cls->data->protocols); - } - cls->data->protocols = newprotos; + isMeta = isMetaClass(cls); - _free_internal(cats); + // Re-methodizing: check for more categories + if ((cats = unattachedCategoriesForClass(cls))) { + chained_property_list *newproperties; + struct protocol_list_t **newprotos; + BOOL vtableAffected = NO; + + if (PrintConnecting) { + _objc_inform("CLASS: attaching categories to class '%s' %s", + getName(cls), isMeta ? "(meta)" : ""); + } + + // Update methods, properties, protocols + + attachCategoryMethods(cls, cats, &vtableAffected); + + newproperties = buildPropertyList(NULL, cats, isMeta); + if (newproperties) { + newproperties->next = cls->data->properties; + cls->data->properties = newproperties; } + + newprotos = buildProtocolList(cats, NULL, cls->data->protocols); + if (cls->data->protocols && cls->data->protocols != newprotos) { + _free_internal(cls->data->protocols); + } + cls->data->protocols = newprotos; + + _free_internal(cats); + + // Update method caches and vtables + flushCaches(cls); + if (vtableAffected) flushVtables(cls); } } @@ -523,107 +1444,178 @@ static void methodizeClass(struct class_t *cls) * Atomically sets and clears some bits in cls's info field. * set and clear must not overlap. **********************************************************************/ -static OBJC_DECLARE_LOCK(infoLock); -// fixme use atomic ops instead of lock static void changeInfo(class_t *cls, unsigned int set, unsigned int clear) { - assert(isRealized(cls)); - OBJC_LOCK(&infoLock); - cls->data->flags = (cls->data->flags | set) & ~clear; - OBJC_UNLOCK(&infoLock); + uint32_t oldf, newf; + + assert(isFuture(cls) || isRealized(cls)); + + do { + oldf = cls->data->flags; + newf = (oldf | set) & ~clear; + } while (!OSAtomicCompareAndSwap32Barrier(oldf, newf, (volatile int32_t *)&cls->data->flags)); } /*********************************************************************** -* realizedClasses -* Returns the classname => class map for realized non-meta classes. -* Locking: runtimeLock must be held by the caller +* namedClasses +* Returns the classname => class map of all non-meta classes. +* Locking: runtimeLock must be read- or write-locked by the caller **********************************************************************/ -static NXMapTable *realizedClasses(void) + +NXMapTable *gdb_objc_realized_classes; // exported for debuggers in objc-gdb.h + +static NXMapTable *namedClasses(void) { - static NXMapTable *class_map = NULL; - - OBJC_CHECK_LOCKED(&runtimeLock); + rwlock_assert_locked(&runtimeLock); - if (class_map) return class_map; + INIT_ONCE_PTR(gdb_objc_realized_classes, + NXCreateMapTableFromZone(NXStrValueMapPrototype, 1024, + _objc_internal_zone()), + NXFreeMapTable(v) ); - // fixme this doesn't work yet - // class_map starts small, with only enough capacity for libobjc itself. - // If a second library is found by map_images(), class_hash is immediately - // resized to capacity 1024 to cut down on rehashes. - class_map = NXCreateMapTableFromZone(NXStrValueMapPrototype, 16, - _objc_internal_zone()); + return gdb_objc_realized_classes; +} - return class_map; + +/*********************************************************************** +* addNamedClass +* Adds name => cls to the named non-meta class map. +* Warns about duplicate class names and keeps the old mapping. +* Locking: runtimeLock must be held by the caller +**********************************************************************/ +static void addNamedClass(class_t *cls, const char *name) +{ + rwlock_assert_writing(&runtimeLock); + class_t *old; + if ((old = NXMapGet(namedClasses(), name))) { + inform_duplicate(name, (Class)old, (Class)cls); + } else { + NXMapInsert(namedClasses(), name, cls); + } + assert(!(cls->data->flags & RO_META)); + + // wrong: constructed classes are already realized when they get here + // assert(!isRealized(cls)); } /*********************************************************************** -* unrealizedClasses -* Returns the classname => class map for unrealized non-meta classes. +* removeNamedClass +* Removes cls from the name => cls map. * Locking: runtimeLock must be held by the caller **********************************************************************/ -static NXMapTable *unrealizedClasses(void) +static void removeNamedClass(class_t *cls, const char *name) { - static NXMapTable *class_map = NULL; + rwlock_assert_writing(&runtimeLock); + assert(!(cls->data->flags & RO_META)); + if (cls == NXMapGet(namedClasses(), name)) { + NXMapRemove(namedClasses(), name); + } else { + // cls has a name collision with another class - don't remove the other + } +} + + +/*********************************************************************** +* realizedClasses +* Returns the class list for realized non-meta classes. +* Locking: runtimeLock must be read- or write-locked by the caller +**********************************************************************/ +static NXHashTable *realizedClasses(void) +{ + static NXHashTable *class_hash = NULL; - OBJC_CHECK_LOCKED(&runtimeLock); + rwlock_assert_locked(&runtimeLock); - if (class_map) return class_map; + INIT_ONCE_PTR(class_hash, + NXCreateHashTableFromZone(NXPtrPrototype, 1024, NULL, + _objc_internal_zone()), + NXFreeHashTable(v)); - // fixme this doesn't work yet - // class_map starts small, with only enough capacity for libobjc itself. - // If a second library is found by map_images(), class_hash is immediately - // resized to capacity 1024 to cut down on rehashes. - class_map = NXCreateMapTableFromZone(NXStrValueMapPrototype, 16, - _objc_internal_zone()); + return class_hash; +} - return class_map; + +/*********************************************************************** +* realizedMetaclasses +* Returns the class list for realized metaclasses. +* Locking: runtimeLock must be read- or write-locked by the caller +**********************************************************************/ +static NXHashTable *realizedMetaclasses(void) +{ + static NXHashTable *class_hash = NULL; + + rwlock_assert_locked(&runtimeLock); + + INIT_ONCE_PTR(class_hash, + NXCreateHashTableFromZone(NXPtrPrototype, 1024, NULL, + _objc_internal_zone()), + NXFreeHashTable(v)); + + return class_hash; } /*********************************************************************** * addRealizedClass -* Adds name => cls to the realized non-meta class map. -* Also removes name => cls from the unrealized non-meta class map. +* Adds cls to the realized non-meta class hash. * Locking: runtimeLock must be held by the caller **********************************************************************/ -static void addRealizedClass(class_t *cls, const char *name) +static void addRealizedClass(class_t *cls) { - OBJC_CHECK_LOCKED(&runtimeLock); + rwlock_assert_writing(&runtimeLock); void *old; - old = NXMapInsert(realizedClasses(), name, cls); + old = NXHashInsert(realizedClasses(), cls); + objc_addRegisteredClass((Class)cls); assert(!isMetaClass(cls)); - NXMapRemove(unrealizedClasses(), name); + assert(!old); } /*********************************************************************** * removeRealizedClass -* Removes cls from the realized class map. +* Removes cls from the realized non-meta class hash. * Locking: runtimeLock must be held by the caller **********************************************************************/ static void removeRealizedClass(class_t *cls) { - OBJC_CHECK_LOCKED(&runtimeLock); - assert(isRealized(cls)); - assert(!isMetaClass(cls)); - NXMapRemove(realizedClasses(), cls->data->ro->name); + rwlock_assert_writing(&runtimeLock); + if (isRealized(cls)) { + assert(!isMetaClass(cls)); + NXHashRemove(realizedClasses(), cls); + objc_removeRegisteredClass((Class)cls); + } } /*********************************************************************** -* addUnrealizedClass -* Adds name => cls to the unrealized non-meta class map. +* addRealizedMetaclass +* Adds cls to the realized metaclass hash. * Locking: runtimeLock must be held by the caller **********************************************************************/ -static void addUnrealizedClass(class_t *cls, const char *name) +static void addRealizedMetaclass(class_t *cls) { - OBJC_CHECK_LOCKED(&runtimeLock); + rwlock_assert_writing(&runtimeLock); void *old; - old = NXMapInsert(unrealizedClasses(), name, cls); - assert(!isRealized(cls)); - assert(!(cls->data->flags & RO_META)); + old = NXHashInsert(realizedMetaclasses(), cls); + assert(isMetaClass(cls)); + assert(!old); +} + + +/*********************************************************************** +* removeRealizedMetaclass +* Removes cls from the realized metaclass hash. +* Locking: runtimeLock must be held by the caller +**********************************************************************/ +static void removeRealizedMetaclass(class_t *cls) +{ + rwlock_assert_writing(&runtimeLock); + if (isRealized(cls)) { + assert(isMetaClass(cls)); + NXHashRemove(realizedMetaclasses(), cls); + } } @@ -631,22 +1623,18 @@ static void addUnrealizedClass(class_t *cls, const char *name) * uninitializedClasses * Returns the metaclass => class map for un-+initialized classes * Replaces the 32-bit cls = objc_getName(metacls) during +initialize. -* Locking: runtimeLock must be held by the caller +* Locking: runtimeLock must be read- or write-locked by the caller **********************************************************************/ static NXMapTable *uninitializedClasses(void) { static NXMapTable *class_map = NULL; - OBJC_CHECK_LOCKED(&runtimeLock); + rwlock_assert_locked(&runtimeLock); - if (class_map) return class_map; - - // fixme this doesn't work yet - // class_map starts small, with only enough capacity for libobjc itself. - // If a second library is found by map_images(), class_hash is immediately - // resized to capacity 1024 to cut down on rehashes. - class_map = NXCreateMapTableFromZone(NXPtrValueMapPrototype, 16, - _objc_internal_zone()); + INIT_ONCE_PTR(class_map, + NXCreateMapTableFromZone(NXPtrValueMapPrototype, 1024, + _objc_internal_zone()), + NXFreeMapTable(v) ); return class_map; } @@ -659,7 +1647,7 @@ static NXMapTable *uninitializedClasses(void) **********************************************************************/ static void addUninitializedClass(class_t *cls, class_t *metacls) { - OBJC_CHECK_LOCKED(&runtimeLock); + rwlock_assert_writing(&runtimeLock); void *old; old = NXMapInsert(uninitializedClasses(), metacls, cls); assert(isRealized(metacls) ? isMetaClass(metacls) : metacls->data->flags & RO_META); @@ -670,11 +1658,27 @@ static void addUninitializedClass(class_t *cls, class_t *metacls) static void removeUninitializedClass(class_t *cls) { - OBJC_CHECK_LOCKED(&runtimeLock); + rwlock_assert_writing(&runtimeLock); NXMapRemove(uninitializedClasses(), cls->isa); } +/*********************************************************************** +* getNonMetaClass +* Return the ordinary class for this class or metaclass. +* Used by +initialize. +* Locking: runtimeLock must be read- or write-locked by the caller +**********************************************************************/ +static class_t *getNonMetaClass(class_t *cls) +{ + rwlock_assert_locked(&runtimeLock); + if (isMetaClass(cls)) { + cls = NXMapGet(uninitializedClasses(), cls); + } + return cls; +} + + /*********************************************************************** * _class_getNonMetaClass * Return the ordinary class for this class or metaclass. @@ -684,12 +1688,10 @@ static void removeUninitializedClass(class_t *cls) __private_extern__ Class _class_getNonMetaClass(Class cls_gen) { class_t *cls = newcls(cls_gen); - OBJC_LOCK(&runtimeLock); - if (isMetaClass(cls)) { - cls = NXMapGet(uninitializedClasses(), cls); - realizeClass(cls); - } - OBJC_UNLOCK(&runtimeLock); + rwlock_write(&runtimeLock); + cls = getNonMetaClass(cls); + realizeClass(cls); + rwlock_unlock_write(&runtimeLock); return (Class)cls; } @@ -703,7 +1705,7 @@ __private_extern__ Class _class_getNonMetaClass(Class cls_gen) **********************************************************************/ static NXMapTable *futureClasses(void) { - OBJC_CHECK_LOCKED(&runtimeLock); + rwlock_assert_writing(&runtimeLock); static NXMapTable *future_class_map = NULL; @@ -724,13 +1726,17 @@ static NXMapTable *futureClasses(void) **********************************************************************/ static void addFutureClass(const char *name, class_t *cls) { - OBJC_CHECK_LOCKED(&runtimeLock); + void *old; + + rwlock_assert_writing(&runtimeLock); if (PrintFuture) { _objc_inform("FUTURE: reserving %p for %s", cls, name); } - void *old; + cls->data = _calloc_internal(sizeof(*cls->data), 1); + cls->data->flags = RO_FUTURE; + old = NXMapKeyCopyingInsert(futureClasses(), name, cls); assert(!old); } @@ -744,7 +1750,7 @@ static void addFutureClass(const char *name, class_t *cls) **********************************************************************/ static void removeFutureClass(const char *name) { - OBJC_CHECK_LOCKED(&runtimeLock); + rwlock_assert_writing(&runtimeLock); NXMapKeyFreeingRemove(futureClasses(), name); } @@ -753,22 +1759,22 @@ static void removeFutureClass(const char *name) /*********************************************************************** * remappedClasses * Returns the oldClass => newClass map for realized future classes. -* Locking: remapLock must be held by the caller +* Locking: runtimeLock must be read- or write-locked by the caller **********************************************************************/ -static OBJC_DECLARE_LOCK(remapLock); static NXMapTable *remappedClasses(BOOL create) { static NXMapTable *remapped_class_map = NULL; - OBJC_CHECK_LOCKED(&remapLock); + rwlock_assert_locked(&runtimeLock); if (remapped_class_map) return remapped_class_map; - if (!create) return NULL; // remapped_class_map is big enough to hold CF's classes and a few others - remapped_class_map = NXCreateMapTableFromZone(NXPtrValueMapPrototype, 32, - _objc_internal_zone()); + INIT_ONCE_PTR(remapped_class_map, + NXCreateMapTableFromZone(NXPtrValueMapPrototype, 32, + _objc_internal_zone()), + NXFreeMapTable(v)); return remapped_class_map; } @@ -777,13 +1783,13 @@ static NXMapTable *remappedClasses(BOOL create) /*********************************************************************** * noClassesRemapped * Returns YES if no classes have been remapped -* Locking: acquires remapLock +* Locking: runtimeLock must be read- or write-locked by the caller **********************************************************************/ static BOOL noClassesRemapped(void) { - OBJC_LOCK(&remapLock); + rwlock_assert_locked(&runtimeLock); + BOOL result = (remappedClasses(NO) == NULL); - OBJC_UNLOCK(&remapLock); return result; } @@ -791,11 +1797,11 @@ static BOOL noClassesRemapped(void) /*********************************************************************** * addRemappedClass * newcls is a realized future class, replacing oldcls. -* Locking: acquires remapLock +* Locking: runtimeLock must be write-locked by the caller **********************************************************************/ static void addRemappedClass(class_t *oldcls, class_t *newcls) { - OBJC_LOCK(&remapLock); + rwlock_assert_writing(&runtimeLock); if (PrintFuture) { _objc_inform("FUTURE: using %p instead of %p for %s", @@ -805,8 +1811,6 @@ static void addRemappedClass(class_t *oldcls, class_t *newcls) void *old; old = NXMapInsert(remappedClasses(YES), oldcls, newcls); assert(!old); - - OBJC_UNLOCK(&remapLock); } @@ -814,13 +1818,13 @@ static void addRemappedClass(class_t *oldcls, class_t *newcls) * remapClass * Returns the live class pointer for cls, which may be pointing to * a class struct that has been reallocated. -* Locking: acquires remapLock +* Locking: runtimeLock must be read- or write-locked by the caller **********************************************************************/ static class_t *remapClass(class_t *cls) { - OBJC_LOCK(&remapLock); + rwlock_assert_locked(&runtimeLock); + class_t *newcls = NXMapGet(remappedClasses(YES), cls); - OBJC_UNLOCK(&remapLock); return newcls ? newcls : cls; } @@ -828,10 +1832,12 @@ static class_t *remapClass(class_t *cls) /*********************************************************************** * remapClassRef * Fix up a class ref, in case the class referenced has been reallocated. -* Locking: acquires remapLock +* Locking: runtimeLock must be read- or write-locked by the caller **********************************************************************/ static void remapClassRef(class_t **clsref) { + rwlock_assert_locked(&runtimeLock); + class_t *newcls = remapClass(*clsref); if (*clsref != newcls) *clsref = newcls; } @@ -844,7 +1850,7 @@ static void remapClassRef(class_t **clsref) **********************************************************************/ static void addSubclass(class_t *supercls, class_t *subcls) { - OBJC_CHECK_LOCKED(&runtimeLock); + rwlock_assert_writing(&runtimeLock); if (supercls && subcls) { assert(isRealized(supercls)); @@ -862,7 +1868,7 @@ static void addSubclass(class_t *supercls, class_t *subcls) **********************************************************************/ static void removeSubclass(class_t *supercls, class_t *subcls) { - OBJC_CHECK_LOCKED(&runtimeLock); + rwlock_assert_writing(&runtimeLock); assert(getSuperclass(subcls) == supercls); class_t **cp; @@ -879,22 +1885,18 @@ static void removeSubclass(class_t *supercls, class_t *subcls) /*********************************************************************** * protocols * Returns the protocol name => protocol map for protocols. -* Locking: runtimeLock must be held by the caller +* Locking: runtimeLock must read- or write-locked by the caller **********************************************************************/ static NXMapTable *protocols(void) { static NXMapTable *protocol_map = NULL; - OBJC_CHECK_LOCKED(&runtimeLock); + rwlock_assert_locked(&runtimeLock); - if (protocol_map) return protocol_map; - - // fixme this doesn't work yet - // class_map starts small, with only enough capacity for libobjc itself. - // If a second library is found by map_images(), class_hash is immediately - // resized to capacity 1024 to cut down on rehashes. - protocol_map = NXCreateMapTableFromZone(NXStrValueMapPrototype, 16, - _objc_internal_zone()); + INIT_ONCE_PTR(protocol_map, + NXCreateMapTableFromZone(NXStrValueMapPrototype, 16, + _objc_internal_zone()), + NXFreeMapTable(v) ); return protocol_map; } @@ -904,25 +1906,27 @@ static NXMapTable *protocols(void) * remapProtocol * Returns the live protocol pointer for proto, which may be pointing to * a protocol struct that has been reallocated. -* Locking: fixme +* Locking: runtimeLock must be read- or write-locked by the caller **********************************************************************/ -static protocol_t *remapProtocol(protocol_t *proto) +static protocol_t *remapProtocol(protocol_ref_t proto) { - // OBJC_LOCK(&remapLock); - protocol_t *newproto = NXMapGet(protocols(), proto->name); - // OBJC_UNLOCK(&remapLock); - return newproto ? newproto : proto; + rwlock_assert_locked(&runtimeLock); + + protocol_t *newproto = NXMapGet(protocols(), ((protocol_t *)proto)->name); + return newproto ? newproto : (protocol_t *)proto; } /*********************************************************************** * remapProtocolRef * Fix up a protocol ref, in case the protocol referenced has been reallocated. -* Locking: fixme +* Locking: runtimeLock must be read- or write-locked by the caller **********************************************************************/ static void remapProtocolRef(protocol_t **protoref) { - protocol_t *newproto = remapProtocol(*protoref); + rwlock_assert_locked(&runtimeLock); + + protocol_t *newproto = remapProtocol((protocol_ref_t)*protoref); if (*protoref != newproto) *protoref = newproto; } @@ -937,79 +1941,81 @@ static void remapProtocolRef(protocol_t **protoref) static void moveIvars(class_ro_t *ro, uint32_t superSize, layout_bitmap *ivarBitmap, layout_bitmap *weakBitmap) { - OBJC_CHECK_LOCKED(&runtimeLock); + rwlock_assert_writing(&runtimeLock); uint32_t diff; - uint32_t gcdiff; uint32_t i; assert(superSize > ro->instanceStart); diff = superSize - ro->instanceStart; - gcdiff = diff; - *(uint32_t *)&ro->instanceStart += diff; if (ro->ivars) { + // Find maximum alignment in this class's ivars + uint32_t maxAlignment = 1; + for (i = 0; i < ro->ivars->count; i++) { + ivar_t *ivar = ivar_list_nth(ro->ivars, i); + if (!ivar->offset) continue; // anonymous bitfield + + uint32_t alignment = ivar_alignment(ivar); + if (alignment > maxAlignment) maxAlignment = alignment; + } + + // Compute a slide value that preserves that alignment + uint32_t alignMask = maxAlignment - 1; + if (diff & alignMask) diff = (diff + alignMask) & ~alignMask; + + // Slide all of this class's ivars en masse for (i = 0; i < ro->ivars->count; i++) { ivar_t *ivar = ivar_list_nth(ro->ivars, i); - // naively slide ivar + if (!ivar->offset) continue; // anonymous bitfield + uint32_t oldOffset = (uint32_t)*ivar->offset; uint32_t newOffset = oldOffset + diff; - // realign if needed - uint32_t alignMask = (1<alignment)-1; - if (newOffset & alignMask) { - uint32_t alignedOffset = (newOffset + alignMask) & ~alignMask; - assert(alignedOffset > newOffset); - diff += alignedOffset - newOffset; - gcdiff += alignedOffset - newOffset; - newOffset = alignedOffset; - } - // newOffset is ready *ivar->offset = newOffset; - // update ivar layouts - if (gcdiff != 0 && (oldOffset & 7) == 0) { - // this ivar's alignment hasn't been accounted for yet - if (ivarBitmap) { - layout_bitmap_slide(ivarBitmap, - (newOffset-gcdiff)>>3, newOffset>>3); - } - if (weakBitmap) { - layout_bitmap_slide(weakBitmap, - (newOffset-gcdiff)>>3, newOffset>>3); - } - gcdiff = 0; - } if (PrintIvars) { _objc_inform("IVARS: offset %u -> %u for %s (size %u, align %u)", oldOffset, newOffset, ivar->name, - ivar->size, 1<alignment); + ivar->size, ivar_alignment(ivar)); } } + + // Slide GC layouts + uint32_t oldOffset = ro->instanceStart; + uint32_t newOffset = ro->instanceStart + diff; + + if (ivarBitmap) { + layout_bitmap_slide(ivarBitmap, + oldOffset >> WORD_SHIFT, + newOffset >> WORD_SHIFT); + } + if (weakBitmap) { + layout_bitmap_slide(weakBitmap, + oldOffset >> WORD_SHIFT, + newOffset >> WORD_SHIFT); + } } - *(uint32_t *)&ro->instanceSize += diff; // diff now includes alignment pad + *(uint32_t *)&ro->instanceStart += diff; + *(uint32_t *)&ro->instanceSize += diff; if (!ro->ivars) { // No ivars slid, but superclass changed size. // Expand bitmap in preparation for layout_bitmap_splat(). - if (ivarBitmap) layout_bitmap_grow(ivarBitmap, ro->instanceSize>>3); - if (weakBitmap) layout_bitmap_grow(weakBitmap, ro->instanceSize>>3); + if (ivarBitmap) layout_bitmap_grow(ivarBitmap, ro->instanceSize >> WORD_SHIFT); + if (weakBitmap) layout_bitmap_grow(weakBitmap, ro->instanceSize >> WORD_SHIFT); } - -#if !__LP64__ -#error wrong word size used in this function -#endif } /*********************************************************************** * getIvar * Look up an ivar by name. -* Locking: runtimeLock must be held by the caller. +* Locking: runtimeLock must be read- or write-locked by the caller. **********************************************************************/ static ivar_t *getIvar(class_t *cls, const char *name) { - OBJC_CHECK_LOCKED(&runtimeLock); + rwlock_assert_locked(&runtimeLock); const ivar_list_t *ivars; assert(isRealized(cls)); @@ -1017,6 +2023,8 @@ static ivar_t *getIvar(class_t *cls, const char *name) uint32_t i; for (i = 0; i < ivars->count; i++) { struct ivar_t *ivar = ivar_list_nth(ivars, i); + if (!ivar->offset) continue; // anonymous bitfield + // ivar->name may be NULL for anonymous bitfields etc. if (ivar->name && 0 == strcmp(name, ivar->name)) { return ivar; @@ -1033,11 +2041,11 @@ static ivar_t *getIvar(class_t *cls, const char *name) * Performs first-time initialization on class cls, * including allocating its read-write data. * Returns the real class structure for the class. -* Locking: runtimeLock must be held by the caller +* Locking: runtimeLock must be write-locked by the caller **********************************************************************/ static class_t *realizeClass(class_t *cls) { - OBJC_CHECK_LOCKED(&runtimeLock); + rwlock_assert_writing(&runtimeLock); const class_ro_t *ro; class_rw_t *rw; @@ -1050,22 +2058,28 @@ static class_t *realizeClass(class_t *cls) assert(cls == remapClass(cls)); ro = (const class_ro_t *)cls->data; + if (ro->flags & RO_FUTURE) { + // This was a future class. rw data is already allocated. + rw = cls->data; + ro = cls->data->ro; + changeInfo(cls, RW_REALIZED, RW_FUTURE); + } else { + // Normal class. Allocate writeable class data. + rw = _calloc_internal(sizeof(class_rw_t), 1); + rw->ro = ro; + rw->flags = RW_REALIZED; + cls->data = rw; + } isMeta = (ro->flags & RO_META) ? YES : NO; + rw->version = isMeta ? 7 : 0; // old runtime went up to 6 + if (PrintConnecting) { _objc_inform("CLASS: realizing class '%s' %s %p %p", ro->name, isMeta ? "(meta)" : "", cls, ro); } - // Allocate writeable class data - rw = _calloc_internal(sizeof(class_rw_t), 1); - rw->flags = RW_REALIZED; - rw->version = isMeta ? 7 : 0; // old runtime went up to 6 - rw->ro = ro; - - cls->data = rw; - // Realize superclass and metaclass, if they aren't already. // This needs to be done after RW_REALIZED is set above, for root classes. supercls = realizeClass(remapClass(cls->superclass)); @@ -1083,9 +2097,11 @@ static class_t *realizeClass(class_t *cls) uint32_t i; for (i = 0; i < ro->ivars->count; i++) { ivar_t *ivar = ivar_list_nth(ro->ivars, i); + if (!ivar->offset) continue; // anonymous bitfield + _objc_inform("IVARS: %s.%s (offset %u, size %u, align %u)", ro->name, ivar->name, - *ivar->offset, ivar->size, 1<alignment); + *ivar->offset, ivar->size, ivar_alignment(ivar)); } } */ @@ -1147,6 +2163,7 @@ static class_t *realizeClass(class_t *cls) ro = rw->ro; moveIvars(ro_w, supercls->data->ro->instanceSize, UseGC ? &ivarBitmap : NULL, UseGC ? &weakBitmap : NULL); + gdb_objc_class_changed((Class)cls, OBJC_CLASS_IVARS_CHANGED, ro->name); layoutsChanged = YES; } @@ -1191,53 +2208,29 @@ static class_t *realizeClass(class_t *cls) addSubclass(supercls, cls); } + // Attach categories + methodizeClass(cls); + if (!isMeta) { - addRealizedClass(cls, cls->data->ro->name); + addRealizedClass(cls); } else { - // metaclasses don't go in the realized class map + addRealizedMetaclass(cls); } return cls; } -/*********************************************************************** -* getClass -* Looks up a class by name with no hints, and realizes it. -* Locking: runtimeLock must be held by the caller. -**********************************************************************/ -static class_t *getClass(const char *name) -{ - OBJC_CHECK_LOCKED(&runtimeLock); - - class_t *result; - - // Try realized classes - result = (class_t *)NXMapGet(realizedClasses(), name); - if (result) return result; - - // Try unrealized classes - result = (class_t *)NXMapGet(unrealizedClasses(), name); - if (result) return result; - -#if 0 - // Try a classname symbol - result = getClassBySymbol(NULL, name); - if (result) { - result = realizeClass(remapClass(result)); - return result; - } - - if (!result) { - // fixme suck - realizeAllClasses(); - result = (class_t *)NXMapGet(realizedClasses(), name); - } -#endif - +/*********************************************************************** +* getClass +* Looks up a class by name. The class MIGHT NOT be realized. +* Locking: runtimeLock must be read- or write-locked by the caller. +**********************************************************************/ +static class_t *getClass(const char *name) +{ + rwlock_assert_locked(&runtimeLock); - // darn - return NULL; + return (class_t *)NXMapGet(namedClasses(), name); } @@ -1248,7 +2241,7 @@ static class_t *getClass(const char *name) **********************************************************************/ static void realizeAllClassesInImage(header_info *hi) { - OBJC_CHECK_LOCKED(&runtimeLock); + rwlock_assert_writing(&runtimeLock); size_t count, i; class_t **classlist; @@ -1272,10 +2265,10 @@ static void realizeAllClassesInImage(header_info *hi) **********************************************************************/ static void realizeAllClasses(void) { - OBJC_CHECK_LOCKED(&runtimeLock); + rwlock_assert_writing(&runtimeLock); header_info *hi; - for (hi = _objc_headerStart(); hi; hi = hi->next) { + for (hi = FirstHeader; hi; hi = hi->next) { realizeAllClassesInImage(hi); } } @@ -1290,21 +2283,21 @@ static void realizeAllClasses(void) **********************************************************************/ __private_extern__ Class _objc_allocateFutureClass(const char *name) { - OBJC_LOCK(&runtimeLock); + rwlock_write(&runtimeLock); struct class_t *cls; NXMapTable *future_class_map = futureClasses(); if ((cls = NXMapGet(future_class_map, name))) { // Already have a future class for this name. - OBJC_UNLOCK(&runtimeLock); + rwlock_unlock_write(&runtimeLock); return (Class)cls; } - cls = _calloc_internal(sizeof(*cls), 1); + cls = (class_t *)_calloc_class(sizeof(*cls)); addFutureClass(name, cls); - OBJC_UNLOCK(&runtimeLock); + rwlock_unlock_write(&runtimeLock); return (Class)cls; } @@ -1318,62 +2311,75 @@ void objc_setFutureClass(Class cls, const char *name) } -static BOOL addrInSeg(const void *addr_ptr, const segmentType *segment, - ptrdiff_t slide) -{ - uintptr_t base = segment->vmaddr + slide; - uintptr_t addr = (uintptr_t)addr_ptr; - size_t size = segment->filesize; +#define FOREACH_REALIZED_SUBCLASS(_c, _cls, code) \ + do { \ + rwlock_assert_writing(&runtimeLock); \ + class_t *_top = _cls; \ + class_t *_c = _top; \ + if (_c) { \ + while (1) { \ + code \ + if (_c->data->firstSubclass) { \ + _c = _c->data->firstSubclass; \ + } else { \ + while (!_c->data->nextSiblingClass && _c != _top) { \ + _c = getSuperclass(_c); \ + } \ + if (_c == _top) break; \ + _c = _c->data->nextSiblingClass; \ + } \ + } \ + } else { \ + /* nil means all realized classes */ \ + NXHashTable *_classes = realizedClasses(); \ + NXHashTable *_metaclasses = realizedMetaclasses(); \ + NXHashState _state; \ + _state = NXInitHashState(_classes); \ + while (NXNextHashState(_classes, &_state, (void**)&_c)) \ + { \ + code \ + } \ + _state = NXInitHashState(_metaclasses); \ + while (NXNextHashState(_metaclasses, &_state, (void**)&_c)) \ + { \ + code \ + } \ + } \ + } while (0) - return (addr >= base && addr < base + size); -} -static BOOL ptrInImageList(header_info **hList, uint32_t hCount, - const void *ptr) +/*********************************************************************** +* flushVtables +* Rebuilds vtables for cls and its realized subclasses. +* If cls is Nil, all realized classes and metaclasses are touched. +* Locking: runtimeLock must be held by the caller. +**********************************************************************/ +static void flushVtables(class_t *cls) { - uint32_t i; + rwlock_assert_writing(&runtimeLock); - for (i = 0; i < hCount; i++) { - header_info *hi = hList[i]; - if (addrInSeg(ptr, hi->dataSegmentHeader, hi->image_slide)) { - return YES; - } + if (PrintVtables && !cls) { + _objc_inform("VTABLES: ### EXPENSIVE ### global vtable flush!"); } - return NO; + FOREACH_REALIZED_SUBCLASS(c, cls, { + updateVtable(c, NO); + }); } -#define FOREACH_SUBCLASS(c, cls, code) \ -do { \ - OBJC_CHECK_LOCKED(&runtimeLock); \ - class_t *top = cls; \ - class_t *c = top; \ - if (c) while (1) { \ - code \ - if (c->data->firstSubclass) { \ - c = c->data->firstSubclass; \ - } else { \ - while (!c->data->nextSiblingClass && c != top) { \ - c = getSuperclass(c); \ - } \ - if (c == top) break; \ - c = c->data->nextSiblingClass; \ - } \ - } \ -} while (0) - - /*********************************************************************** * flushCaches -* Flushes caches for cls and its subclasses. +* Flushes caches for cls and its realized subclasses. +* Does not update vtables. +* If cls is Nil, all realized and metaclasses classes are touched. * Locking: runtimeLock must be held by the caller. **********************************************************************/ static void flushCaches(class_t *cls) { - OBJC_CHECK_LOCKED(&runtimeLock); + rwlock_assert_writing(&runtimeLock); - FOREACH_SUBCLASS(c, cls, { + FOREACH_REALIZED_SUBCLASS(c, cls, { flush_cache((Class)c); }); } @@ -1381,15 +2387,95 @@ static void flushCaches(class_t *cls) /*********************************************************************** * flush_caches -* Flushes caches for cls, its subclasses, and optionally its metaclass. +* Flushes caches and rebuilds vtables for cls, its subclasses, +* and optionally its metaclass. * Locking: acquires runtimeLock **********************************************************************/ -__private_extern__ void flush_caches(Class cls, BOOL flush_meta) +__private_extern__ void flush_caches(Class cls_gen, BOOL flush_meta) +{ + class_t *cls = newcls(cls_gen); + rwlock_write(&runtimeLock); + // fixme optimize vtable flushing? (only needed for vtable'd selectors) + flushCaches(cls); + flushVtables(cls); + // don't flush root class's metaclass twice (it's a subclass of the root) + if (flush_meta && getSuperclass(cls)) { + flushCaches(cls->isa); + flushVtables(cls->isa); + } + rwlock_unlock_write(&runtimeLock); +} + + +/*********************************************************************** +* map_images +* Process the given images which are being mapped in by dyld. +* Calls ABI-agnostic code after taking ABI-specific locks. +* +* Locking: write-locks runtimeLock +**********************************************************************/ +__private_extern__ const char * +map_images(enum dyld_image_states state, uint32_t infoCount, + const struct dyld_image_info infoList[]) +{ + const char *err; + + rwlock_write(&runtimeLock); + err = map_images_nolock(state, infoCount, infoList); + rwlock_unlock_write(&runtimeLock); + return err; +} + + +/*********************************************************************** +* load_images +* Process +load in the given images which are being mapped in by dyld. +* Calls ABI-agnostic code after taking ABI-specific locks. +* +* Locking: write-locks runtimeLock and loadMethodLock +**********************************************************************/ +__private_extern__ const char * +load_images(enum dyld_image_states state, uint32_t infoCount, + const struct dyld_image_info infoList[]) +{ + BOOL found; + + recursive_mutex_lock(&loadMethodLock); + + // Discover load methods + rwlock_write(&runtimeLock); + found = load_images_nolock(state, infoCount, infoList); + rwlock_unlock_write(&runtimeLock); + + // Call +load methods (without runtimeLock - re-entrant) + if (found) { + call_load_methods(); + } + + recursive_mutex_unlock(&loadMethodLock); + + return NULL; +} + + +/*********************************************************************** +* unmap_image +* Process the given image which is about to be unmapped by dyld. +* mh is mach_header instead of headerType because that's what +* dyld_priv.h says even for 64-bit. +* +* Locking: write-locks runtimeLock and loadMethodLock +**********************************************************************/ +__private_extern__ void +unmap_image(const struct mach_header *mh, intptr_t vmaddr_slide) { - OBJC_LOCK(&runtimeLock); - flushCaches(newcls(cls)); - if (flush_meta) flushCaches(newcls(cls)->isa); - OBJC_UNLOCK(&runtimeLock); + recursive_mutex_lock(&loadMethodLock); + rwlock_write(&runtimeLock); + + unmap_image_nolock(mh, vmaddr_slide); + + rwlock_unlock_write(&runtimeLock); + recursive_mutex_unlock(&loadMethodLock); } @@ -1398,35 +2484,39 @@ __private_extern__ void flush_caches(Class cls, BOOL flush_meta) * Perform initial processing of the headers in the linked * list beginning with headerList. * -* Called by: map_images +* Called by: map_images_nolock * -* Locking: acquires runtimeLock +* Locking: runtimeLock acquired by map_images **********************************************************************/ __private_extern__ void _read_images(header_info **hList, uint32_t hCount) { header_info *hi; uint32_t hIndex; size_t count; - size_t i, j; + size_t i; class_t **resolvedFutureClasses = NULL; size_t resolvedFutureClassCount = 0; + static BOOL doneOnce; + + rwlock_assert_writing(&runtimeLock); + + if (!doneOnce) { + initVtables(); + doneOnce = YES; + } #define EACH_HEADER \ hIndex = 0; \ hIndex < hCount && (hi = hList[hIndex]); \ hIndex++ - OBJC_LOCK(&runtimeLock); - // Complain about images that contain old-ABI data // fixme new-ABI compiler still emits some bits into __OBJC segment for (EACH_HEADER) { size_t count; - if (_getObjcSelectorRefs(hi, &count) || - _getObjcModules(hi->mhdr, hi->image_slide, &count)) - { + if (_getObjcSelectorRefs(hi, &count) || _getObjcModules(hi, &count)) { _objc_inform("found old-ABI metadata in image %s !", - hi->dl_info.dli_fname); + hi->os.dl_info.dli_fname); } } @@ -1434,7 +2524,7 @@ __private_extern__ void _read_images(header_info **hList, uint32_t hCount) static BOOL hackedNSCFString = NO; if (!hackedNSCFString) { // Insert future class __CFConstantStringClassReference == NSCFString - void *dlh = dlopen("/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation", RTLD_LAZY | RTLD_NOLOAD | RTLD_FIRST); + void *dlh = dlopen("/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation", RTLD_LAZY | RTLD_NOLOAD | RTLD_FIRST); if (dlh) { void *addr = dlsym(dlh, "__CFConstantStringClassReference"); if (addr) { @@ -1445,7 +2535,7 @@ __private_extern__ void _read_images(header_info **hList, uint32_t hCount) } } - // Discover classes. Fix up unresolved future classes + // Discover classes. Fix up unresolved future classes. Mark bundle classes. NXMapTable *future_class_map = futureClasses(); for (EACH_HEADER) { class_t **classlist = _getObjc2ClassList(hi, &count); @@ -1454,7 +2544,13 @@ __private_extern__ void _read_images(header_info **hList, uint32_t hCount) if (NXCountMapTable(future_class_map) > 0) { class_t *newCls = NXMapGet(future_class_map, name); if (newCls) { + // Copy class_t to future class's struct. + // Preserve future's rw data block. + class_rw_t *rw = newCls->data; memcpy(newCls, classlist[i], sizeof(class_t)); + rw->ro = (class_ro_t *)newCls->data; + newCls->data = rw; + removeFutureClass(name); addRemappedClass(classlist[i], newCls); classlist[i] = newCls; @@ -1466,8 +2562,12 @@ __private_extern__ void _read_images(header_info **hList, uint32_t hCount) resolvedFutureClasses[resolvedFutureClassCount++] = newCls; } } - addUnrealizedClass(classlist[i], name); + addNamedClass(classlist[i], name); addUninitializedClass(classlist[i], classlist[i]->isa); + if (hi->mhdr->filetype == MH_BUNDLE) { + classlist[i]->data->flags |= RO_FROM_BUNDLE; + classlist[i]->isa->data->flags |= RO_FROM_BUNDLE; + } } } @@ -1492,6 +2592,19 @@ __private_extern__ void _read_images(header_info **hList, uint32_t hCount) // Fix up @selector references sel_lock(); for (EACH_HEADER) { + if (PrintPreopt) { + if (sel_preoptimizationValid(hi)) { + _objc_inform("PREOPTIMIZATION: honoring preoptimized selectors in %s", + _nameForHeader(hi->mhdr)); + } + else if (_objcHeaderOptimizedByDyld(hi)) { + _objc_inform("PREOPTIMIZATION: IGNORING preoptimized selectors in %s", + _nameForHeader(hi->mhdr)); + } + } + + if (sel_preoptimizationValid(hi)) continue; + SEL *sels = _getObjc2SelectorRefs(hi, &count); BOOL isBundle = hi->mhdr->filetype == MH_BUNDLE; for (i = 0; i < count; i++) { @@ -1531,22 +2644,24 @@ __private_extern__ void _read_images(header_info **hList, uint32_t hCount) for (i = 0; i < count; i++) { remapProtocolRef(&protocols[i]); } + } - protocols = _getObjc2ProtocolList(hi, &count); + // Realize non-lazy classes (for +load methods and static instances) + for (EACH_HEADER) { + class_t **classlist = + _getObjc2NonlazyClassList(hi, &count); for (i = 0; i < count; i++) { - protocol_t *protocol = NXMapGet(protocol_map, protocols[i]->name); - assert(protocol); - if (protocol == protocols[i] && protocol->protocols) { - if (PrintProtocols) { - _objc_inform("PROTOCOLS: remapping superprotocols of %p %s", - protocol, protocol->name); - } - for (j = 0; j < protocol->protocols->count; j++) { - remapProtocolRef(&protocol->protocols->list[j]); - } - } + realizeClass(remapClass(classlist[i])); } - } + } + + // Realize newly-resolved future classes, in case CF manipulates them + if (resolvedFutureClasses) { + for (i = 0; i < resolvedFutureClassCount; i++) { + realizeClass(resolvedFutureClasses[i]); + } + _free_internal(resolvedFutureClasses); + } // Discover categories. for (EACH_HEADER) { @@ -1559,23 +2674,19 @@ __private_extern__ void _read_images(header_info **hList, uint32_t hCount) // Process this category. // First, register the category with its target class. - // Then, flush the class's cache (and its subclasses) if - // the class is methodized. The ptrInImageList() check - // can discover !methodized without touching the class's memory. - // GrP fixme class's memory is already touched. + // Then, rebuild the class's method lists (etc) if + // the class is realized. BOOL classExists = NO; if (cat->instanceMethods || cat->protocols || cat->instanceProperties) { - addUnattachedCategoryForClass(cat, cls); - if (!ptrInImageList(hList, hCount, cls) && - isMethodized(cls)) - { - flushCaches(cls); + addUnattachedCategoryForClass(cat, cls, hi); + if (isRealized(cls)) { + remethodizeClass(cls); classExists = YES; } if (PrintConnecting) { - _objc_inform("CLASS: found category -%s(%s) %s\n", + _objc_inform("CLASS: found category -%s(%s) %s", getName(cls), cat->name, classExists ? "on existing class" : ""); } @@ -1584,11 +2695,9 @@ __private_extern__ void _read_images(header_info **hList, uint32_t hCount) if (cat->classMethods || cat->protocols /* || cat->classProperties */) { - addUnattachedCategoryForClass(cat, cls->isa); - if (!ptrInImageList(hList, hCount, cls->isa) && - isRealized(cls->isa)) - { - flushCaches(cls->isa); + addUnattachedCategoryForClass(cat, cls->isa, hi); + if (isRealized(cls->isa)) { + remethodizeClass(cls->isa); } if (PrintConnecting) { _objc_inform("CLASS: found category +%s(%s)", @@ -1598,29 +2707,11 @@ __private_extern__ void _read_images(header_info **hList, uint32_t hCount) } } + // Category discovery MUST BE LAST to avoid potential races + // when other threads call the new category code before + // this thread finishes its fixups. - // Realize non-lazy classes (for +load methods and static instances) - - for (EACH_HEADER) { - class_t **classlist = - _getObjc2NonlazyClassList(hi, &count); - for (i = 0; i < count; i++) { - realizeClass(remapClass(classlist[i])); - } - } - - // Realize newly-resolved future classes, in case CF manipulates them - if (resolvedFutureClasses) { - for (i = 0; i < resolvedFutureClassCount; i++) { - realizeClass(resolvedFutureClasses[i]); - } - _free_internal(resolvedFutureClasses); - } - - // +load handled by prepare_load_methods() - - - OBJC_UNLOCK(&runtimeLock); + // +load handled by prepare_load_methods() #undef EACH_HEADER } @@ -1650,7 +2741,7 @@ __private_extern__ void prepare_load_methods(header_info *hi) { size_t count, i; - OBJC_LOCK(&runtimeLock); + rwlock_assert_writing(&runtimeLock); class_t **classlist = _getObjc2NonlazyClassList(hi, &count); @@ -1668,20 +2759,20 @@ __private_extern__ void prepare_load_methods(header_info *hi) assert(isRealized(cls->isa)); add_category_to_loadable_list((Category)cat); } - - OBJC_UNLOCK(&runtimeLock); } /*********************************************************************** * _unload_image * Only handles MH_BUNDLE for now. +* Locking: write-lock and loadMethodLock acquired by unmap_image **********************************************************************/ __private_extern__ void _unload_image(header_info *hi) { size_t count, i; - OBJC_LOCK(&runtimeLock); + recursive_mutex_assert_locked(&loadMethodLock); + rwlock_assert_writing(&runtimeLock); // Unload unattached categories and categories waiting for +load. @@ -1703,44 +2794,16 @@ __private_extern__ void _unload_image(header_info *hi) class_t **classlist = _getObjc2ClassList(hi, &count); for (i = 0; i < count; i++) { class_t *cls = classlist[i]; - const char *name = getName(cls); // fixme remapped classes? - - // +load queue remove_class_from_loadable_list((Class)cls); - - // categories not yet attached to this class - category_list *cats; - cats = unattachedCategoriesForClass(cls); - if (cats) free(cats); - cats = unattachedCategoriesForClass(cls); - if (cats) free(cats); - - // subclass lists - class_t *supercls; - if ((supercls = getSuperclass(cls))) { - removeSubclass(supercls, cls); - } - if ((supercls = getSuperclass(cls->isa))) { - removeSubclass(supercls, cls->isa); - } - - // class tables - NXMapRemove(unrealizedClasses(), name); - NXMapRemove(realizedClasses(), name); - NXMapRemove(uninitializedClasses(), cls->isa); - - // the class itself - if (isRealized(cls->isa)) unload_class(cls->isa); - if (isRealized(cls)) unload_class(cls); + unload_class(cls->isa, YES); + unload_class(cls, NO); } // Clean up protocols. #warning fixme protocol unload // fixme DebugUnload - - OBJC_UNLOCK(&runtimeLock); } @@ -1762,14 +2825,17 @@ method_getDescription(Method m) * Returns this method's IMP. * Locking: none **********************************************************************/ +static IMP +_method_getImplementation(method_t *m) +{ + if (!m) return NULL; + return m->imp; +} + IMP method_getImplementation(Method m) { - if (!m) return NULL; - if (newmethod(m)->name == (SEL)kRTAddress_ignoredSelector) { - return (IMP)_objc_ignored_method; - } - return newmethod(m)->imp; + return _method_getImplementation(newmethod(m)); } @@ -1785,6 +2851,7 @@ method_getName(Method m_gen) { struct method_t *m = newmethod(m_gen); if (!m) return NULL; + assert((SEL)m->name == sel_registerName((char *)m->name)); return (SEL)m->name; } @@ -1809,39 +2876,81 @@ method_getTypeEncoding(Method m) * Sets this method's implementation to imp. * The previous implementation is returned. **********************************************************************/ -IMP -method_setImplementation(Method m, IMP imp) +static IMP +_method_setImplementation(class_t *cls, method_t *m, IMP imp) { - static OBJC_DECLARE_LOCK(impLock); - IMP old; + rwlock_assert_writing(&runtimeLock); - OBJC_LOCK(&impLock); - old = method_getImplementation(m); - newmethod(m)->imp = imp; - OBJC_UNLOCK(&impLock); + if (!m) return NULL; + if (!imp) return NULL; + + if (m->name == (SEL)kIgnore) { + // Ignored methods stay ignored + return m->imp; + } + + IMP old = _method_getImplementation(m); + m->imp = imp; + + // No cache flushing needed - cache contains Methods not IMPs. + + if (vtable_containsSelector(newmethod(m)->name)) { + // Will be slow if cls is NULL (i.e. unknown) + // fixme build list of classes whose Methods are known externally? + flushVtables(cls); + } - // No cache flushing needed. - // fixme update vtables if necessary // fixme update monomorphism if necessary + return old; } - -/*********************************************************************** -* _class_realize -* Realizes the given class. -* Called by _class_lookupMethodAndLoadCache only. -* Locking: acquires runtimeLock -**********************************************************************/ -__private_extern__ void -_class_realize(struct class_t *cls) +IMP +method_setImplementation(Method m, IMP imp) { - OBJC_LOCK(&runtimeLock); - realizeClass(cls); - OBJC_UNLOCK(&runtimeLock); + // Don't know the class - will be slow if vtables are affected + // fixme build list of classes whose Methods are known externally? + IMP result; + rwlock_write(&runtimeLock); + result = _method_setImplementation(Nil, newmethod(m), imp); + rwlock_unlock_write(&runtimeLock); + return result; } +void method_exchangeImplementations(Method m1_gen, Method m2_gen) +{ + method_t *m1 = newmethod(m1_gen); + method_t *m2 = newmethod(m2_gen); + if (!m1 || !m2) return; + + rwlock_write(&runtimeLock); + + if (m1->name == (SEL)kIgnore || m2->name == (SEL)kIgnore) { + // Ignored methods stay ignored. Now they're both ignored. + m1->imp = (IMP)&_objc_ignored_method; + m2->imp = (IMP)&_objc_ignored_method; + rwlock_unlock_write(&runtimeLock); + return; + } + + IMP m1_imp = m1->imp; + m1->imp = m2->imp; + m2->imp = m1_imp; + + if (vtable_containsSelector(m1->name) || + vtable_containsSelector(m2->name)) + { + // Don't know the class - will be slow if vtables are affected + // fixme build list of classes whose Methods are known externally? + flushVtables(NULL); + } + + // fixme update monomorphism if necessary + + rwlock_unlock_write(&runtimeLock); +} + /*********************************************************************** * ivar_getOffset @@ -1884,42 +2993,43 @@ ivar_getTypeEncoding(Ivar ivar) /*********************************************************************** * _protocol_getMethod_nolock -* Locking: runtimeLock must be held by the caller +* Locking: runtimeLock must be write-locked by the caller **********************************************************************/ static Method _protocol_getMethod_nolock(protocol_t *proto, SEL sel, BOOL isRequiredMethod, BOOL isInstanceMethod) { - OBJC_CHECK_LOCKED(&runtimeLock); + rwlock_assert_writing(&runtimeLock); uint32_t i; if (!proto || !sel) return NULL; - method_list_t *mlist = NULL; + method_list_t **mlistp = NULL; if (isRequiredMethod) { if (isInstanceMethod) { - mlist = proto->instanceMethods; + mlistp = &proto->instanceMethods; } else { - mlist = proto->classMethods; + mlistp = &proto->classMethods; } } else { if (isInstanceMethod) { - mlist = proto->optionalInstanceMethods; + mlistp = &proto->optionalInstanceMethods; } else { - mlist = proto->optionalClassMethods; + mlistp = &proto->optionalClassMethods; } } - if (mlist) { + if (*mlistp) { + method_list_t *mlist = *mlistp; + if (!isMethodListFixedUp(mlist)) { + mlist = _memdup_internal(mlist, method_list_size(mlist)); + fixupMethodList(mlist, YES/*always copy for simplicity*/); + *mlistp = mlist; + } for (i = 0; i < mlist->count; i++) { method_t *m = method_list_nth(mlist, i); - if (sel != m->name) { - m->name = sel_registerName((char *)m->name); - } - if (sel == m->name) { - return (Method)m; - } + if (sel == m->name) return (Method)m; } } @@ -1940,16 +3050,16 @@ _protocol_getMethod_nolock(protocol_t *proto, SEL sel, /*********************************************************************** * _protocol_getMethod * fixme -* Locking: acquires runtimeLock +* Locking: write-locks runtimeLock **********************************************************************/ __private_extern__ Method _protocol_getMethod(Protocol *p, SEL sel, BOOL isRequiredMethod, BOOL isInstanceMethod) { - OBJC_LOCK(&runtimeLock); + rwlock_write(&runtimeLock); Method result = _protocol_getMethod_nolock(newprotocol(p), sel, isRequiredMethod, isInstanceMethod); - OBJC_UNLOCK(&runtimeLock); + rwlock_unlock_write(&runtimeLock); return result; } @@ -1983,15 +3093,12 @@ protocol_getMethodDescription(Protocol *p, SEL aSel, /*********************************************************************** -* protocol_conformsToProtocol +* _protocol_conformsToProtocol_nolock * Returns YES if self conforms to other. -* Locking: runtimeLock must not be held by the caller +* Locking: runtimeLock must be held by the caller. **********************************************************************/ -BOOL protocol_conformsToProtocol(Protocol *self_gen, Protocol *other_gen) +static BOOL _protocol_conformsToProtocol_nolock(protocol_t *self, protocol_t *other) { - protocol_t *self = newprotocol(self_gen); - protocol_t *other = newprotocol(other_gen); - if (!self || !other) { return NO; } @@ -2003,11 +3110,11 @@ BOOL protocol_conformsToProtocol(Protocol *self_gen, Protocol *other_gen) if (self->protocols) { int i; for (i = 0; i < self->protocols->count; i++) { - protocol_t *proto = self->protocols->list[i]; + protocol_t *proto = remapProtocol(self->protocols->list[i]); if (0 == strcmp(other->name, proto->name)) { return YES; } - if (protocol_conformsToProtocol((Protocol *)proto, other_gen)) { + if (_protocol_conformsToProtocol_nolock(proto, other)) { return YES; } } @@ -2017,6 +3124,22 @@ BOOL protocol_conformsToProtocol(Protocol *self_gen, Protocol *other_gen) } +/*********************************************************************** +* protocol_conformsToProtocol +* Returns YES if self conforms to other. +* Locking: acquires runtimeLock +**********************************************************************/ +BOOL protocol_conformsToProtocol(Protocol *self, Protocol *other) +{ + BOOL result; + rwlock_read(&runtimeLock); + result = _protocol_conformsToProtocol_nolock(newprotocol(self), + newprotocol(other)); + rwlock_unlock_read(&runtimeLock); + return result; +} + + /*********************************************************************** * protocol_isEqual * Return YES if two protocols are equal (i.e. conform to each other) @@ -2053,7 +3176,7 @@ protocol_copyMethodDescriptionList(Protocol *p, return NULL; } - OBJC_LOCK(&runtimeLock); + rwlock_read(&runtimeLock); method_list_t *mlist = NULL; @@ -2082,7 +3205,7 @@ protocol_copyMethodDescriptionList(Protocol *p, } } - OBJC_UNLOCK(&runtimeLock); + rwlock_unlock_read(&runtimeLock); if (outCount) *outCount = count; return result; @@ -2117,8 +3240,9 @@ _protocol_getProperty_nolock(protocol_t *proto, const char *name, if (proto->protocols) { uintptr_t i; for (i = 0; i < proto->protocols->count; i++) { + protocol_t *p = remapProtocol(proto->protocols->list[i]); Property prop = - _protocol_getProperty_nolock(proto->protocols->list[i], name, + _protocol_getProperty_nolock(p, name, isRequiredProperty, isInstanceProperty); if (prop) return prop; @@ -2135,11 +3259,11 @@ Property protocol_getProperty(Protocol *p, const char *name, if (!p || !name) return NULL; - OBJC_LOCK(&runtimeLock); + rwlock_read(&runtimeLock); result = _protocol_getProperty_nolock(newprotocol(p), name, isRequiredProperty, isInstanceProperty); - OBJC_UNLOCK(&runtimeLock); + rwlock_unlock_read(&runtimeLock); return result; } @@ -2159,12 +3283,12 @@ Property *protocol_copyPropertyList(Protocol *proto, unsigned int *outCount) return NULL; } - OBJC_LOCK(&runtimeLock); + rwlock_read(&runtimeLock); struct objc_property_list *plist = newprotocol(proto)->instanceProperties; result = copyPropertyList(plist, outCount); - OBJC_UNLOCK(&runtimeLock); + rwlock_unlock_read(&runtimeLock); return result; } @@ -2187,7 +3311,7 @@ Protocol **protocol_copyProtocolList(Protocol *p, unsigned int *outCount) return NULL; } - OBJC_LOCK(&runtimeLock); + rwlock_read(&runtimeLock); if (proto->protocols) { count = (unsigned int)proto->protocols->count; @@ -2202,7 +3326,7 @@ Protocol **protocol_copyProtocolList(Protocol *p, unsigned int *outCount) result[i] = NULL; } - OBJC_UNLOCK(&runtimeLock); + rwlock_unlock_read(&runtimeLock); if (outCount) *outCount = count; return result; @@ -2218,52 +3342,44 @@ Protocol **protocol_copyProtocolList(Protocol *p, unsigned int *outCount) int objc_getClassList(Class *buffer, int bufferLen) { - OBJC_LOCK(&runtimeLock); + rwlock_write(&runtimeLock); + + realizeAllClasses(); int count; - Class cls; - const char *name; - NXMapState state; - NXMapTable *classes = realizedClasses(); - NXMapTable *unrealized = unrealizedClasses(); + class_t *cls; + NXHashState state; + NXHashTable *classes = realizedClasses(); + int allCount = NXCountHashTable(classes); if (!buffer) { - count = NXCountMapTable(classes) + NXCountMapTable(unrealized); - OBJC_UNLOCK(&runtimeLock); - return count; - } - - if (bufferLen > NXCountMapTable(classes) && - NXCountMapTable(unrealized) != 0) - { - // bummer - realizeAllClasses(); + rwlock_unlock_write(&runtimeLock); + return allCount; } count = 0; - state = NXInitMapState(classes); + state = NXInitHashState(classes); while (count < bufferLen && - NXNextMapState(classes, &state, - (const void **)&name, (const void **)&cls)) + NXNextHashState(classes, &state, (void **)&cls)) { buffer[count++] = (Class)cls; } - OBJC_UNLOCK(&runtimeLock); + rwlock_unlock_write(&runtimeLock); - return count; + return allCount; } /*********************************************************************** * objc_copyProtocolList * Returns pointers to all protocols. -* Locking: acquires runtimeLock +* Locking: read-locks runtimeLock **********************************************************************/ Protocol ** objc_copyProtocolList(unsigned int *outCount) { - OBJC_LOCK(&runtimeLock); + rwlock_read(&runtimeLock); int count, i; Protocol *proto; @@ -2274,7 +3390,7 @@ objc_copyProtocolList(unsigned int *outCount) count = NXCountMapTable(protocol_map); if (count == 0) { - OBJC_UNLOCK(&runtimeLock); + rwlock_unlock_read(&runtimeLock); if (outCount) *outCount = 0; return NULL; } @@ -2292,7 +3408,7 @@ objc_copyProtocolList(unsigned int *outCount) result[i++] = NULL; assert(i == count+1); - OBJC_UNLOCK(&runtimeLock); + rwlock_unlock_read(&runtimeLock); if (outCount) *outCount = count; return result; @@ -2302,13 +3418,13 @@ objc_copyProtocolList(unsigned int *outCount) /*********************************************************************** * objc_getProtocol * Get a protocol by name, or return NULL -* Locking: acquires runtimeLock +* Locking: read-locks runtimeLock **********************************************************************/ Protocol *objc_getProtocol(const char *name) { - OBJC_LOCK(&runtimeLock); + rwlock_read(&runtimeLock); Protocol *result = (Protocol *)NXMapGet(protocols(), name); - OBJC_UNLOCK(&runtimeLock); + rwlock_unlock_read(&runtimeLock); return result; } @@ -2316,13 +3432,12 @@ Protocol *objc_getProtocol(const char *name) /*********************************************************************** * class_copyMethodList * fixme -* Locking: acquires runtimeLock +* Locking: read-locks runtimeLock **********************************************************************/ Method * class_copyMethodList(Class cls_gen, unsigned int *outCount) { struct class_t *cls = newcls(cls_gen); - chained_method_list *mlist; unsigned int count = 0; Method *result = NULL; @@ -2331,31 +3446,34 @@ class_copyMethodList(Class cls_gen, unsigned int *outCount) return NULL; } - OBJC_LOCK(&runtimeLock); + rwlock_read(&runtimeLock); assert(isRealized(cls)); - methodizeClass(cls); - - for (mlist = cls->data->methods; mlist; mlist = mlist->next) { + FOREACH_METHOD_LIST(mlist, cls, { count += mlist->count; - } + }); if (count > 0) { unsigned int m; result = malloc((count + 1) * sizeof(Method)); m = 0; - for (mlist = cls->data->methods; mlist; mlist = mlist->next) { + FOREACH_METHOD_LIST(mlist, cls, { unsigned int i; for (i = 0; i < mlist->count; i++) { - result[m++] = (Method)&mlist->list[i]; + Method aMethod = (Method)method_list_nth(mlist, i); + if (method_getName(aMethod) == (SEL)kIgnore) { + count--; + continue; + } + result[m++] = aMethod; } - } + }); result[m] = NULL; } - OBJC_UNLOCK(&runtimeLock); + rwlock_unlock_read(&runtimeLock); if (outCount) *outCount = count; return result; @@ -2365,7 +3483,7 @@ class_copyMethodList(Class cls_gen, unsigned int *outCount) /*********************************************************************** * class_copyIvarList * fixme -* Locking: acquires runtimeLock +* Locking: read-locks runtimeLock **********************************************************************/ Ivar * class_copyIvarList(Class cls_gen, unsigned int *outCount) @@ -2381,20 +3499,22 @@ class_copyIvarList(Class cls_gen, unsigned int *outCount) return NULL; } - OBJC_LOCK(&runtimeLock); + rwlock_read(&runtimeLock); assert(isRealized(cls)); - if ((ivars = cls->data->ro->ivars) && (count = ivars->count)) { - result = malloc((count+1) * sizeof(Ivar)); + if ((ivars = cls->data->ro->ivars) && ivars->count) { + result = malloc((ivars->count+1) * sizeof(Ivar)); for (i = 0; i < ivars->count; i++) { - result[i] = (Ivar)ivar_list_nth(ivars, i); + ivar_t *ivar = ivar_list_nth(ivars, i); + if (!ivar->offset) continue; // anonymous bitfield + result[count++] = (Ivar)ivar; } - result[i] = NULL; + result[count] = NULL; } - OBJC_UNLOCK(&runtimeLock); + rwlock_unlock_read(&runtimeLock); if (outCount) *outCount = count; return result; @@ -2406,7 +3526,7 @@ class_copyIvarList(Class cls_gen, unsigned int *outCount) * properties declared in the class, or NULL if the class * declares no properties. Caller must free the block. * Does not copy any superclass's properties. -* Locking: acquires runtimeLock +* Locking: read-locks runtimeLock **********************************************************************/ Property * class_copyPropertyList(Class cls_gen, unsigned int *outCount) @@ -2421,13 +3541,10 @@ class_copyPropertyList(Class cls_gen, unsigned int *outCount) return NULL; } - OBJC_LOCK(&runtimeLock); + rwlock_read(&runtimeLock); assert(isRealized(cls)); - // Attach any categories because they may provide more properties - methodizeClass(cls); - for (plist = cls->data->properties; plist; plist = plist->next) { count += plist->count; } @@ -2446,7 +3563,7 @@ class_copyPropertyList(Class cls_gen, unsigned int *outCount) result[p] = NULL; } - OBJC_UNLOCK(&runtimeLock); + rwlock_unlock_read(&runtimeLock); if (outCount) *outCount = count; return result; @@ -2457,12 +3574,12 @@ class_copyPropertyList(Class cls_gen, unsigned int *outCount) * _class_getLoadMethod * fixme * Called only from add_class_to_loadable_list. -* Locking: runtimeLock must be held by the caller. +* Locking: runtimeLock must be read- or write-locked by the caller. **********************************************************************/ __private_extern__ IMP _class_getLoadMethod(Class cls_gen) { - OBJC_CHECK_LOCKED(&runtimeLock); + rwlock_assert_locked(&runtimeLock); struct class_t *cls = newcls(cls_gen); const method_list_t *mlist; @@ -2470,8 +3587,6 @@ _class_getLoadMethod(Class cls_gen) assert(isRealized(cls)); assert(isRealized(cls->isa)); - assert(!isMethodized(cls)); - assert(!isMethodized(cls->isa)); assert(!isMetaClass(cls)); assert(isMetaClass(cls->isa)); @@ -2504,12 +3619,12 @@ _category_getName(Category cat) * Returns a category's class's name * Called only from add_category_to_loadable_list and * remove_category_from_loadable_list. -* Locking: runtimeLock must be held by the caller +* Locking: runtimeLock must be read- or write-locked by the caller **********************************************************************/ __private_extern__ const char * _category_getClassName(Category cat) { - OBJC_CHECK_LOCKED(&runtimeLock); + rwlock_assert_locked(&runtimeLock); // cat->cls may have been remapped return getName(remapClass(newcategory(cat)->cls)); } @@ -2519,14 +3634,16 @@ _category_getClassName(Category cat) * _category_getClass * Returns a category's class * Called only by call_category_loads. -* Locking: none +* Locking: read-locks runtimeLock **********************************************************************/ __private_extern__ Class _category_getClass(Category cat) { + rwlock_read(&runtimeLock); // cat->cls may have been remapped struct class_t *result = remapClass(newcategory(cat)->cls); assert(isRealized(result)); // ok for call_category_loads' usage + rwlock_unlock_read(&runtimeLock); return (Class)result; } @@ -2535,12 +3652,12 @@ _category_getClass(Category cat) * _category_getLoadMethod * fixme * Called only from add_category_to_loadable_list -* Locking: runtimeLock must be held by the caller +* Locking: runtimeLock must be read- or write-locked by the caller **********************************************************************/ __private_extern__ IMP _category_getLoadMethod(Category cat) { - OBJC_CHECK_LOCKED(&runtimeLock); + rwlock_assert_locked(&runtimeLock); const method_list_t *mlist; int i; @@ -2560,7 +3677,7 @@ _category_getLoadMethod(Category cat) /*********************************************************************** * class_copyProtocolList * fixme -* Locking: acquires runtimeLock +* Locking: read-locks runtimeLock **********************************************************************/ Protocol ** class_copyProtocolList(Class cls_gen, unsigned int *outCount) @@ -2577,13 +3694,10 @@ class_copyProtocolList(Class cls_gen, unsigned int *outCount) return NULL; } - OBJC_LOCK(&runtimeLock); + rwlock_read(&runtimeLock); assert(isRealized(cls)); - // Attach any categories because they may provide more protocols - methodizeClass(cls); - for (p = cls->data->protocols; p && *p; p++) { count += (uint32_t)(*p)->count; } @@ -2599,7 +3713,7 @@ class_copyProtocolList(Class cls_gen, unsigned int *outCount) *r++ = NULL; } - OBJC_UNLOCK(&runtimeLock); + rwlock_unlock_read(&runtimeLock); if (outCount) *outCount = count; return result; @@ -2609,7 +3723,7 @@ class_copyProtocolList(Class cls_gen, unsigned int *outCount) /*********************************************************************** * _objc_copyClassNamesForImage * fixme -* Locking: acquires runtimeLock +* Locking: read-locks runtimeLock **********************************************************************/ __private_extern__ const char ** _objc_copyClassNamesForImage(header_info *hi, unsigned int *outCount) @@ -2618,7 +3732,7 @@ _objc_copyClassNamesForImage(header_info *hi, unsigned int *outCount) class_t **classlist; const char **names; - OBJC_LOCK(&runtimeLock); + rwlock_read(&runtimeLock); classlist = _getObjc2ClassList(hi, &count); names = malloc((count+1) * sizeof(const char *)); @@ -2628,7 +3742,7 @@ _objc_copyClassNamesForImage(header_info *hi, unsigned int *outCount) } names[count] = NULL; - OBJC_UNLOCK(&runtimeLock); + rwlock_unlock_read(&runtimeLock); if (outCount) *outCount = (unsigned int)count; return names; @@ -2665,7 +3779,7 @@ instanceSize(struct class_t *cls) assert(cls); assert(isRealized(cls)); // fixme rdar://5244378 - return (uint32_t)((cls->data->ro->instanceSize + 7) & ~7UL); + return (uint32_t)((cls->data->ro->instanceSize + WORD_MASK) & ~WORD_MASK); } @@ -2717,9 +3831,9 @@ class_setVersion(Class cls, int version) __private_extern__ const char *_class_getName(Class cls) { if (!cls) return "nil"; - // fixme hack OBJC_LOCK(&runtimeLock); + // fixme hack rwlock_write(&runtimeLock); const char *name = getName(newcls(cls)); - // OBJC_UNLOCK(&runtimeLock); + // rwlock_unlock_write(&runtimeLock); return name; } @@ -2732,88 +3846,149 @@ __private_extern__ const char *_class_getName(Class cls) static const char * getName(struct class_t *cls) { - // fixme hack OBJC_CHECK_LOCKED(&runtimeLock); - assert(cls); - - if (isRealized(cls)) { - return cls->data->ro->name; - } else { - return ((const struct class_ro_t *)cls->data)->name; - } + // fixme hack rwlock_assert_writing(&runtimeLock); + assert(cls); + + if (isRealized(cls)) { + return cls->data->ro->name; + } else { + return ((const struct class_ro_t *)cls->data)->name; + } +} + + +/*********************************************************************** +* getMethodNoSuper_nolock +* fixme +* Locking: runtimeLock must be read- or write-locked by the caller +**********************************************************************/ +static method_t * +getMethodNoSuper_nolock(struct class_t *cls, SEL sel) +{ + rwlock_assert_locked(&runtimeLock); + + uint32_t i; + + assert(isRealized(cls)); + // fixme nil cls? + // fixme NULL sel? + + FOREACH_METHOD_LIST(mlist, cls, { + for (i = 0; i < mlist->count; i++) { + method_t *m = method_list_nth(mlist, i); + if (m->name == sel) return m; + } + }); + + return NULL; +} + + +/*********************************************************************** +* _class_getMethodNoSuper +* fixme +* Locking: read-locks runtimeLock +**********************************************************************/ +__private_extern__ Method +_class_getMethodNoSuper(Class cls, SEL sel) +{ + rwlock_read(&runtimeLock); + Method result = (Method)getMethodNoSuper_nolock(newcls(cls), sel); + rwlock_unlock_read(&runtimeLock); + return result; +} + +/*********************************************************************** +* _class_getMethodNoSuper +* For use inside lockForMethodLookup() only. +* Locking: read-locks runtimeLock +**********************************************************************/ +__private_extern__ Method +_class_getMethodNoSuper_nolock(Class cls, SEL sel) +{ + return (Method)getMethodNoSuper_nolock(newcls(cls), sel); } /*********************************************************************** -* _class_getMethodNoSuper_nolock +* getMethod_nolock * fixme -* Locking: runtimeLock must be held by the caller +* Locking: runtimeLock must be read- or write-locked by the caller **********************************************************************/ -static Method -_class_getMethodNoSuper_nolock(struct class_t *cls, SEL sel) +static method_t * +getMethod_nolock(class_t *cls, SEL sel) { - OBJC_CHECK_LOCKED(&runtimeLock); + method_t *m = NULL; - chained_method_list *mlist; - uint32_t i; + rwlock_assert_locked(&runtimeLock); - assert(isRealized(cls)); - // fixme nil cls? + // fixme nil cls? // fixme NULL sel? - methodizeClass(cls); + assert(isRealized(cls)); - for (mlist = cls->data->methods; mlist; mlist = mlist->next) { - for (i = 0; i < mlist->count; i++) { - method_t *m = &mlist->list[i]; - if (m->name == sel) return (Method)m; - } + while (cls && ((m = getMethodNoSuper_nolock(cls, sel))) == NULL) { + cls = getSuperclass(cls); } - return NULL; + return m; } /*********************************************************************** -* _class_getMethodNoSuper +* _class_getMethod * fixme -* Locking: acquires runtimeLock +* Locking: read-locks runtimeLock **********************************************************************/ -__private_extern__ Method -_class_getMethodNoSuper(Class cls, SEL sel) +__private_extern__ Method _class_getMethod(Class cls, SEL sel) { - OBJC_LOCK(&runtimeLock); - Method result = _class_getMethodNoSuper_nolock(newcls(cls), sel); - OBJC_UNLOCK(&runtimeLock); - return result; + Method m; + rwlock_read(&runtimeLock); + m = (Method)getMethod_nolock(newcls(cls), sel); + rwlock_unlock_read(&runtimeLock); + return m; } /*********************************************************************** -* _class_getMethod -* fixme -* Locking: acquires runtimeLock +* ABI-specific lookUpMethod helpers. +* Locking: read- and write-locks runtimeLock. **********************************************************************/ -__private_extern__ Method _class_getMethod(Class cls, SEL sel) +__private_extern__ void lockForMethodLookup(void) +{ + rwlock_read(&runtimeLock); +} +__private_extern__ void unlockForMethodLookup(void) { - Method m = NULL; + rwlock_unlock_read(&runtimeLock); +} - // fixme nil cls? - // fixme NULL sel? +__private_extern__ IMP prepareForMethodLookup(Class cls, SEL sel, BOOL init) +{ + rwlock_assert_unlocked(&runtimeLock); - assert(isRealized(newcls(cls))); + if (!isRealized(newcls(cls))) { + rwlock_write(&runtimeLock); + realizeClass(newcls(cls)); + rwlock_unlock_write(&runtimeLock); + } - while (cls && ((m = _class_getMethodNoSuper(cls, sel))) == NULL) { - cls = class_getSuperclass(cls); + if (init && !_class_isInitialized(cls)) { + _class_initialize (cls); + // If sel == initialize, _class_initialize will send +initialize and + // then the messenger will send +initialize again after this + // procedure finishes. Of course, if this is not being called + // from the messenger then it won't happen. 2778172 } - return m; + return NULL; } /*********************************************************************** * class_getProperty * fixme -* Locking: acquires runtimeLock +* Locking: read-locks runtimeLock **********************************************************************/ Property class_getProperty(Class cls_gen, const char *name) { @@ -2823,10 +3998,9 @@ Property class_getProperty(Class cls_gen, const char *name) if (!cls || !name) return NULL; - OBJC_LOCK(&runtimeLock); + rwlock_read(&runtimeLock); assert(isRealized(cls)); - methodizeClass(cls); for ( ; cls; cls = getSuperclass(cls)) { for (plist = cls->data->properties; plist; plist = plist->next) { @@ -2841,7 +4015,7 @@ Property class_getProperty(Class cls_gen, const char *name) } done: - OBJC_UNLOCK(&runtimeLock); + rwlock_unlock_read(&runtimeLock); return result; } @@ -2872,6 +4046,29 @@ __private_extern__ Class _class_getMeta(Class cls) else return ((id)cls)->isa; } +Class gdb_class_getClass(Class cls) +{ + const char *className = strdup(getName(newcls(cls))); + if(!className) return Nil; + Class rCls = look_up_class(className, NO, NO); + free((char*)className); + return rCls; +} + +BOOL gdb_objc_isRuntimeLocked() +{ + if (rwlock_try_write(&runtimeLock)) { + rwlock_unlock_write(&runtimeLock); + } else + return YES; + + if (mutex_try_lock(&cacheUpdateLock)) { + mutex_unlock(&cacheUpdateLock); + } else + return YES; + + return NO; +} /*********************************************************************** * Locking: fixme @@ -2907,13 +4104,27 @@ _class_setInitializing(Class cls_gen) /*********************************************************************** -* Locking: fixme +* Locking: write-locks runtimeLock **********************************************************************/ __private_extern__ void _class_setInitialized(Class cls_gen) { - struct class_t *cls = newcls(_class_getMeta(cls_gen)); - changeInfo(cls, RW_INITIALIZED, RW_INITIALIZING); + + struct class_t *metacls; + struct class_t *cls; + + rwlock_write(&runtimeLock); + metacls = newcls(_class_getMeta(cls_gen)); + cls = getNonMetaClass(metacls); + + // Update vtables (initially postponed pending +initialize completion) + // Do cls first because root metacls is a subclass of root cls + updateVtable(cls, YES); + updateVtable(metacls, YES); + + rwlock_unlock_write(&runtimeLock); + + changeInfo(metacls, RW_INITIALIZED, RW_INITIALIZING); } @@ -2983,6 +4194,32 @@ _class_setFinalizeOnMainThread(Class cls) } +/*********************************************************************** +* _class_instancesHaveAssociatedObjects +* May manipulate unrealized future classes in the CF-bridged case. +**********************************************************************/ +__private_extern__ BOOL +_class_instancesHaveAssociatedObjects(Class cls_gen) +{ + class_t *cls = newcls(cls_gen); + assert(isFuture(cls) || isRealized(cls)); + return (cls->data->flags & RW_INSTANCES_HAVE_ASSOCIATED_OBJECTS) ? YES : NO; +} + + +/*********************************************************************** +* _class_assertInstancesHaveAssociatedObjects +* May manipulate unrealized future classes in the CF-bridged case. +**********************************************************************/ +__private_extern__ void +_class_assertInstancesHaveAssociatedObjects(Class cls_gen) +{ + class_t *cls = newcls(cls_gen); + assert(isFuture(cls) || isRealized(cls)); + changeInfo(cls, RW_INSTANCES_HAVE_ASSOCIATED_OBJECTS, 0); +} + + /*********************************************************************** * Locking: none * fixme assert realized to get superclass remapping? @@ -3046,7 +4283,7 @@ class_setIvarLayout(Class cls_gen, const char *layout) class_t *cls = newcls(cls_gen); if (!cls) return; - OBJC_LOCK(&runtimeLock); + rwlock_write(&runtimeLock); // Can only change layout of in-construction classes. // note: if modifications to post-construction classes were @@ -3054,7 +4291,7 @@ class_setIvarLayout(Class cls_gen, const char *layout) if (!(cls->data->flags & RW_CONSTRUCTING)) { _objc_inform("*** Can't set ivar layout for already-registered " "class '%s'", getName(cls)); - OBJC_UNLOCK(&runtimeLock); + rwlock_unlock_write(&runtimeLock); return; } @@ -3063,7 +4300,7 @@ class_setIvarLayout(Class cls_gen, const char *layout) try_free(ro_w->ivarLayout); ro_w->ivarLayout = (unsigned char *)_strdup_internal(layout); - OBJC_UNLOCK(&runtimeLock); + rwlock_unlock_write(&runtimeLock); } @@ -3082,7 +4319,7 @@ class_setWeakIvarLayout(Class cls_gen, const char *layout) class_t *cls = newcls(cls_gen); if (!cls) return; - OBJC_LOCK(&runtimeLock); + rwlock_write(&runtimeLock); // Can only change layout of in-construction classes. // note: if modifications to post-construction classes were @@ -3090,7 +4327,7 @@ class_setWeakIvarLayout(Class cls_gen, const char *layout) if (!(cls->data->flags & RW_CONSTRUCTING)) { _objc_inform("*** Can't set weak ivar layout for already-registered " "class '%s'", getName(cls)); - OBJC_UNLOCK(&runtimeLock); + rwlock_unlock_write(&runtimeLock); return; } @@ -3099,29 +4336,29 @@ class_setWeakIvarLayout(Class cls_gen, const char *layout) try_free(ro_w->weakIvarLayout); ro_w->weakIvarLayout = (unsigned char *)_strdup_internal(layout); - OBJC_UNLOCK(&runtimeLock); + rwlock_unlock_write(&runtimeLock); } /*********************************************************************** * _class_getVariable * fixme -* Locking: acquires runtimeLock +* Locking: read-locks runtimeLock **********************************************************************/ __private_extern__ Ivar _class_getVariable(Class cls, const char *name) { - OBJC_LOCK(&runtimeLock); + rwlock_read(&runtimeLock); for ( ; cls != Nil; cls = class_getSuperclass(cls)) { struct ivar_t *ivar = getIvar(newcls(cls), name); if (ivar) { - OBJC_UNLOCK(&runtimeLock); + rwlock_unlock_read(&runtimeLock); return (Ivar)ivar; } } - OBJC_UNLOCK(&runtimeLock); + rwlock_unlock_read(&runtimeLock); return NULL; } @@ -3130,13 +4367,16 @@ _class_getVariable(Class cls, const char *name) /*********************************************************************** * class_conformsToProtocol * fixme -* Locking: acquires runtimeLock +* Locking: read-locks runtimeLock **********************************************************************/ BOOL class_conformsToProtocol(Class cls_gen, Protocol *proto) { Protocol **protocols; unsigned int count, i; BOOL result = NO; + + if (!cls_gen) return NO; + if (!proto) return NO; // fixme null cls? @@ -3160,7 +4400,7 @@ BOOL class_conformsToProtocol(Class cls_gen, Protocol *proto) /*********************************************************************** * class_addMethod * fixme -* Locking: acquires runtimeLock +* Locking: write-locks runtimeLock **********************************************************************/ static IMP _class_addMethod(Class cls_gen, SEL name, IMP imp, @@ -3171,35 +4411,41 @@ _class_addMethod(Class cls_gen, SEL name, IMP imp, if (!types) types = ""; - OBJC_LOCK(&runtimeLock); + rwlock_write(&runtimeLock); assert(isRealized(cls)); - // methodizeClass(cls); _class_getMethodNoSuper() does this below - Method m; - if ((m = _class_getMethodNoSuper_nolock(cls, name))) { + method_t *m; + if ((m = getMethodNoSuper_nolock(cls, name))) { // already exists - // fixme atomic - result = method_getImplementation(m); - if (replace) { - method_setImplementation(m, imp); + if (!replace) { + result = _method_getImplementation(m); + } else { + result = _method_setImplementation(cls, m, imp); } } else { // fixme optimize - chained_method_list *newlist; - newlist = _calloc_internal(sizeof(*newlist) + sizeof(method_t), 1); + method_list_t *newlist; + newlist = _calloc_internal(sizeof(*newlist), 1); + newlist->entsize_NEVER_USE = (uint32_t)sizeof(method_t) | fixed_up_method_list; newlist->count = 1; - newlist->list[0].name = name; - newlist->list[0].types = strdup(types); - newlist->list[0].imp = imp; + newlist->first.name = name; + newlist->first.types = strdup(types); + if (name != (SEL)kIgnore) { + newlist->first.imp = imp; + } else { + newlist->first.imp = (IMP)&_objc_ignored_method; + } - newlist->next = cls->data->methods; - cls->data->methods = newlist; + BOOL vtablesAffected; + attachMethodLists(cls, &newlist, 1, NO, &vtablesAffected); flushCaches(cls); + if (vtablesAffected) flushVtables(cls); + result = NULL; } - OBJC_UNLOCK(&runtimeLock); + rwlock_unlock_write(&runtimeLock); return result; } @@ -3240,19 +4486,19 @@ class_addIvar(Class cls_gen, const char *name, size_t size, if (!type) type = ""; if (name && 0 == strcmp(name, "")) name = NULL; - OBJC_LOCK(&runtimeLock); + rwlock_write(&runtimeLock); assert(isRealized(cls)); // No class variables if (isMetaClass(cls)) { - OBJC_UNLOCK(&runtimeLock); + rwlock_unlock_write(&runtimeLock); return NO; } // Can only add ivars to in-construction classes. if (!(cls->data->flags & RW_CONSTRUCTING)) { - OBJC_UNLOCK(&runtimeLock); + rwlock_unlock_write(&runtimeLock); return NO; } @@ -3260,7 +4506,7 @@ class_addIvar(Class cls_gen, const char *name, size_t size, // Check for too-big ivar. // fixme check for superclass ivar too? if ((name && getIvar(cls, name)) || size > UINT32_MAX) { - OBJC_UNLOCK(&runtimeLock); + rwlock_unlock_write(&runtimeLock); return NO; } @@ -3296,7 +4542,7 @@ class_addIvar(Class cls_gen, const char *name, size_t size, // Ivar layout updated in registerClass. - OBJC_UNLOCK(&runtimeLock); + rwlock_unlock_write(&runtimeLock); return YES; } @@ -3317,14 +4563,14 @@ BOOL class_addProtocol(Class cls_gen, Protocol *protocol_gen) if (!cls) return NO; if (class_conformsToProtocol(cls_gen, protocol_gen)) return NO; - OBJC_LOCK(&runtimeLock); + rwlock_write(&runtimeLock); assert(isRealized(cls)); // fixme optimize plist = _malloc_internal(sizeof(protocol_list_t) + sizeof(protocol_t *)); plist->count = 1; - plist->list[0] = protocol; + plist->list[0] = (protocol_ref_t)protocol; unsigned int count = 0; for (plistp = cls->data->protocols; plistp && *plistp; plistp++) { @@ -3339,7 +4585,7 @@ BOOL class_addProtocol(Class cls_gen, Protocol *protocol_gen) // fixme metaclass? - OBJC_UNLOCK(&runtimeLock); + rwlock_unlock_write(&runtimeLock); return YES; } @@ -3349,7 +4595,6 @@ BOOL class_addProtocol(Class cls_gen, Protocol *protocol_gen) * look_up_class * Look up a class by name, and realize it. * Locking: acquires runtimeLock -* GrP fixme zerolink needs class handler for objc_getClass **********************************************************************/ __private_extern__ id look_up_class(const char *name, @@ -3358,11 +4603,16 @@ look_up_class(const char *name, { if (!name) return nil; - OBJC_LOCK(&runtimeLock); - id result = (id)getClass(name); - realizeClass(result); - OBJC_UNLOCK(&runtimeLock); - return result; + rwlock_read(&runtimeLock); + class_t *result = getClass(name); + BOOL unrealized = result && !isRealized(result); + rwlock_unlock_read(&runtimeLock); + if (unrealized) { + rwlock_write(&runtimeLock); + realizeClass(result); + rwlock_unlock_write(&runtimeLock); + } + return (id)result; } @@ -3376,17 +4626,15 @@ objc_duplicateClass(Class original_gen, const char *name, size_t extraBytes) { struct class_t *original = newcls(original_gen); - chained_method_list **m; struct class_t *duplicate; - OBJC_LOCK(&runtimeLock); + rwlock_write(&runtimeLock); assert(isRealized(original)); - methodizeClass(original); assert(!isMetaClass(original)); duplicate = (struct class_t *) - calloc(instanceSize(original->isa) + extraBytes, 1); + _calloc_class(instanceSize(original->isa) + extraBytes); if (instanceSize(original->isa) < sizeof(class_t)) { _objc_inform("busted! %s\n", original->data->ro->name); } @@ -3395,11 +4643,10 @@ objc_duplicateClass(Class original_gen, const char *name, duplicate->isa = original->isa; duplicate->superclass = original->superclass; duplicate->cache = (Cache)&_objc_empty_cache; -#warning GrP fixme vtable - // duplicate->vtable = (IMP *)&_objc_empty_vtable; + duplicate->vtable = _objc_empty_vtable; duplicate->data = _calloc_internal(sizeof(*original->data), 1); - duplicate->data->flags = original->data->flags | RW_COPIED_RO; + duplicate->data->flags = (original->data->flags | RW_COPIED_RO) & ~RW_SPECIALIZED_VTABLE; duplicate->data->version = original->data->version; duplicate->data->firstSubclass = NULL; duplicate->data->nextSiblingClass = NULL; @@ -3408,9 +4655,14 @@ objc_duplicateClass(Class original_gen, const char *name, _memdup_internal(original->data->ro, sizeof(*original->data->ro)); *(char **)&duplicate->data->ro->name = _strdup_internal(name); - duplicate->data->methods = original->data->methods; - for (m = &duplicate->data->methods; *m != NULL; m = &(*m)->next) { - *m = _memdup_internal(*m, chained_mlist_size(*m)); + if (original->data->methods) { + duplicate->data->methods = + _memdup_internal(original->data->methods, + malloc_size(original->data->methods)); + method_list_t **mlistp = duplicate->data->methods; + for (mlistp = duplicate->data->methods; *mlistp; mlistp++) { + *mlistp = _memdup_internal(*mlistp, method_list_size(*mlistp)); + } } // fixme dies when categories are added to the base @@ -3421,7 +4673,12 @@ objc_duplicateClass(Class original_gen, const char *name, addSubclass(duplicate->superclass, duplicate); } - addRealizedClass(duplicate, duplicate->data->ro->name); + // Don't methodize class - construction above is correct + + addNamedClass(duplicate, duplicate->data->ro->name); + addRealizedClass(duplicate); + // no: duplicate->isa == original->isa + // addRealizedMetaclass(duplicate->isa); if (PrintConnecting) { _objc_inform("CLASS: realizing class '%s' (duplicate of %s) %p %p", @@ -3429,48 +4686,23 @@ objc_duplicateClass(Class original_gen, const char *name, duplicate, duplicate->data->ro); } - OBJC_UNLOCK(&runtimeLock); + rwlock_unlock_write(&runtimeLock); return (Class)duplicate; } - /*********************************************************************** -* objc_allocateClassPair -* fixme -* Locking: acquires runtimeLock +* objc_initializeClassPair +* Locking: runtimeLock must be write-locked by the caller **********************************************************************/ -Class objc_allocateClassPair(Class superclass_gen, const char *name, - size_t extraBytes) +static void objc_initializeClassPair_internal(Class superclass_gen, const char *name, Class cls_gen, Class meta_gen) { + rwlock_assert_writing(&runtimeLock); + class_t *superclass = newcls(superclass_gen); - class_t *cls, *meta; + class_t *cls = newcls(cls_gen); + class_t *meta = newcls(meta_gen); class_ro_t *cls_ro_w, *meta_ro_w; - - OBJC_LOCK(&runtimeLock); - - if (getClass(name)) { - OBJC_UNLOCK(&runtimeLock); - return NO; - } - // fixme reserve class against simmultaneous allocation - - if (superclass) assert(isRealized(superclass)); - - if (superclass && superclass->data->flags & RW_CONSTRUCTING) { - // Can't make subclass of an in-construction class - OBJC_UNLOCK(&runtimeLock); - return NO; - } - - // Allocate new classes. - if (superclass) { - cls = _calloc_internal(instanceSize(superclass->isa) + extraBytes, 1); - meta = _calloc_internal(instanceSize(superclass->isa->isa) + extraBytes, 1); - } else { - cls = _calloc_internal(sizeof(class_t) + extraBytes, 1); - meta = _calloc_internal(sizeof(class_t) + extraBytes, 1); - } cls->data = _calloc_internal(sizeof(class_rw_t), 1); meta->data = _calloc_internal(sizeof(class_rw_t), 1); @@ -3482,8 +4714,8 @@ Class objc_allocateClassPair(Class superclass_gen, const char *name, // Set basic info cls->cache = (Cache)&_objc_empty_cache; meta->cache = (Cache)&_objc_empty_cache; - cls->vtable = (IMP *)&_objc_empty_vtable; - meta->vtable = (IMP *)&_objc_empty_vtable; + cls->vtable = _objc_empty_vtable; + meta->vtable = _objc_empty_vtable; cls->data->flags = RW_CONSTRUCTING | RW_COPIED_RO | RW_REALIZED; meta->data->flags = RW_CONSTRUCTING | RW_COPIED_RO | RW_REALIZED; @@ -3525,8 +4757,87 @@ Class objc_allocateClassPair(Class superclass_gen, const char *name, meta->superclass = cls; addSubclass(cls, meta); } +} + +/*********************************************************************** +* objc_initializeClassPair +**********************************************************************/ +Class objc_initializeClassPair(Class superclass_gen, const char *name, Class cls_gen, Class meta_gen) +{ + class_t *superclass = newcls(superclass_gen); + + rwlock_write(&runtimeLock); + + // + // Common superclass integrity checks with objc_allocateClassPair + // + if (getClass(name)) { + rwlock_unlock_write(&runtimeLock); + return NO; + } + // fixme reserve class against simmultaneous allocation + + if (superclass) assert(isRealized(superclass)); + + if (superclass && superclass->data->flags & RW_CONSTRUCTING) { + // Can't make subclass of an in-construction class + rwlock_unlock_write(&runtimeLock); + return NO; + } + + + // just initialize what was supplied + objc_initializeClassPair_internal(superclass_gen, name, cls_gen, meta_gen); + + rwlock_unlock_write(&runtimeLock); + return cls_gen; +} + +/*********************************************************************** +* objc_allocateClassPair +* fixme +* Locking: acquires runtimeLock +**********************************************************************/ +Class objc_allocateClassPair(Class superclass_gen, const char *name, + size_t extraBytes) +{ + class_t *superclass = newcls(superclass_gen); + Class cls, meta; + + rwlock_write(&runtimeLock); + + // + // Common superclass integrity checks with objc_initializeClassPair + // + if (getClass(name)) { + rwlock_unlock_write(&runtimeLock); + return NO; + } + // fixme reserve class against simmultaneous allocation + + if (superclass) assert(isRealized(superclass)); + + if (superclass && superclass->data->flags & RW_CONSTRUCTING) { + // Can't make subclass of an in-construction class + rwlock_unlock_write(&runtimeLock); + return NO; + } + + + + // Allocate new classes. + if (superclass) { + cls = _calloc_class(instanceSize(superclass->isa) + extraBytes); + meta = _calloc_class(instanceSize(superclass->isa->isa) + extraBytes); + } else { + cls = _calloc_class(sizeof(class_t) + extraBytes); + meta = _calloc_class(sizeof(class_t) + extraBytes); + } + - OBJC_UNLOCK(&runtimeLock); + objc_initializeClassPair_internal(superclass_gen, name, cls, meta); + + rwlock_unlock_write(&runtimeLock); return (Class)cls; } @@ -3541,14 +4852,14 @@ void objc_registerClassPair(Class cls_gen) { class_t *cls = newcls(cls_gen); - OBJC_LOCK(&runtimeLock); + rwlock_write(&runtimeLock); if ((cls->data->flags & RW_CONSTRUCTED) || (cls->isa->data->flags & RW_CONSTRUCTED)) { _objc_inform("objc_registerClassPair: class '%s' was already " "registered!", cls->data->ro->name); - OBJC_UNLOCK(&runtimeLock); + rwlock_unlock_write(&runtimeLock); return; } @@ -3558,7 +4869,7 @@ void objc_registerClassPair(Class cls_gen) _objc_inform("objc_registerClassPair: class '%s' was not " "allocated with objc_allocateClassPair!", cls->data->ro->name); - OBJC_UNLOCK(&runtimeLock); + rwlock_unlock_write(&runtimeLock); return; } @@ -3587,8 +4898,10 @@ void objc_registerClassPair(Class cls_gen) instanceSize(cls), NO); uint32_t i; for (i = 0; i < ro_w->ivars->count; i++) { - ivar_t *iv = ivar_list_nth(ro_w->ivars, i); - layout_bitmap_set_ivar(bitmap, iv->type, *iv->offset); + ivar_t *ivar = ivar_list_nth(ro_w->ivars, i); + if (!ivar->offset) continue; // anonymous bitfield + + layout_bitmap_set_ivar(bitmap, ivar->type, *ivar->offset); } ro_w->ivarLayout = layout_string_create(bitmap); layout_bitmap_free(bitmap); @@ -3621,61 +4934,96 @@ void objc_registerClassPair(Class cls_gen) cls->isa->data->flags |= RW_CONSTRUCTED; // Add to realized and uninitialized classes - addRealizedClass(cls, cls->data->ro->name); + addNamedClass(cls, cls->data->ro->name); + addRealizedClass(cls); + addRealizedMetaclass(cls->isa); addUninitializedClass(cls, cls->isa); - OBJC_UNLOCK(&runtimeLock); + rwlock_unlock_write(&runtimeLock); } -static void unload_class(class_t *cls) +static void unload_class(class_t *cls, BOOL isMeta) { - uint32_t i; + // Detach class from various lists - chained_method_list *mlist = cls->data->methods; - while (mlist) { - chained_method_list *dead = mlist; - mlist = mlist->next; - for (i = 0; i < dead->count; i++) { - try_free(dead->list[i].types); - } - try_free(dead); - } + // categories not yet attached to this class + category_list *cats; + cats = unattachedCategoriesForClass(cls); + if (cats) free(cats); - const ivar_list_t *ilist = cls->data->ro->ivars; - if (ilist) { - for (i = 0; i < ilist->count; i++) { - const ivar_t *ivar = ivar_list_nth(ilist, i); - try_free(ivar->offset); - try_free(ivar->name); - try_free(ivar->type); - } - try_free(ilist); + // class tables and +load queue + if (!isMeta) { + removeNamedClass(cls, getName(cls)); + removeRealizedClass(cls); + removeUninitializedClass(cls); + } else { + removeRealizedMetaclass(cls); } - protocol_list_t **plistp = cls->data->protocols; - for (plistp = cls->data->protocols; plistp && *plistp; plistp++) { - try_free(*plistp); + // superclass's subclass list + if (isRealized(cls)) { + class_t *supercls = getSuperclass(cls); + if (supercls) removeSubclass(supercls, cls); } - try_free(cls->data->protocols); - // fixme: - // properties - try_free(cls->data->ro->ivarLayout); - try_free(cls->data->ro->weakIvarLayout); - try_free(cls->data->ro->name); - try_free(cls->data->ro); - try_free(cls->data); - if (cls->cache != (Cache)&_objc_empty_cache) _cache_free(cls->cache); - try_free(cls); + // Dispose the class's own data structures + + if (isRealized(cls)) { + uint32_t i; + + // Dereferences the cache contents; do this before freeing methods + if (cls->cache != (Cache)&_objc_empty_cache) _cache_free(cls->cache); + + if (cls->data->methods) { + method_list_t **mlistp; + for (mlistp = cls->data->methods; *mlistp; mlistp++) { + for (i = 0; i < (**mlistp).count; i++) { + method_t *m = method_list_nth(*mlistp, i); + try_free(m->types); + } + try_free(*mlistp); + } + try_free(cls->data->methods); + } + + const ivar_list_t *ilist = cls->data->ro->ivars; + if (ilist) { + for (i = 0; i < ilist->count; i++) { + const ivar_t *ivar = ivar_list_nth(ilist, i); + try_free(ivar->offset); + try_free(ivar->name); + try_free(ivar->type); + } + try_free(ilist); + } + + protocol_list_t **plistp = cls->data->protocols; + for (plistp = cls->data->protocols; plistp && *plistp; plistp++) { + try_free(*plistp); + } + try_free(cls->data->protocols); + + // fixme: + // properties + + if (cls->vtable != _objc_empty_vtable && + cls->data->flags & RW_SPECIALIZED_VTABLE) try_free(cls->vtable); + try_free(cls->data->ro->ivarLayout); + try_free(cls->data->ro->weakIvarLayout); + try_free(cls->data->ro->name); + try_free(cls->data->ro); + try_free(cls->data); + try_free(cls); + } } void objc_disposeClassPair(Class cls_gen) { class_t *cls = newcls(cls_gen); - OBJC_LOCK(&runtimeLock); + rwlock_write(&runtimeLock); if (!(cls->data->flags & (RW_CONSTRUCTED|RW_CONSTRUCTING)) || !(cls->isa->data->flags & (RW_CONSTRUCTED|RW_CONSTRUCTING))) @@ -3685,19 +5033,17 @@ void objc_disposeClassPair(Class cls_gen) _objc_inform("objc_disposeClassPair: class '%s' was not " "allocated with objc_allocateClassPair!", cls->data->ro->name); - OBJC_UNLOCK(&runtimeLock); + rwlock_unlock_write(&runtimeLock); return; } if (isMetaClass(cls)) { _objc_inform("objc_disposeClassPair: class '%s' is a metaclass, " "not a class!", cls->data->ro->name); - OBJC_UNLOCK(&runtimeLock); + rwlock_unlock_write(&runtimeLock); return; } - class_t *supercls = getSuperclass(cls); - // Shouldn't have any live subclasses. if (cls->data->firstSubclass) { _objc_inform("objc_disposeClassPair: class '%s' still has subclasses, " @@ -3710,22 +5056,12 @@ void objc_disposeClassPair(Class cls_gen) getName(cls->isa->data->firstSubclass)); } - // Remove from superclass's subclass list - // Note that cls and cls->isa may have different lists. - if (supercls) { - removeSubclass(getSuperclass(cls), cls); - removeSubclass(getSuperclass(cls->isa), cls->isa); - } - - // Remove from class hashes - removeRealizedClass(cls); - removeUninitializedClass(cls); + // don't remove_class_from_loadable_list() + // - it's not there and we don't have the lock + unload_class(cls->isa, YES); + unload_class(cls, NO); - // Deallocate memory - unload_class(cls->isa); - unload_class(cls); - - OBJC_UNLOCK(&runtimeLock); + rwlock_unlock_write(&runtimeLock); } @@ -3769,11 +5105,25 @@ object_copyFromZone(id oldObj, size_t extraBytes, void *zone) if (!oldObj) return nil; size = _class_getInstanceSize(oldObj->isa) + extraBytes; - obj = malloc_zone_calloc(zone, size, 1); +#if !defined(NO_GC) + if (UseGC) { + obj = (id) auto_zone_allocate_object(gc_zone, size, + AUTO_OBJECT_SCANNED, 0, 1); + } else +#endif + if (zone) { + obj = malloc_zone_calloc(zone, size, 1); + } else { + obj = (id) calloc(1, size); + } if (!obj) return nil; // fixme this doesn't handle C++ ivars correctly (#4619414) - bcopy(oldObj, obj, size); + objc_memmove_collectable(obj, oldObj, size); + +#if !defined(NO_GC) + if (UseGC) gc_fixup_weakreferences(obj, oldObj); +#endif return obj; } @@ -3803,28 +5153,6 @@ object_dispose(id obj) } -/*********************************************************************** -* _class_getFreedObjectClass -* fixme -* Locking: none -**********************************************************************/ -__private_extern__ Class -_class_getFreedObjectClass(void) -{ - return Nil; // fixme -} - -/*********************************************************************** -* _class_getNonexistentObjectClass -* fixme -* Locking: none -**********************************************************************/ -__private_extern__ Class -_class_getNonexistentObjectClass(void) -{ - return Nil; // fixme -} - /*********************************************************************** * _objc_getFreedObjectClass * fixme @@ -3832,9 +5160,11 @@ _class_getNonexistentObjectClass(void) **********************************************************************/ Class _objc_getFreedObjectClass (void) { - return _class_getFreedObjectClass(); + return nil; } +#ifndef NO_FIXUP + extern id objc_msgSend_fixup(id, SEL, ...); extern id objc_msgSend_fixedup(id, SEL, ...); extern id objc_msgSendSuper2_fixup(id, SEL, ...); @@ -3843,6 +5173,14 @@ extern id objc_msgSend_stret_fixup(id, SEL, ...); extern id objc_msgSend_stret_fixedup(id, SEL, ...); extern id objc_msgSendSuper2_stret_fixup(id, SEL, ...); extern id objc_msgSendSuper2_stret_fixedup(id, SEL, ...); +#if defined(__i386__) || defined(__x86_64__) +extern id objc_msgSend_fpret_fixup(id, SEL, ...); +extern id objc_msgSend_fpret_fixedup(id, SEL, ...); +#endif +#if defined(__x86_64__) +extern id objc_msgSend_fp2ret_fixup(id, SEL, ...); +extern id objc_msgSend_fp2ret_fixedup(id, SEL, ...); +#endif /*********************************************************************** * _objc_fixupMessageRef @@ -3856,7 +5194,7 @@ _objc_fixupMessageRef(id obj, struct objc_super2 *supr, message_ref *msg) IMP imp; class_t *isa; - OBJC_CHECK_UNLOCKED(&runtimeLock); + rwlock_assert_unlocked(&runtimeLock); if (!supr) { // normal message - search obj->isa for the method implementation @@ -3865,16 +5203,14 @@ _objc_fixupMessageRef(id obj, struct objc_super2 *supr, message_ref *msg) if (!isRealized(isa)) { // obj is a class object, isa is its metaclass class_t *cls; - OBJC_LOCK(&runtimeLock); - if (!isRealized(isa)) { - cls = realizeClass((class_t *)obj); + rwlock_write(&runtimeLock); + cls = realizeClass((class_t *)obj); + rwlock_unlock_write(&runtimeLock); - // shouldn't have instances of unrealized classes! - assert(isMetaClass(isa)); - // shouldn't be relocating classes here! - assert(cls == (class_t *)obj); - } - OBJC_UNLOCK(&runtimeLock); + // shouldn't have instances of unrealized classes! + assert(isMetaClass(isa)); + // shouldn't be relocating classes here! + assert(cls == (class_t *)obj); } } else { @@ -3885,28 +5221,57 @@ _objc_fixupMessageRef(id obj, struct objc_super2 *supr, message_ref *msg) } msg->sel = sel_registerName((const char *)msg->sel); - imp = _class_lookupMethodAndLoadCache((Class)isa, msg->sel); - - if (msg->imp == (IMP)&objc_msgSend_fixup) { - msg->imp = (IMP)&objc_msgSend_fixedup; - } - else if (msg->imp == (IMP)&objc_msgSendSuper2_fixup) { - msg->imp = (IMP)&objc_msgSendSuper2_fixedup; - } - else if (msg->imp == (IMP)&objc_msgSend_stret_fixup) { - msg->imp = (IMP)&objc_msgSend_stret_fixedup; - } - else if (msg->imp == (IMP)&objc_msgSendSuper2_stret_fixup) { - msg->imp = (IMP)&objc_msgSendSuper2_stret_fixedup; - } - else { - // The ref may already have been fixed up, either by another thread, - // or by +initialize via class_lookupMethodAndLoadCache above. + +#ifndef NO_VTABLE + int vtableIndex; + if (msg->imp == (IMP)&objc_msgSend_fixup && + (vtableIndex = vtable_getIndex(msg->sel)) >= 0) + { + // vtable dispatch + msg->imp = vtableTrampolines[vtableIndex]; + imp = isa->vtable[vtableIndex]; + } + else +#endif + { + // ordinary dispatch + imp = lookUpMethod((Class)isa, msg->sel, YES/*initialize*/, YES/*cache*/); + + if (msg->imp == (IMP)&objc_msgSend_fixup) { + msg->imp = (IMP)&objc_msgSend_fixedup; + } + else if (msg->imp == (IMP)&objc_msgSendSuper2_fixup) { + msg->imp = (IMP)&objc_msgSendSuper2_fixedup; + } + else if (msg->imp == (IMP)&objc_msgSend_stret_fixup) { + msg->imp = (IMP)&objc_msgSend_stret_fixedup; + } + else if (msg->imp == (IMP)&objc_msgSendSuper2_stret_fixup) { + msg->imp = (IMP)&objc_msgSendSuper2_stret_fixedup; + } +#if defined(__i386__) || defined(__x86_64__) + else if (msg->imp == (IMP)&objc_msgSend_fpret_fixup) { + msg->imp = (IMP)&objc_msgSend_fpret_fixedup; + } +#endif +#if defined(__x86_64__) + else if (msg->imp == (IMP)&objc_msgSend_fp2ret_fixup) { + msg->imp = (IMP)&objc_msgSend_fp2ret_fixedup; + } +#endif + else { + // The ref may already have been fixed up, either by another thread + // or by +initialize via lookUpMethod above. + } } return imp; } +// ! NO_FIXUP +#endif + + #warning fixme delete after #4586306 Class class_poseAs(Class imposter, Class original) { @@ -3919,7 +5284,7 @@ static class_t *setSuperclass(class_t *cls, class_t *newSuper) { class_t *oldSuper; - OBJC_CHECK_LOCKED(&runtimeLock); + rwlock_assert_writing(&runtimeLock); oldSuper = cls->superclass; removeSubclass(oldSuper, cls); @@ -3932,6 +5297,8 @@ static class_t *setSuperclass(class_t *cls, class_t *newSuper) flushCaches(cls); flushCaches(cls->isa); + flushVtables(cls); + flushVtables(cls->isa); return oldSuper; } @@ -3943,9 +5310,9 @@ Class class_setSuperclass(Class cls_gen, Class newSuper_gen) class_t *newSuper = newcls(newSuper_gen); class_t *oldSuper; - OBJC_LOCK(&runtimeLock); + rwlock_write(&runtimeLock); oldSuper = setSuperclass(cls, newSuper); - OBJC_UNLOCK(&runtimeLock); + rwlock_unlock_write(&runtimeLock); return (Class)oldSuper; } diff --git a/runtime/objc-runtime-old.m b/runtime/objc-runtime-old.m index 946f7f7..954bc7a 100644 --- a/runtime/objc-runtime-old.m +++ b/runtime/objc-runtime-old.m @@ -136,16 +136,9 @@ #if !__OBJC2__ -#include -#include -#include -#include - #define OLD 1 -#import "objc-private.h" -#import "objc-loadmethod.h" -#import "hashtable2.h" -#import "maptable.h" +#include "objc-private.h" +#include "objc-loadmethod.h" /* NXHashTable SPI */ extern unsigned _NXHashCapacity(NXHashTable *table); @@ -185,7 +178,6 @@ static void resolve_references_to_class(struct old_class *cls); static void resolve_subclasses_of_class(struct old_class *cls); static void really_connect_class(struct old_class *cls, struct old_class *supercls); static BOOL connect_class(struct old_class *cls); -static inline BOOL map_selrefs(SEL *src, SEL *dst, size_t size, BOOL copy); static void map_method_descs (struct objc_method_description_list * methods, BOOL copy); static void _objcTweakMethodListPointerForClass(struct old_class *cls); static inline void _objc_add_category(struct old_class *cls, struct old_category *category, int version); @@ -198,10 +190,6 @@ static BOOL _objc_register_category(struct old_category *cat, int version); // Function called when a class is loaded from an image __private_extern__ void (*callbackFunction)(Class, const char *) = 0; -// Lock for class and protocol hashtables -// classLock > cacheUpdateLock -__private_extern__ OBJC_DECLARE_LOCK (classLock); - // Hash table of classes __private_extern__ NXHashTable * class_hash NOBSS = 0; static NXHashTablePrototype classHashPrototype = @@ -239,22 +227,6 @@ static int (*objc_classHandler) (const char *) = _objc_defaultClassHandler; static BOOL (*_objc_classLoader)(const char *) = NULL; -/*********************************************************************** -* inform_duplicate. Complain about duplicate class implementations. -**********************************************************************/ -static void inform_duplicate(struct old_class *oldCls, struct old_class *cls) -{ - const header_info *oldHeader = _headerForClass((Class)oldCls); - const header_info *newHeader = _headerForClass((Class)cls); - const char *oldName = _nameForHeader(oldHeader->mhdr); - const char *newName = _nameForHeader(newHeader->mhdr); - - _objc_inform ("Class %s is implemented in both %s and %s. " - "Using implementation from %s.", - oldCls->name, oldName, newName, newName); -} - - /*********************************************************************** * objc_dump_class_hash. Log names of all known classes. **********************************************************************/ @@ -304,23 +276,27 @@ __private_extern__ void _objc_init_class_hash(void) int objc_getClassList(Class *buffer, int bufferLen) { NXHashState state; - Class class; + Class cls; int cnt, num; - OBJC_LOCK(&classLock); + mutex_lock(&classLock); + if (!class_hash) { + mutex_unlock(&classLock); + return 0; + } num = NXCountHashTable(class_hash); if (NULL == buffer) { - OBJC_UNLOCK(&classLock); + mutex_unlock(&classLock); return num; } cnt = 0; state = NXInitHashState(class_hash); while (cnt < bufferLen && - NXNextHashState(class_hash, &state, (void **)&class)) + NXNextHashState(class_hash, &state, (void **)&cls)) { - buffer[cnt++] = class; + buffer[cnt++] = cls; } - OBJC_UNLOCK(&classLock); + mutex_unlock(&classLock); return num; } @@ -333,17 +309,17 @@ int objc_getClassList(Class *buffer, int bufferLen) Protocol ** objc_copyProtocolList(unsigned int *outCount) { - OBJC_LOCK(&classLock); - int count, i; Protocol *proto; const char *name; NXMapState state; Protocol **result; + mutex_lock(&classLock); + count = NXCountMapTable(protocol_map); if (count == 0) { - OBJC_UNLOCK(&classLock); + mutex_unlock(&classLock); if (outCount) *outCount = 0; return NULL; } @@ -361,7 +337,7 @@ objc_copyProtocolList(unsigned int *outCount) result[i++] = NULL; assert(i == count+1); - OBJC_UNLOCK(&classLock); + mutex_unlock(&classLock); if (outCount) *outCount = count; return result; @@ -513,7 +489,7 @@ __private_extern__ Class _objc_allocateFutureClass(const char *name) } } - cls = _calloc_internal(sizeof(*cls), 1); + cls = (struct old_class *)_calloc_class(sizeof(*cls)); makeFutureClass(cls, name); return (Class)cls; } @@ -530,17 +506,19 @@ void objc_setFutureClass(Class cls, const char *name) struct old_class *oldcls; struct old_class *newcls = (struct old_class *)cls; // Not a real class! - if ((oldcls = _class_asOld(look_up_class(name, NO/*unconnected*/, NO/*classhandler*/)))) { + if ((oldcls = _class_asOld((Class)look_up_class(name, NO/*unconnected*/, NO/*classhandler*/)))) { setOriginalClassForFutureClass(newcls, oldcls); // fixme hack memcpy(newcls, oldcls, sizeof(struct objc_class)); newcls->info &= ~CLS_EXT; - OBJC_LOCK(&classLock); + mutex_lock(&classLock); NXHashRemove(class_hash, oldcls); + objc_removeRegisteredClass((Class)oldcls); change_class_references(newcls, oldcls, nil, YES); NXHashInsert(class_hash, newcls); - OBJC_UNLOCK(&classLock); + objc_addRegisteredClass((Class)newcls); + mutex_unlock(&classLock); } else { makeFutureClass(newcls, name); } @@ -592,9 +570,9 @@ Protocol *objc_getProtocol(const char *name) { Protocol *result; if (!protocol_map) return NULL; - OBJC_LOCK(&classLock); + mutex_lock(&classLock); result = (Protocol *)NXMapGet(protocol_map, name); - OBJC_UNLOCK(&classLock); + mutex_unlock(&classLock); return result; } @@ -622,16 +600,16 @@ __private_extern__ id look_up_class(const char *aClassName, BOOL includeUnconnec if (!result && class_hash) { // Check ordinary classes - OBJC_LOCK (&classLock); + mutex_lock (&classLock); result = (id)NXHashGet(class_hash, &query); - OBJC_UNLOCK (&classLock); + mutex_unlock (&classLock); } if (!result && includeUnconnected && unconnected_class_hash) { // Check not-yet-connected classes - OBJC_LOCK(&classLock); + mutex_lock(&classLock); result = (id)NXHashGet(unconnected_class_hash, &query); - OBJC_UNLOCK(&classLock); + mutex_unlock(&classLock); } if (!result && includeClassLoader && _objc_classLoader) { @@ -666,9 +644,9 @@ __private_extern__ id look_up_class(const char *aClassName, BOOL includeUnconnec static BOOL class_is_connected(struct old_class *cls) { BOOL result; - OBJC_LOCK(&classLock); + mutex_lock(&classLock); result = NXHashMember(class_hash, cls); - OBJC_UNLOCK(&classLock); + mutex_unlock(&classLock); return result; } @@ -749,7 +727,7 @@ static void pendClassInstallation(struct old_class *cls, const char *superName) pending->next = oldList; // (Re)place entry list in the table - (void) NXMapKeyCopyingInsert (table, superName, pending); + NXMapKeyCopyingInsert (table, superName, pending); } @@ -776,7 +754,7 @@ static void pendClassReference(struct old_class **ref, const char *className, BO pending->next = NXMapGet (table, className); // (Re)place entry list in the table - (void) NXMapKeyCopyingInsert (table, className, pending); + NXMapKeyCopyingInsert (table, className, pending); if (PrintConnecting) { _objc_inform("CONNECT: pended reference to class '%s%s' at %p", @@ -873,13 +851,12 @@ static void really_connect_class(struct old_class *cls, set_superclass(cls, supercls); // Update GC layouts - // For paranoia, this is a conservative update: only non-strong -> strong - // is corrected. Any bugs will be leaks instead of crashes. - // rdar://5791689 covers any less-paranoid more-complete fix. + // For paranoia, this is a conservative update: + // only non-strong -> strong and weak -> strong are corrected. if (UseGC && supercls && (cls->info & CLS_EXT) && (supercls->info & CLS_EXT)) { - BOOL layoutsChanged = NO; + BOOL layoutChanged; layout_bitmap ivarBitmap = layout_bitmap_create(cls->ivar_layout, cls->instance_size, @@ -889,16 +866,46 @@ static void really_connect_class(struct old_class *cls, layout_bitmap_create(supercls->ivar_layout, supercls->instance_size, supercls->instance_size, NO); - layoutsChanged |= layout_bitmap_or(ivarBitmap, superBitmap, cls->name); + + // non-strong -> strong: bits set in super should be set in sub + layoutChanged = layout_bitmap_or(ivarBitmap, superBitmap, cls->name); layout_bitmap_free(superBitmap); - - if (layoutsChanged) { + + if (layoutChanged) { + layout_bitmap weakBitmap = {0}; + BOOL weakLayoutChanged = NO; + + if (cls->ext && cls->ext->weak_ivar_layout) { + // weak -> strong: strong bits should be cleared in weak layout + // This is a subset of non-strong -> strong + weakBitmap = + layout_bitmap_create(cls->ext->weak_ivar_layout, + cls->instance_size, + cls->instance_size, YES); + + weakLayoutChanged = + layout_bitmap_clear(weakBitmap, ivarBitmap, cls->name); + } else { + // no existing weak ivars, so no weak -> strong changes + } + // Rebuild layout strings. if (PrintIvars) { - _objc_inform("IVARS: gc layout changed for class %s (super %s)", + _objc_inform("IVARS: gc layout changed " + "for class %s (super %s)", cls->name, supercls->name); + if (weakLayoutChanged) { + _objc_inform("IVARS: gc weak layout changed " + "for class %s (super %s)", + cls->name, supercls->name); + } } cls->ivar_layout = layout_string_create(ivarBitmap); + if (weakLayoutChanged) { + cls->ext->weak_ivar_layout = layout_string_create(weakBitmap); + } + + layout_bitmap_free(weakBitmap); } layout_bitmap_free(ivarBitmap); @@ -907,11 +914,12 @@ static void really_connect_class(struct old_class *cls, // Done! cls->info |= CLS_CONNECTED; - OBJC_LOCK(&classLock); + mutex_lock(&classLock); // Update hash tables. NXHashRemove(unconnected_class_hash, cls); oldCls = NXHashInsert(class_hash, cls); + objc_addRegisteredClass((Class)cls); // Delete unconnected_class_hash if it is now empty. if (NXCountHashTable(unconnected_class_hash) == 0) { @@ -919,13 +927,11 @@ static void really_connect_class(struct old_class *cls, unconnected_class_hash = NULL; } - OBJC_UNLOCK(&classLock); + // No duplicate classes allowed. + // Duplicates should have been rejected by _objc_read_classes_from_image. + assert(!oldCls); - // Warn if the new class has the same name as a previously-installed class. - // The new class is kept and the old class is discarded. - if (oldCls) { - inform_duplicate(oldCls, cls); - } + mutex_unlock(&classLock); // Connect newly-connectable subclasses resolve_subclasses_of_class(cls); @@ -1012,7 +1018,7 @@ static BOOL connect_class(struct old_class *cls) struct old_class *supercls; // YES unconnected, YES class handler - if (NULL == (supercls = _class_asOld(look_up_class(supercls_name, YES, YES)))) { + if (NULL == (supercls = _class_asOld((Class)look_up_class(supercls_name, YES, YES)))) { // Superclass does not exist yet. // pendClassInstallation will handle duplicate pends of this class pendClassInstallation(cls, supercls_name); @@ -1111,7 +1117,7 @@ static void _objc_read_classes_from_image(header_info *hi) unsigned int index; unsigned int midx; Module mods; - int isBundle = (hi->mhdr->filetype == MH_BUNDLE); + int isBundle = headerIsBundle(hi); if (_objcHeaderIsReplacement(hi)) { // Ignore any classes in this image @@ -1122,11 +1128,11 @@ static void _objc_read_classes_from_image(header_info *hi) // If other Objective-C libraries are found, immediately resize // class_hash, assuming that Foundation and AppKit are about // to add lots of classes. - OBJC_LOCK(&classLock); - if (hi->mhdr != (headerType *)&_mh_dylib_header && _NXHashCapacity(class_hash) < 1024) { + mutex_lock(&classLock); + if (hi->mhdr != libobjc_header && _NXHashCapacity(class_hash) < 1024) { _NXHashRehashToCapacity(class_hash, 1024); } - OBJC_UNLOCK(&classLock); + mutex_unlock(&classLock); // Major loop - process all modules in the image mods = hi->mod_ptr; @@ -1140,6 +1146,7 @@ static void _objc_read_classes_from_image(header_info *hi) for (index = 0; index < mods[midx].symtab->cls_def_cnt; index += 1) { struct old_class *newCls, *oldCls; + BOOL rejected; // Locate the class description pointer newCls = mods[midx].symtab->defs[index]; @@ -1178,7 +1185,7 @@ static void _objc_read_classes_from_image(header_info *hi) } // Install into unconnected_class_hash. - OBJC_LOCK(&classLock); + mutex_lock(&classLock); if (future_class_hash) { struct old_class *futureCls = @@ -1204,21 +1211,27 @@ static void _objc_read_classes_from_image(header_info *hi) NULL, _objc_internal_zone()); } - oldCls = NXHashInsert(unconnected_class_hash, newCls); - if (oldCls) { - // Duplicate classes loaded. - // newCls has been inserted over oldCls, - // same as really_connect_class - inform_duplicate(oldCls, newCls); + if ((oldCls = NXHashGet(class_hash, newCls)) || + (oldCls = NXHashGet(unconnected_class_hash, newCls))) + { + // Another class with this name exists. Complain and reject. + inform_duplicate(newCls->name, (Class)oldCls, (Class)newCls); + rejected = YES; + } + else { + NXHashInsert(unconnected_class_hash, newCls); + rejected = NO; } - OBJC_UNLOCK(&classLock); + mutex_unlock(&classLock); - // Fix up pended class refs to this class, if any - resolve_references_to_class(newCls); + if (!rejected) { + // Fix up pended class refs to this class, if any + resolve_references_to_class(newCls); - // Attach pended categories for this class, if any - resolve_categories_for_class(newCls); + // Attach pended categories for this class, if any + resolve_categories_for_class(newCls); + } } } } @@ -1257,7 +1270,7 @@ static void _objc_connect_classes_from_image(header_info *hi) // field for [super ...] use, but otherwise perform // fixups on the new class struct only. const char *super_name = (const char *) cls->super_class; - if (super_name) cls->super_class = _class_asOld(objc_getClass(super_name)); + if (super_name) cls->super_class = _class_asOld((Class)objc_getClass(super_name)); cls = futureCls; } connected = connect_class(cls); @@ -1269,7 +1282,7 @@ static void _objc_connect_classes_from_image(header_info *hi) // And metaclass's super_class (#5351107) const char *super_name = (const char *) cls->super_class; if (super_name) { - cls->super_class = _class_asOld(objc_getClass(super_name)); + cls->super_class = _class_asOld((Class)objc_getClass(super_name)); // metaclass's superclass is superclass's metaclass cls->isa->super_class = cls->super_class->isa; } else { @@ -1296,7 +1309,7 @@ static void fix_class_ref(struct old_class **ref, const char *name, BOOL isMeta) // Get pointer to class of this name // YES unconnected, YES class loader - cls = _class_asOld(look_up_class(name, YES, YES)); + cls = _class_asOld((Class)look_up_class(name, YES, YES)); if (cls) { // Referenced class exists. Fix up the reference. *ref = isMeta ? cls->isa : cls; @@ -1321,21 +1334,7 @@ static void _objc_map_class_refs_for_image (header_info * hi) for (index = 0; index < count; index += 1) { // Ref is initially class name char* const char *name = (const char *) cls_refs[index]; - if (name == NULL) { - // rdar://5453039 is the entire page zero, or just this pointer - uintptr_t *p = (uintptr_t *)(((uintptr_t)&cls_refs[index]) & ~0xfff); - uintptr_t *end = (uintptr_t *)(((uintptr_t)p)+0x1000); - int clear = 1; - for ( ; p < end; p++) { - if (*p != 0) { - clear = 0; - break; - } - } - _objc_inform_on_crash("rdar://5453039 page around %p IS%s clear", - &cls_refs[index], clear ? "" : " NOT"); - // crash in the usual spot so CrashTracer coalesces it - } + if (!name) continue; fix_class_ref(&cls_refs[index], name, NO /*never meta*/); } } @@ -1357,16 +1356,18 @@ static void removePendingReferences(struct old_class **refs, size_t count) // Search the pending class ref table for class refs in this range. // The class refs may have already been stomped with nonexistentClass, // so there's no way to recover the original class name. - - const char *key; - PendingClassRef *pending; - NXMapState state = NXInitMapState(pendingClassRefsMap); - while(NXNextMapState(pendingClassRefsMap, &state, - (const void **)&key, (const void **)&pending)) - { - for ( ; pending != NULL; pending = pending->next) { - if (pending->ref >= refs && pending->ref < end) { - pending->ref = NULL; + + { + const char *key; + PendingClassRef *pending; + NXMapState state = NXInitMapState(pendingClassRefsMap); + while(NXNextMapState(pendingClassRefsMap, &state, + (const void **)&key, (const void **)&pending)) + { + for ( ; pending != NULL; pending = pending->next) { + if (pending->ref >= refs && pending->ref < end) { + pending->ref = NULL; + } } } } @@ -1391,71 +1392,30 @@ static void _objc_remove_pending_class_refs_in_image(header_info *hi) * can still be used after the bundle's data segment is unmapped. * Returns YES if dst was written to, NO if it was unchanged. **********************************************************************/ -static inline BOOL map_selrefs(SEL *src, SEL *dst, size_t size, BOOL copy) +static inline void map_selrefs(SEL *sels, size_t count, BOOL copy) { - BOOL result = NO; - size_t cnt = size / sizeof(SEL); size_t index; - sel_lock(); - - // Process each selector - for (index = 0; index < cnt; index += 1) - { - SEL sel; - - // Lookup pointer to uniqued string - sel = sel_registerNameNoLock((const char *) src[index], copy); - - // Replace this selector with uniqued one (avoid - // modifying the VM page if this would be a NOP) - if (dst[index] != sel) { - dst[index] = sel; - result = YES; - } - } - - sel_unlock(); - - return result; -} - - -/*********************************************************************** -* map_message_refs. For each message ref in the specified array, -* replace the name pointer with a uniqued selector. -* If copy is TRUE, all selector data is always copied. This is used -* for registering selectors from unloadable bundles, so the selector -* can still be used after the bundle's data segment is unmapped. -* Returns YES if dst was written to, NO if it was unchanged. -**********************************************************************/ -static inline BOOL map_message_refs(message_ref *src, message_ref *dst, size_t size, BOOL copy) -{ - BOOL result = NO; - size_t cnt = size / sizeof(message_ref); - size_t index; + if (!sels) return; sel_lock(); // Process each selector - for (index = 0; index < cnt; index += 1) + for (index = 0; index < count; index += 1) { SEL sel; // Lookup pointer to uniqued string - sel = sel_registerNameNoLock((const char *) src[index].sel, copy); + sel = sel_registerNameNoLock((const char *) sels[index], copy); // Replace this selector with uniqued one (avoid // modifying the VM page if this would be a NOP) - if (dst[index].sel != sel) { - dst[index].sel = sel; - result = YES; + if (sels[index] != sel) { + sels[index] = sel; } } sel_unlock(); - - return result; } @@ -1468,7 +1428,7 @@ static inline BOOL map_message_refs(message_ref *src, message_ref *dst, size_t s **********************************************************************/ static void map_method_descs (struct objc_method_description_list * methods, BOOL copy) { - unsigned int index; + int index; if (!methods) return; @@ -1588,14 +1548,15 @@ struct objc_method_description protocol_getMethodDescription(Protocol *p, SEL aSel, BOOL isRequiredMethod, BOOL isInstanceMethod) { + struct objc_method_description empty = {NULL, NULL}; struct old_protocol *proto = oldprotocol(p); - if (!proto) return (struct objc_method_description){NULL, NULL}; + struct objc_method_description *desc; + if (!proto) return empty; - struct objc_method_description *desc = - lookup_protocol_method(proto, aSel, - isRequiredMethod, isInstanceMethod); + desc = lookup_protocol_method(proto, aSel, + isRequiredMethod, isInstanceMethod); if (desc) return *desc; - else return (struct objc_method_description){NULL, NULL}; + else return empty; } @@ -1614,6 +1575,8 @@ protocol_copyMethodDescriptionList(Protocol *p, struct objc_method_description_list *mlist = NULL; struct old_protocol *proto = oldprotocol(p); struct old_protocol_ext *ext; + unsigned int i, count; + struct objc_method_description *result; if (!proto) { if (outCount) *outCount = 0; @@ -1639,9 +1602,8 @@ protocol_copyMethodDescriptionList(Protocol *p, return NULL; } - unsigned int i; - unsigned int count = mlist->count; - struct objc_method_description *result = + count = mlist->count; + result = calloc(count + 1, sizeof(struct objc_method_description)); for (i = 0; i < count; i++) { result[i] = mlist->list[i]; @@ -1656,6 +1618,8 @@ Property protocol_getProperty(Protocol *p, const char *name, BOOL isRequiredProperty, BOOL isInstanceProperty) { struct old_protocol *proto = oldprotocol(p); + struct old_protocol_ext *ext; + struct old_protocol_list *plist; if (!proto || !name) return NULL; @@ -1664,7 +1628,6 @@ Property protocol_getProperty(Protocol *p, const char *name, return NULL; } - struct old_protocol_ext *ext; if ((ext = ext_for_protocol(proto))) { struct objc_property_list *plist; if ((plist = ext->instance_properties)) { @@ -1678,7 +1641,6 @@ Property protocol_getProperty(Protocol *p, const char *name, } } - struct old_protocol_list *plist; if ((plist = proto->protocol_list)) { int i; for (i = 0; i < plist->count; i++) { @@ -1697,6 +1659,7 @@ Property *protocol_copyPropertyList(Protocol *p, unsigned int *outCount) { Property *result = NULL; struct old_protocol_ext *ext; + struct objc_property_list *plist; struct old_protocol *proto = oldprotocol(p); if (! (ext = ext_for_protocol(proto))) { @@ -1704,7 +1667,7 @@ Property *protocol_copyPropertyList(Protocol *p, unsigned int *outCount) return NULL; } - struct objc_property_list *plist = ext->instance_properties; + plist = ext->instance_properties; result = copyPropertyList(plist, outCount); return result; @@ -1731,9 +1694,9 @@ Protocol **protocol_copyProtocolList(Protocol *p, unsigned int *outCount) count = (unsigned int)proto->protocol_list->count; } if (count > 0) { + unsigned int i; result = malloc((count+1) * sizeof(Protocol *)); - unsigned int i; for (i = 0; i < count; i++) { result[i] = (Protocol *)proto->protocol_list->list[i]; } @@ -1814,10 +1777,10 @@ static BOOL versionIsExt(uintptr_t version, const char *names, size_t size) static void fix_protocol(struct old_protocol *proto, Class protocolClass, BOOL isBundle, const char *names, size_t names_size) { -#warning GrP fixme hack + uintptr_t version; if (!proto) return; - uintptr_t version = (uintptr_t)proto->isa; + version = (uintptr_t)proto->isa; // Set the protocol's isa proto->isa = protocolClass; @@ -1855,14 +1818,14 @@ static void fix_protocol(struct old_protocol *proto, Class protocolClass, static void _objc_fixup_protocol_objects_for_image (header_info * hi) { - Class protocolClass = objc_getClass("Protocol"); + Class protocolClass = (Class)objc_getClass("Protocol"); size_t count, i; - struct old_protocol *protos; - int isBundle = hi->mhdr->filetype == MH_BUNDLE; + struct old_protocol **protos; + int isBundle = headerIsBundle(hi); const char *names; size_t names_size; - OBJC_LOCK(&classLock); + mutex_lock(&classLock); // Allocate the protocol registry if necessary. if (!protocol_map) { @@ -1879,10 +1842,10 @@ static void _objc_fixup_protocol_objects_for_image (header_info * hi) protos = _getObjcProtocols(hi, &count); names = _getObjcClassNames(hi, &names_size); for (i = 0; i < count; i++) { - fix_protocol(&protos[i], protocolClass, isBundle, names, names_size); + fix_protocol(protos[i], protocolClass, isBundle, names, names_size); } - OBJC_UNLOCK(&classLock); + mutex_unlock(&classLock); } @@ -1895,12 +1858,92 @@ static void _objc_fixup_selector_refs (const header_info *hi) size_t count; SEL *sels; - // Fix up selector refs + if (PrintPreopt) { + if (sel_preoptimizationValid(hi)) { + _objc_inform("PREOPTIMIZATION: honoring preoptimized selectors in %s", + _nameForHeader(hi->mhdr)); + } + else if (_objcHeaderOptimizedByDyld(hi)) { + _objc_inform("PREOPTIMIZATION: IGNORING preoptimized selectors in %s", + _nameForHeader(hi->mhdr)); + } + } + + if (sel_preoptimizationValid(hi)) return; + sels = _getObjcSelectorRefs (hi, &count); - if (sels) { - map_selrefs(sels, sels, count * sizeof(SEL), - hi->mhdr->filetype == MH_BUNDLE); + + map_selrefs(sels, count, headerIsBundle(hi)); +} + +static inline BOOL _is_threaded() { +#if TARGET_OS_WIN32 + return YES; +#else + return pthread_is_threaded_np() != 0; +#endif +} + +/*********************************************************************** +* unmap_image +* Process the given image which is about to be unmapped by dyld. +* mh is mach_header instead of headerType because that's what +* dyld_priv.h says even for 64-bit. +**********************************************************************/ +__private_extern__ void +unmap_image(const struct mach_header *mh, intptr_t vmaddr_slide) +{ + recursive_mutex_lock(&loadMethodLock); + unmap_image_nolock(mh, vmaddr_slide); + recursive_mutex_unlock(&loadMethodLock); +} + + +/*********************************************************************** +* map_images +* Process the given images which are being mapped in by dyld. +* Calls ABI-agnostic code after taking ABI-specific locks. +**********************************************************************/ +__private_extern__ const char * +map_images(enum dyld_image_states state, uint32_t infoCount, + const struct dyld_image_info infoList[]) +{ + const char *err; + + recursive_mutex_lock(&loadMethodLock); + err = map_images_nolock(state, infoCount, infoList); + recursive_mutex_unlock(&loadMethodLock); + + return err; +} + + +/*********************************************************************** +* load_images +* Process +load in the given images which are being mapped in by dyld. +* Calls ABI-agnostic code after taking ABI-specific locks. +* +* Locking: acquires classLock and loadMethodLock +**********************************************************************/ +__private_extern__ const char * +load_images(enum dyld_image_states state, uint32_t infoCount, + const struct dyld_image_info infoList[]) +{ + BOOL found; + + recursive_mutex_lock(&loadMethodLock); + + // Discover +load methods + found = load_images_nolock(state, infoCount, infoList); + + // Call +load methods (without classLock - re-entrant) + if (found) { + call_load_methods(); } + + recursive_mutex_unlock(&loadMethodLock); + + return NULL; } @@ -1911,6 +1954,7 @@ static void _objc_fixup_selector_refs (const header_info *hi) __private_extern__ void _read_images(header_info **hList, uint32_t hCount) { uint32_t i; + BOOL categoriesLoaded = NO; if (!class_hash) _objc_init_class_hash(); @@ -1922,11 +1966,16 @@ __private_extern__ void _read_images(header_info **hList, uint32_t hCount) } // Read categories from all images. - BOOL needFlush = NO; - for (i = 0; i < hCount; i++) { - needFlush |= _objc_read_categories_from_image(hList[i]); + // But not if any other threads are running - they might + // call a category method before the fixups below are complete. + if (!_is_threaded()) { + BOOL needFlush = NO; + for (i = 0; i < hCount; i++) { + needFlush |= _objc_read_categories_from_image(hList[i]); + } + if (needFlush) flush_marked_caches(); + categoriesLoaded = YES; } - if (needFlush) flush_marked_caches(); // Connect classes from all images. for (i = 0; i < hCount; i++) { @@ -1939,6 +1988,19 @@ __private_extern__ void _read_images(header_info **hList, uint32_t hCount) _objc_fixup_selector_refs(hList[i]); _objc_fixup_protocol_objects_for_image(hList[i]); } + + // Read categories from all images. + // But not if this is the only thread - it's more + // efficient to attach categories earlier if safe. + if (!categoriesLoaded) { + BOOL needFlush = NO; + for (i = 0; i < hCount; i++) { + needFlush |= _objc_read_categories_from_image(hList[i]); + } + if (needFlush) flush_marked_caches(); + } + + // Multi-threaded category load MUST BE LAST to avoid a race. } @@ -1996,7 +2058,7 @@ __private_extern__ void prepare_load_methods(header_info *hi) // NOTE: The module and category lists are traversed backwards // to preserve the pre-10.4 processing order. Changing the order // would have a small chance of introducing binary compatibility bugs. - midx = hi->mod_count; + midx = (unsigned int)hi->mod_count; while (midx-- > 0) { unsigned int index; unsigned int total; @@ -2020,6 +2082,14 @@ __private_extern__ void prepare_load_methods(header_info *hi) } +#if TARGET_OS_WIN32 + +__private_extern__ void unload_class(struct old_class *cls) +{ +} + +#else + /*********************************************************************** * _objc_remove_classes_in_image * Remove all classes in the given image from the runtime, because @@ -2060,18 +2130,21 @@ static void try_free(const void *p) static void unload_mlist(struct old_method_list *mlist) { int i; - if (mlist->obsolete == _OBJC_FIXED_UP) { - for (i = 0; i < mlist->method_count; i++) { - try_free(mlist->method_list[i].method_types); - } - - try_free(mlist); + for (i = 0; i < mlist->method_count; i++) { + try_free(mlist->method_list[i].method_types); } + try_free(mlist); } // Deallocate all memory in a class. __private_extern__ void unload_class(struct old_class *cls) { + // Free method cache + // This dereferences the cache contents; do this before freeing methods + if (cls->cache && cls->cache != &_objc_empty_cache) { + _cache_free(cls->cache); + } + // Free ivar lists if (cls->ivars) { int i; @@ -2110,11 +2183,6 @@ __private_extern__ void unload_class(struct old_class *cls) try_free(dead); } - // Free method cache - if (cls->cache && cls->cache != &_objc_empty_cache) { - _cache_free(cls->cache); - } - if ((cls->info & CLS_EXT)) { if (cls->ext) { // Free property lists and property list array @@ -2161,7 +2229,7 @@ static void _objc_remove_classes_in_image(header_info *hi) unsigned int midx; Module mods; - OBJC_LOCK(&classLock); + mutex_lock(&classLock); // Major loop - process all modules in the image mods = hi->mod_ptr; @@ -2201,6 +2269,7 @@ static void _objc_remove_classes_in_image(header_info *hi) // Remove from class_hash NXHashRemove(class_hash, cls); + objc_removeRegisteredClass((Class)cls); // Free heap memory pointed to by the class unload_class(cls->isa); @@ -2213,14 +2282,11 @@ static void _objc_remove_classes_in_image(header_info *hi) // Un-fix and re-pend any such class refs. // Get the location of the dying image's __OBJC segment - uintptr_t seg = hi->objcSegmentHeader->vmaddr + hi->image_slide; - size_t seg_size = hi->objcSegmentHeader->filesize; + uintptr_t seg = hi->os.objcSegmentHeader->vmaddr + hi->os.image_slide; + size_t seg_size = hi->os.objcSegmentHeader->filesize; header_info *other_hi; - for (other_hi = _objc_headerStart(); - other_hi != NULL; - other_hi = other_hi->next) - { + for (other_hi = FirstHeader; other_hi != NULL; other_hi = other_hi->next) { struct old_class **other_refs; size_t count; if (other_hi == hi) continue; // skip the image being unloaded @@ -2230,7 +2296,7 @@ static void _objc_remove_classes_in_image(header_info *hi) rependClassReferences(other_refs, count, seg, seg+seg_size); } - OBJC_UNLOCK(&classLock); + mutex_unlock(&classLock); } @@ -2294,13 +2360,13 @@ static void _objc_remove_categories_in_image(header_info *hi) static void unload_paranoia(header_info *hi) { // Get the location of the dying image's __OBJC segment - uintptr_t seg = hi->objcSegmentHeader->vmaddr + hi->image_slide; - size_t seg_size = hi->objcSegmentHeader->filesize; + uintptr_t seg = hi->os.objcSegmentHeader->vmaddr + hi->os.image_slide; + size_t seg_size = hi->os.objcSegmentHeader->filesize; _objc_inform("UNLOAD DEBUG: unloading image '%s' [%p..%p]", _nameForHeader(hi->mhdr), (void *)seg, (void*)(seg+seg_size)); - OBJC_LOCK(&classLock); + mutex_lock(&classLock); // Make sure the image contains no categories on surviving classes. { @@ -2358,16 +2424,19 @@ static void unload_paranoia(header_info *hi) } } - OBJC_UNLOCK(&classLock); + mutex_unlock(&classLock); } /*********************************************************************** * _unload_image * Only handles MH_BUNDLE for now. +* Locking: loadMethodLock acquired by unmap_image **********************************************************************/ __private_extern__ void _unload_image(header_info *hi) { + recursive_mutex_assert_locked(&loadMethodLock); + // Cleanup: // Remove image's classes from the class list and free auxiliary data. // Remove image's unresolved or loadable categories and free auxiliary data @@ -2380,6 +2449,8 @@ __private_extern__ void _unload_image(header_info *hi) if (DebugUnload) unload_paranoia(hi); } +#endif + /*********************************************************************** * objc_addClass. Add the specified class to the table of known classes, @@ -2392,7 +2463,7 @@ void objc_addClass (Class cls_gen) OBJC_WARN_DEPRECATED; // Synchronize access to hash table - OBJC_LOCK (&classLock); + mutex_lock (&classLock); // Make sure both the class and the metaclass have caches! // Clear all bits of the info fields except CLS_CLASS and CLS_META. @@ -2417,6 +2488,7 @@ void objc_addClass (Class cls_gen) // Add the class to the table (void) NXHashInsert (class_hash, cls); + objc_addRegisteredClass((Class)cls); // Superclass is no longer a leaf for cache flushing if (cls->super_class && (cls->super_class->info & CLS_LEAF)) { @@ -2425,7 +2497,7 @@ void objc_addClass (Class cls_gen) } // Desynchronize - OBJC_UNLOCK (&classLock); + mutex_unlock (&classLock); } /*********************************************************************** @@ -2495,12 +2567,9 @@ __private_extern__ void _objc_insertMethods(struct old_class *cls, IMP oldImp; if ((oldImp = findIMPInClass(cls, sel))) { - _objc_inform("REPLACED: %c[%s %s] %s%s (IMP was %p, now %p)", - ISMETA(cls) ? '+' : '-', - cls->name, sel_getName(sel), - cat ? "by category " : "", - cat ? cat->category_name : "", - oldImp, newImp); + logReplacedMethod(cls->name, sel, ISMETA(cls), + cat ? cat->category_name : NULL, + oldImp, newImp); } } } @@ -2538,7 +2607,7 @@ __private_extern__ void _objc_insertMethods(struct old_class *cls, } // Right shift existing entries by one - bcopy (*list, (*list) + 1, ((void *) ptr) - ((void *) *list)); + bcopy (*list, (*list) + 1, (uint8_t *)ptr - (uint8_t *)*list); // Insert at method list at beginning of array **list = mlist; @@ -2649,9 +2718,9 @@ static BOOL _objc_add_category_flush_caches(struct old_class *cls, struct old_ca BOOL needFlush = NO; // Install the category's methods into its intended class - OBJC_LOCK(&methodListLock); + mutex_lock(&methodListLock); _objc_add_category (cls, category, version); - OBJC_UNLOCK(&methodListLock); + mutex_unlock(&methodListLock); // Queue for cache flushing so category's methods can get called if (category->instance_methods) { @@ -2676,11 +2745,15 @@ static BOOL _objc_add_category_flush_caches(struct old_class *cls, struct old_ca **********************************************************************/ static _objc_unresolved_category *reverse_cat(_objc_unresolved_category *cat) { + _objc_unresolved_category *prev; + _objc_unresolved_category *cur; + _objc_unresolved_category *ahead; + if (!cat) return NULL; - _objc_unresolved_category *prev = NULL; - _objc_unresolved_category *cur = cat; - _objc_unresolved_category *ahead = cat->next; + prev = NULL; + cur = cat; + ahead = cat->next; while (cur) { ahead = cur->next; @@ -2748,10 +2821,10 @@ void _objc_resolve_categories_for_class(Class cls_gen) if (strncmp(cls->name, "_%", 2) == 0) { // Posee's meta's name is smashed and isn't in the class_hash, // so objc_getClass doesn't work. - char *baseName = strchr(cls->name, '%'); // get posee's real name - cls = _class_asOld(objc_getClass(baseName)); + const char *baseName = strchr(cls->name, '%'); // get posee's real name + cls = _class_asOld((Class)objc_getClass(baseName)); } else { - cls = _class_asOld(objc_getClass(cls->name)); + cls = _class_asOld((Class)objc_getClass(cls->name)); } } @@ -2776,7 +2849,7 @@ static BOOL _objc_register_category(struct old_category *cat, int version) struct old_class *theClass; // If the category's class exists, attach the category. - if ((theClass = _class_asOld(objc_lookUpClass(cat->class_name)))) { + if ((theClass = _class_asOld((Class)objc_lookUpClass(cat->class_name)))) { return _objc_add_category_flush_caches(theClass, cat, version); } @@ -2784,7 +2857,7 @@ static BOOL _objc_register_category(struct old_category *cat, int version) // then attach the category to the class but don't bother // flushing any method caches (because they must be empty). // YES unconnected, NO class_handler - if ((theClass = _class_asOld(look_up_class(cat->class_name, YES, NO)))) { + if ((theClass = _class_asOld((Class)look_up_class(cat->class_name, YES, NO)))) { _objc_add_category(theClass, cat, version); return NO; } @@ -2823,7 +2896,7 @@ __private_extern__ const char ** _objc_copyClassNamesForImage(header_info *hi, unsigned int *outCount) { Module mods; - int m; + unsigned int m; const char **list; int count; int allocated; @@ -2844,7 +2917,8 @@ _objc_copyClassNamesForImage(header_info *hi, unsigned int *outCount) if (class_is_connected(cls)) { if (count == allocated) { allocated = allocated*2 + 16; - list = realloc(list, allocated * sizeof(char *)); + list = (const char **) + realloc((void *)list, allocated * sizeof(char *)); } list[count++] = cls->name; } @@ -2855,7 +2929,8 @@ _objc_copyClassNamesForImage(header_info *hi, unsigned int *outCount) // NULL-terminate non-empty list if (count == allocated) { allocated = allocated+1; - list = realloc(list, allocated * sizeof(char *)); + list = (const char **) + realloc((void *)list, allocated * sizeof(char *)); } list[count] = NULL; } @@ -2864,4 +2939,186 @@ _objc_copyClassNamesForImage(header_info *hi, unsigned int *outCount) return list; } +BOOL gdb_objc_isRuntimeLocked() +{ + if (mutex_try_lock(&methodListLock)) { + mutex_unlock(&methodListLock); + } else + return YES; + + if (mutex_try_lock(&classLock)) { + mutex_unlock(&classLock); + } else + return YES; + + if (mutex_try_lock(&cacheUpdateLock)) { + mutex_unlock(&cacheUpdateLock); + } else + return YES; + + return NO; +} + + +/*********************************************************************** +* Lock management +* Every lock used anywhere must be managed here. +* Locks not managed here may cause gdb deadlocks. +**********************************************************************/ +__private_extern__ rwlock_t selLock = {0}; +__private_extern__ mutex_t classLock = MUTEX_INITIALIZER; +__private_extern__ mutex_t methodListLock = MUTEX_INITIALIZER; +__private_extern__ mutex_t cacheUpdateLock = MUTEX_INITIALIZER; +__private_extern__ recursive_mutex_t loadMethodLock = RECURSIVE_MUTEX_INITIALIZER; +static int debugger_selLock; +static int debugger_loadMethodLock; +#define RDONLY 1 +#define RDWR 2 + +__private_extern__ void lock_init(void) +{ + rwlock_init(&selLock); + recursive_mutex_init(&loadMethodLock); +} + + +#ifndef NO_DEBUGGER_MODE + +/*********************************************************************** +* startDebuggerMode +* Attempt to acquire some locks for debugger mode. +* Returns 0 if debugger mode failed because too many locks are unavailable. +* +* Locks successfully acquired are held until endDebuggerMode(). +* Locks not acquired are off-limits until endDebuggerMode(); any +* attempt to manipulate them will cause a trap. +* Locks not handled here may cause deadlocks in gdb. +**********************************************************************/ +__private_extern__ int startDebuggerMode(void) +{ + int result = DEBUGGER_FULL; + + // classLock is required + // methodListLock is required + // cacheUpdateLock is required + // fixme might be able to allow all-or-none + if (! mutex_try_lock(&classLock)) { + return DEBUGGER_OFF; + } + if (! mutex_try_lock(&methodListLock)) { + mutex_unlock(&classLock); + return DEBUGGER_OFF; + } + if (! mutex_try_lock(&cacheUpdateLock)) { + mutex_unlock(&methodListLock); + mutex_unlock(&classLock); + return DEBUGGER_OFF; + } + + // selLock is optional + if (rwlock_try_write(&selLock)) { + debugger_selLock = RDWR; + } else if (rwlock_try_read(&selLock)) { + debugger_selLock = RDONLY; + result = DEBUGGER_PARTIAL; + } else { + debugger_selLock = 0; + result = DEBUGGER_PARTIAL; + } + + // loadMethodLock is optional + if (recursive_mutex_try_lock(&loadMethodLock)) { + debugger_loadMethodLock = RDWR; + } else { + debugger_loadMethodLock = 0; + result = DEBUGGER_PARTIAL; + } + + return result; +} + +/*********************************************************************** +* endDebuggerMode +* Relinquish locks acquired in startDebuggerMode(). +**********************************************************************/ +__private_extern__ void endDebuggerMode(void) +{ + if (debugger_loadMethodLock) { + recursive_mutex_unlock(&loadMethodLock); + debugger_loadMethodLock = 0; + } + rwlock_unlock(&selLock, debugger_selLock); + debugger_selLock = 0; + mutex_unlock(&classLock); + mutex_unlock(&methodListLock); + mutex_unlock(&cacheUpdateLock); +} + +/*********************************************************************** +* isManagedDuringDebugger +* Returns YES if the given lock is handled specially during debugger +* mode (i.e. debugger mode tries to acquire it). +**********************************************************************/ +__private_extern__ BOOL isManagedDuringDebugger(void *lock) +{ + if (lock == &selLock) return YES; + if (lock == &classLock) return YES; + if (lock == &methodListLock) return YES; + if (lock == &cacheUpdateLock) return YES; + if (lock == &loadMethodLock) return YES; + return NO; +} + +/*********************************************************************** +* isLockedDuringDebugger +* Returns YES if the given mutex was acquired by debugger mode. +* Locking a managed mutex during debugger mode causes a trap unless +* this returns YES. +**********************************************************************/ +__private_extern__ BOOL isLockedDuringDebugger(mutex_t *lock) +{ + assert(DebuggerMode); + + if (lock == &classLock) return YES; + if (lock == &methodListLock) return YES; + if (lock == &cacheUpdateLock) return YES; + if (lock == (mutex_t *)&loadMethodLock) return YES; + + return NO; +} + +/*********************************************************************** +* isReadingDuringDebugger +* Returns YES if the given rwlock was read-locked by debugger mode. +* Read-locking a managed rwlock during debugger mode causes a trap unless +* this returns YES. +**********************************************************************/ +__private_extern__ BOOL isReadingDuringDebugger(rwlock_t *lock) +{ + assert(DebuggerMode); + + // read-lock is allowed even if debugger mode actually write-locked it + if (debugger_selLock && lock == &selLock) return YES; + + return NO; +} + +/*********************************************************************** +* isWritingDuringDebugger +* Returns YES if the given rwlock was write-locked by debugger mode. +* Write-locking a managed rwlock during debugger mode causes a trap unless +* this returns YES. +**********************************************************************/ +__private_extern__ BOOL isWritingDuringDebugger(rwlock_t *lock) +{ + assert(DebuggerMode); + + if (debugger_selLock == RDWR && lock == &selLock) return YES; + + return NO; +} + +// !defined(NO_DEBUGGER_MODE) +#endif + #endif diff --git a/runtime/objc-runtime.m b/runtime/objc-runtime.m index 99db00e..46c785d 100644 --- a/runtime/objc-runtime.m +++ b/runtime/objc-runtime.m @@ -33,30 +33,8 @@ * Imports. **********************************************************************/ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#import "objc-private.h" -#import "hashtable2.h" -#import "maptable.h" -#import "Object.h" -#import "objc-rtp.h" -#import "objc-auto.h" -#import "objc-loadmethod.h" +#include "objc-private.h" +#include "objc-loadmethod.h" OBJC_EXPORT Class getOriginalClassForPosingClass(Class); @@ -66,6 +44,7 @@ OBJC_EXPORT Class getOriginalClassForPosingClass(Class); **********************************************************************/ // Settings from environment variables +#ifndef NO_ENVIRON __private_extern__ int PrintImages = -1; // env OBJC_PRINT_IMAGES __private_extern__ int PrintLoading = -1; // env OBJC_PRINT_LOAD_METHODS __private_extern__ int PrintInitializing = -1; // env OBJC_PRINT_INITIALIZE_METHODS @@ -73,53 +52,52 @@ __private_extern__ int PrintResolving = -1; // env OBJC_PRINT_RESOLVED_METHODS __private_extern__ int PrintConnecting = -1; // env OBJC_PRINT_CLASS_SETUP __private_extern__ int PrintProtocols = -1; // env OBJC_PRINT_PROTOCOL_SETUP __private_extern__ int PrintIvars = -1; // env OBJC_PRINT_IVAR_SETUP +__private_extern__ int PrintVtables = -1; // env OBJC_PRINT_VTABLE_SETUP +__private_extern__ int PrintVtableImages = -1;//env OBJC_PRINT_VTABLE_IMAGES __private_extern__ int PrintFuture = -1; // env OBJC_PRINT_FUTURE_CLASSES __private_extern__ int PrintRTP = -1; // env OBJC_PRINT_RTP __private_extern__ int PrintGC = -1; // env OBJC_PRINT_GC -__private_extern__ int PrintSharing = -1; // env OBJC_PRINT_SHARING +__private_extern__ int PrintPreopt = -1; // env OBJC_PRINT_PREOPTIMIZATION __private_extern__ int PrintCxxCtors = -1; // env OBJC_PRINT_CXX_CTORS __private_extern__ int PrintExceptions = -1; // env OBJC_PRINT_EXCEPTIONS __private_extern__ int PrintAltHandlers = -1; // env OBJC_PRINT_ALT_HANDLERS __private_extern__ int PrintDeprecation = -1;// env OBJC_PRINT_DEPRECATION_WARNINGS __private_extern__ int PrintReplacedMethods = -1; // env OBJC_PRINT_REPLACED_METHODS -__private_extern__ int PrintCacheCollection = -1; // env OBJC_PRINT_CACHE_COLLECTION +__private_extern__ int PrintCaches = -1; // env OBJC_PRINT_CACHE_SETUP __private_extern__ int UseInternalZone = -1; // env OBJC_USE_INTERNAL_ZONE -__private_extern__ int AllowInterposing = -1;// env OBJC_ALLOW_INTERPOSING __private_extern__ int DebugUnload = -1; // env OBJC_DEBUG_UNLOAD __private_extern__ int DebugFragileSuperclasses = -1; // env OBJC_DEBUG_FRAGILE_SUPERCLASSES __private_extern__ int DebugNilSync = -1; // env OBJC_DEBUG_NIL_SYNC __private_extern__ int DisableGC = -1; // env OBJC_DISABLE_GC +__private_extern__ int DisableVtables = -1; // env OBJC_DISABLE_VTABLES +__private_extern__ int DisablePreopt = -1; // env OBJC_DISABLE_PREOPTIMIZATION __private_extern__ int DebugFinalizers = -1; // env OBJC_DEBUG_FINALIZERS +#endif // objc's key for pthread_getspecific -static pthread_key_t _objc_pthread_key = 0; - -// Selectors for which @selector() doesn't work -__private_extern__ SEL cxx_construct_sel = NULL; -__private_extern__ SEL cxx_destruct_sel = NULL; -__private_extern__ const char *cxx_construct_name = ".cxx_construct"; -__private_extern__ const char *cxx_destruct_name = ".cxx_destruct"; - +static tls_key_t _objc_pthread_key; -/*********************************************************************** -* Function prototypes internal to this module. -**********************************************************************/ +// Selectors +__private_extern__ SEL SEL_load = NULL; +__private_extern__ SEL SEL_initialize = NULL; +__private_extern__ SEL SEL_resolveInstanceMethod = NULL; +__private_extern__ SEL SEL_resolveClassMethod = NULL; +__private_extern__ SEL SEL_cxx_construct = NULL; +__private_extern__ SEL SEL_cxx_destruct = NULL; +__private_extern__ SEL SEL_retain = NULL; +__private_extern__ SEL SEL_release = NULL; +__private_extern__ SEL SEL_autorelease = NULL; +__private_extern__ SEL SEL_copy = NULL; +__private_extern__ SEL SEL_finalize = NULL; -static void _objc_unmap_image(header_info *hi); - - -/*********************************************************************** -* Static data internal to this module. -**********************************************************************/ +__private_extern__ header_info *FirstHeader NOBSS = 0; // NULL means empty list +__private_extern__ header_info *LastHeader NOBSS = 0; // NULL means invalid; recompute it +__private_extern__ int HeaderCount NOBSS = 0; -// we keep a linked list of header_info's describing each image as told to us by dyld -static header_info *FirstHeader NOBSS = 0; // NULL means empty list -static header_info *LastHeader NOBSS = 0; // NULL means invalid; recompute it -static int HeaderCount NOBSS = 0; /*********************************************************************** @@ -179,7 +157,7 @@ Class objc_getFutureClass(const char *name) // YES unconnected, NO class handler // (unconnected is OK because it will someday be the real class) - cls = look_up_class(name, YES, NO); + cls = (Class)look_up_class(name, YES, NO); if (cls) { if (PrintFuture) { _objc_inform("FUTURE: found %p already in use for %s", cls, name); @@ -204,63 +182,17 @@ id objc_getMetaClass(const char *aClassName) if (!aClassName) return Nil; - cls = objc_getClass (aClassName); + cls = (Class)objc_getClass (aClassName); if (!cls) { _objc_inform ("class `%s' not linked into application", aClassName); return Nil; } - return ((id)cls)->isa; + return (id)cls->isa; } -#if !__LP64__ -// Not updated for 64-bit ABI - -/*********************************************************************** -* _headerForAddress. -* addr can be a class or a category -**********************************************************************/ -static const header_info *_headerForAddress(void *addr) -{ - unsigned long size; - unsigned long seg; - header_info * hInfo; - - // Check all headers in the vector - for (hInfo = FirstHeader; hInfo != NULL; hInfo = hInfo->next) - { - // Locate header data, if any - if (!hInfo->objcSegmentHeader) continue; - seg = hInfo->objcSegmentHeader->vmaddr + hInfo->image_slide; - size = hInfo->objcSegmentHeader->filesize; - - // Is the class in this header? - if ((seg <= (unsigned long) addr) && - ((unsigned long) addr < (seg + size))) - return hInfo; - } - - // Not found - return 0; -} - - -/*********************************************************************** -* _headerForClass -* Return the image header containing this class, or NULL. -* Returns NULL on runtime-constructed classes, and the NSCF classes. -**********************************************************************/ -__private_extern__ const header_info *_headerForClass(Class cls) -{ - return _headerForAddress(cls); -} - -// !__LP64__ -#endif - - /*********************************************************************** * _nameForHeader. **********************************************************************/ @@ -271,131 +203,17 @@ __private_extern__ const char *_nameForHeader(const headerType *header) /*********************************************************************** -* _gcForHInfo. +* _objc_appendHeader. Add a newly-constructed header_info to the list. **********************************************************************/ -__private_extern__ const char *_gcForHInfo(const header_info *hinfo) -{ - if (_objcHeaderRequiresGC(hinfo)) return "requires GC"; - else if (_objcHeaderSupportsGC(hinfo)) return "supports GC"; - else return "does not support GC"; -} -__private_extern__ const char *_gcForHInfo2(const header_info *hinfo) +__private_extern__ void _objc_appendHeader(header_info *hi) { - if (_objcHeaderRequiresGC(hinfo)) return " (requires GC)"; - else if (_objcHeaderSupportsGC(hinfo)) return " (supports GC)"; - else return ""; -} - - -/*********************************************************************** -* bad_magic. -* Return YES if the header has invalid Mach-o magic. -**********************************************************************/ -static BOOL bad_magic(const headerType *mhdr) -{ - return (mhdr->magic != MH_MAGIC && mhdr->magic != MH_MAGIC_64 && - mhdr->magic != MH_CIGAM && mhdr->magic != MH_CIGAM_64); -} - - -/*********************************************************************** -* _objc_headerStart. Return what headers we know about. -**********************************************************************/ -__private_extern__ header_info *_objc_headerStart(void) -{ - // Take advatage of our previous work - return FirstHeader; -} - - -/*********************************************************************** -* _objc_addHeader. -* Returns NULL if the header has no ObjC metadata. -**********************************************************************/ - -// tested with 2; typical case is 4, but OmniWeb & Mail push it towards 20 -#define HINFO_SIZE 16 - -static int HeaderInfoCounter NOBSS = 0; -static header_info HeaderInfoTable[HINFO_SIZE] NOBSS = { {0} }; - -static header_info * _objc_addHeader(const headerType *header) -{ - size_t info_size = 0; - const segmentType *objc_segment; - const segmentType *objc2_segment; - const objc_image_info *image_info; - const segmentType *data_segment; - header_info *result; - ptrdiff_t image_slide; - - // Weed out duplicates - for (result = FirstHeader; result; result = result->next) { - if (header == result->mhdr) return NULL; - } - - // Locate the __OBJC segment - image_slide = _getImageSlide(header); - image_info = _getObjcImageInfo(header, image_slide, &info_size); - objc_segment = getsegbynamefromheader(header, SEG_OBJC); - objc2_segment = getsegbynamefromheader(header, SEG_OBJC2); - data_segment = getsegbynamefromheader(header, SEG_DATA); - if (!objc_segment && !image_info && !objc2_segment) return NULL; - - // Find or allocate a header_info entry. - if (HeaderInfoCounter < HINFO_SIZE) { - result = &HeaderInfoTable[HeaderInfoCounter++]; - } else { - result = _malloc_internal(sizeof(header_info)); - } - - // Set up the new header_info entry. - result->mhdr = header; - result->image_slide = image_slide; - result->objcSegmentHeader = objc_segment; - result->dataSegmentHeader = data_segment; -#if !__OBJC2__ - result->mod_count = 0; - result->mod_ptr = _getObjcModules(header, result->image_slide, &result->mod_count); -#endif - result->info = image_info; - dladdr(result->mhdr, &result->dl_info); - result->allClassesRealized = NO; - - // dylibs are not allowed to unload - if (result->mhdr->filetype == MH_DYLIB) { - dlopen(result->dl_info.dli_fname, RTLD_NOLOAD); - } - - // Make sure every copy of objc_image_info in this image is the same. - // This means same version and same bitwise contents. - if (result->info) { - const objc_image_info *start = result->info; - const objc_image_info *end = - (objc_image_info *)(info_size + (uint8_t *)start); - const objc_image_info *info = start; - while (info < end) { - // version is byte size, except for version 0 - size_t struct_size = info->version; - if (struct_size == 0) struct_size = 2 * sizeof(uint32_t); - if (info->version != start->version || - 0 != memcmp(info, start, struct_size)) - { - _objc_inform("'%s' has inconsistently-compiled Objective-C " - "code. Please recompile all code in it.", - _nameForHeader(header)); - } - info = (objc_image_info *)(struct_size + (uint8_t *)info); - } - } - // Add the header to the header list. // The header is appended to the list, to preserve the bottom-up order. HeaderCount++; - result->next = NULL; + hi->next = NULL; if (!FirstHeader) { // list is empty - FirstHeader = LastHeader = result; + FirstHeader = LastHeader = hi; } else { if (!LastHeader) { // list is not empty, but LastHeader is invalid - recompute it @@ -403,11 +221,9 @@ static header_info * _objc_addHeader(const headerType *header) while (LastHeader->next) LastHeader = LastHeader->next; } // LastHeader is now valid - LastHeader->next = result; - LastHeader = result; + LastHeader->next = hi; + LastHeader = hi; } - - return result; } @@ -418,7 +234,7 @@ static header_info * _objc_addHeader(const headerType *header) * LastHeader is set to NULL. Any code that uses LastHeader must * detect this NULL and recompute LastHeader by traversing the list. **********************************************************************/ -static void _objc_removeHeader(header_info *hi) +__private_extern__ void _objc_removeHeader(header_info *hi) { header_info **hiP; @@ -434,15 +250,7 @@ static void _objc_removeHeader(header_info *hi) LastHeader = NULL; // will be recomputed next time it's used } - // Free the memory, unless it was in the static HeaderInfoTable. - if (deadHead < HeaderInfoTable || - deadHead >= HeaderInfoTable + HINFO_SIZE) - { - _free_internal(deadHead); - } - HeaderCount--; - break; } } @@ -450,113 +258,25 @@ static void _objc_removeHeader(header_info *hi) /*********************************************************************** -* check_gc -* Check whether the executable supports or requires GC, and make sure -* all already-loaded libraries support the executable's GC mode. -* Returns TRUE if the executable wants GC on. -**********************************************************************/ -static BOOL check_wants_gc(void) -{ - const header_info *hi; - BOOL appWantsGC; - - // Environment variables can override the following. - if (DisableGC) { - _objc_inform("GC: forcing GC OFF because OBJC_DISABLE_GC is set"); - appWantsGC = NO; - } - else { - // Find the executable and check its GC bits. - // If the executable cannot be found, default to NO. - // (The executable will not be found if the executable contains - // no Objective-C code.) - appWantsGC = NO; - for (hi = FirstHeader; hi != NULL; hi = hi->next) { - if (hi->mhdr->filetype == MH_EXECUTE) { - appWantsGC = _objcHeaderSupportsGC(hi) ? YES : NO; - if (PrintGC) { - _objc_inform("GC: executable '%s' %s", - _nameForHeader(hi->mhdr), _gcForHInfo(hi)); - } - } - } - } - return appWantsGC; -} - -/*********************************************************************** -* verify_gc_readiness -* if we want gc, verify that every header describes files compiled -* and presumably ready for gc. -************************************************************************/ - -static void verify_gc_readiness(BOOL wantsGC, header_info **hList, - uint32_t hCount) -{ - BOOL busted = NO; - uint32_t i; - - // Find the libraries and check their GC bits against the app's request - for (i = 0; i < hCount; i++) { - header_info *hi = hList[i]; - if (hi->mhdr->filetype == MH_EXECUTE) { - continue; - } - else if (hi->mhdr == &_mh_dylib_header) { - // libobjc itself works with anything even though it is not - // compiled with -fobjc-gc (fixme should it be?) - } - else if (wantsGC && ! _objcHeaderSupportsGC(hi)) { - // App wants GC but library does not support it - bad - _objc_inform_now_and_on_crash - ("'%s' was not compiled with -fobjc-gc or -fobjc-gc-only, " - "but the application requires GC", - _nameForHeader(hi->mhdr)); - busted = YES; - } - else if (!wantsGC && _objcHeaderRequiresGC(hi)) { - // App doesn't want GC but library requires it - bad - _objc_inform_now_and_on_crash - ("'%s' was compiled with -fobjc-gc-only, " - "but the application does not support GC", - _nameForHeader(hi->mhdr)); - busted = YES; - } - - if (PrintGC) { - _objc_inform("GC: library '%s' %s", - _nameForHeader(hi->mhdr), _gcForHInfo(hi)); - } - } - - if (busted) { - // GC state is not consistent. - // Kill the process unless one of the forcing flags is set. - if (!DisableGC) { - _objc_fatal("*** GC capability of application and some libraries did not match"); - } - } -} - - -/*********************************************************************** -* objc_setConfiguration +* environ_init * Read environment variables that affect the runtime. * Also print environment variable help, if requested. **********************************************************************/ -static void objc_setConfiguration() { +__private_extern__ void environ_init(void) +{ +#ifndef NO_ENVIRON int PrintHelp = (getenv("OBJC_HELP") != NULL); int PrintOptions = (getenv("OBJC_PRINT_OPTIONS") != NULL); int secure = issetugid(); if (secure) { // All environment variables are ignored when setuid or setgid. - if (PrintHelp) _objc_inform("OBJC_HELP ignored when running setuid or setgid"); - if (PrintOptions) _objc_inform("OBJC_PRINT_OPTIONS ignored when running setuid or setgid"); + // This includes OBJC_HELP and OBJC_PRINT_OPTIONS themselves. } else { if (PrintHelp) { - _objc_inform("OBJC_HELP: describe Objective-C runtime environment variables"); + _objc_inform("Objective-C runtime debugging. Set variable=YES to enable."); + _objc_inform("OBJC_HELP: describe available environment variables"); if (PrintOptions) { _objc_inform("OBJC_HELP is set"); } @@ -591,17 +311,23 @@ static void objc_setConfiguration() { OPTION(PrintConnecting, OBJC_PRINT_CLASS_SETUP, "log progress of class and category setup"); OPTION(PrintProtocols, OBJC_PRINT_PROTOCOL_SETUP, - "log progresso of protocol setup"); + "log progress of protocol setup"); OPTION(PrintIvars, OBJC_PRINT_IVAR_SETUP, "log processing of non-fragile ivars"); + OPTION(PrintVtables, OBJC_PRINT_VTABLE_SETUP, + "log processing of class vtables"); + OPTION(PrintVtableImages, OBJC_PRINT_VTABLE_IMAGES, + "print vtable images showing overridden methods"); + OPTION(PrintCaches, OBJC_PRINT_CACHE_SETUP, + "log processing of method caches"); OPTION(PrintFuture, OBJC_PRINT_FUTURE_CLASSES, "log use of future classes for toll-free bridging"); OPTION(PrintRTP, OBJC_PRINT_RTP, "log initialization of the Objective-C runtime pages"); OPTION(PrintGC, OBJC_PRINT_GC, "log some GC operations"); - OPTION(PrintSharing, OBJC_PRINT_SHARING, - "log cross-process memory sharing"); + OPTION(PrintPreopt, OBJC_PRINT_PREOPTIMIZATION, + "log preoptimization courtesy of dyld shared cache"); OPTION(PrintCxxCtors, OBJC_PRINT_CXX_CTORS, "log calls to C++ ctors and dtors for instance variables"); OPTION(PrintExceptions, OBJC_PRINT_EXCEPTIONS, @@ -612,8 +338,6 @@ static void objc_setConfiguration() { "log methods replaced by category implementations"); OPTION(PrintDeprecation, OBJC_PRINT_DEPRECATION_WARNINGS, "warn about calls to deprecated runtime functions"); - OPTION(PrintCacheCollection, OBJC_PRINT_CACHE_COLLECTION, - "log cleanup of stale method caches"); OPTION(DebugUnload, OBJC_DEBUG_UNLOAD, "warn about poorly-behaving bundles when unloaded"); @@ -626,16 +350,51 @@ static void objc_setConfiguration() { OPTION(UseInternalZone, OBJC_USE_INTERNAL_ZONE, "allocate runtime data in a dedicated malloc zone"); - OPTION(AllowInterposing, OBJC_ALLOW_INTERPOSING, - "allow function interposing of objc_msgSend()"); OPTION(DisableGC, OBJC_DISABLE_GC, "force GC OFF, even if the executable wants it on"); + OPTION(DisableVtables, OBJC_DISABLE_VTABLES, + "disable vtable dispatch"); + OPTION(DisablePreopt, OBJC_DISABLE_PREOPTIMIZATION, + "disable preoptimization courtesy of dyld shared cache"); #undef OPTION +#endif +} + + +/*********************************************************************** +* logReplacedMethod +* OBJC_PRINT_REPLACED_METHODS implementation +**********************************************************************/ +__private_extern__ void +logReplacedMethod(const char *className, SEL s, + BOOL isMeta, const char *catName, + IMP oldImp, IMP newImp) +{ + const char *oldImage = "??"; + const char *newImage = "??"; + + // Silently ignore +load replacement because category +load is special + if (s == SEL_load) return; + +#if TARGET_OS_WIN32 + // don't know dladdr()/dli_fname equivalent +#else + Dl_info dl; + + if (dladdr(oldImp, &dl) && dl.dli_fname) oldImage = dl.dli_fname; + if (dladdr(newImp, &dl) && dl.dli_fname) newImage = dl.dli_fname; +#endif + + _objc_inform("REPLACED: %c[%s %s] %s%s (IMP was %p (%s), now %p (%s))", + isMeta ? '+' : '-', className, sel_getName(s), + catName ? "by category " : "", catName ? catName : "", + oldImp, oldImage, newImp, newImage); } + /*********************************************************************** * objc_setMultithreaded. **********************************************************************/ @@ -657,10 +416,10 @@ __private_extern__ _objc_pthread_data *_objc_fetch_pthread_data(BOOL create) { _objc_pthread_data *data; - data = pthread_getspecific(_objc_pthread_key); + data = tls_get(_objc_pthread_key); if (!data && create) { data = _calloc_internal(1, sizeof(_objc_pthread_data)); - pthread_setspecific(_objc_pthread_key, data); + tls_set(_objc_pthread_key, data); } return data; @@ -689,283 +448,30 @@ __private_extern__ void _objc_pthread_destroyspecific(void *arg) } -/*********************************************************************** -* _objcInit -* Former library initializer. This function is now merely a placeholder -* for external callers. All runtime initialization has now been moved -* to map_images() and _objc_init. -**********************************************************************/ -void _objcInit(void) -{ - // do nothing -} - - -/*********************************************************************** -* gc_enforcer -* Make sure that images about to be loaded by dyld are GC-acceptable. -* Images linked to the executable are always permitted; they are -* enforced inside map_images() itself. -**********************************************************************/ -static BOOL InitialDyldRegistration = NO; -static const char *gc_enforcer(enum dyld_image_states state, - uint32_t infoCount, - const struct dyld_image_info info[]) +__private_extern__ void tls_init(void) { - uint32_t i; - - // Linked images get a free pass - if (InitialDyldRegistration) return NULL; - - if (PrintImages) { - _objc_inform("IMAGES: checking %d images for compatibility...", - infoCount); - } - - for (i = 0; i < infoCount; i++) { - const headerType *mhdr = (const headerType *)info[i].imageLoadAddress; - if (bad_magic(mhdr)) continue; - - objc_image_info *image_info; - size_t size; - - if (mhdr == &_mh_dylib_header) { - // libobjc itself - OK - continue; - } - -#if !__LP64__ - // 32-bit: __OBJC seg but no image_info means no GC support - if (!getsegbynamefromheader(mhdr, SEG_OBJC)) { - // not objc - assume OK - continue; - } - image_info = _getObjcImageInfo(mhdr, _getImageSlide(mhdr), &size); - if (!image_info) { - // No image_info - assume GC unsupported - if (!UseGC) { - // GC is OFF - ok - continue; - } else { - // GC is ON - bad - if (PrintImages || PrintGC) { - _objc_inform("IMAGES: rejecting %d images because %s doesn't support GC (no image_info)", infoCount, info[i].imageFilePath); - } - return "GC capability mismatch"; - } - } +#ifdef NO_DIRECT_THREAD_KEYS + tls_create(&_objc_pthread_key, &_objc_pthread_destroyspecific); #else - // 64-bit: no image_info means no objc at all - image_info = _getObjcImageInfo(mhdr, _getImageSlide(mhdr), &size); - if (!image_info) { - // not objc - assume OK - continue; - } + _objc_pthread_key = TLS_DIRECT_KEY; + pthread_key_init_np(TLS_DIRECT_KEY, &_objc_pthread_destroyspecific); #endif - - if (UseGC && !_objcInfoSupportsGC(image_info)) { - // GC is ON, but image does not support GC - if (PrintImages || PrintGC) { - _objc_inform("IMAGES: rejecting %d images because %s doesn't support GC", infoCount, info[i].imageFilePath); - } - return "GC capability mismatch"; - } - if (!UseGC && _objcInfoRequiresGC(image_info)) { - // GC is OFF, but image requires GC - if (PrintImages || PrintGC) { - _objc_inform("IMAGES: rejecting %d images because %s requires GC", infoCount, info[i].imageFilePath); - } - return "GC capability mismatch"; - } - } - - return NULL; } /*********************************************************************** -* map_images -* Process the given images which are being mapped in by dyld. -* All class registration and fixups are performed (or deferred pending -* discovery of missing superclasses etc), and +load methods are called. -* -* info[] is in bottom-up order i.e. libobjc will be earlier in the -* array than any library that links to libobjc. -**********************************************************************/ -static const char *map_images(enum dyld_image_states state, uint32_t infoCount, - const struct dyld_image_info infoList[]) -{ - static BOOL firstTime = YES; - static BOOL wantsGC NOBSS = NO; - uint32_t i; - header_info *hInfo; - header_info *hList[infoCount]; - uint32_t hCount; - - // Perform first-time initialization if necessary. - // This function is called before ordinary library initializers. - if (firstTime) { - extern SEL FwdSel; // in objc-msg-*.s - // workaround for rdar://5198739 - pthread_key_t unused; - pthread_key_create(&unused, NULL); - pthread_key_create(&_objc_pthread_key, _objc_pthread_destroyspecific); - objc_setConfiguration(); // read environment variables - // grab selectors for which @selector() doesn't work - cxx_construct_sel = sel_registerName(cxx_construct_name); - cxx_destruct_sel = sel_registerName(cxx_destruct_name); - FwdSel = sel_registerName("forward::"); // in objc-msg-*.s - exception_init(); - - InitialDyldRegistration = YES; - dyld_register_image_state_change_handler(dyld_image_state_mapped, 0 /* batch */, &gc_enforcer); - InitialDyldRegistration = NO; - } - - if (PrintImages) { - _objc_inform("IMAGES: processing %u newly-mapped images...\n", infoCount); - } - - - // Find all images with Objective-C metadata. - hCount = 0; - i = infoCount; - while (i--) { - const headerType *mhdr = (headerType *)infoList[i].imageLoadAddress; - if (bad_magic(mhdr)) continue; - - hInfo = _objc_addHeader(mhdr); - if (!hInfo) { - // no objc data in this entry - continue; - } - - hList[hCount++] = hInfo; - - if (PrintImages) { - _objc_inform("IMAGES: loading image for %s%s%s%s\n", - _nameForHeader(mhdr), - mhdr->filetype == MH_BUNDLE ? " (bundle)" : "", - _objcHeaderIsReplacement(hInfo) ? " (replacement)":"", - _gcForHInfo2(hInfo)); - } - } - - // Perform one-time runtime initialization that must be deferred until - // the executable itself is found. This needs to be done before - // further initialization. - // (The executable may not be present in this infoList if the - // executable does not contain Objective-C code but Objective-C - // is dynamically loaded later. In that case, check_wants_gc() - // will do the right thing.) - if (firstTime) { - wantsGC = check_wants_gc(); - - verify_gc_readiness(wantsGC, hList, hCount); - - gc_init(wantsGC); // needs executable for GC decision - rtp_init(); // needs GC decision first - } else { - verify_gc_readiness(wantsGC, hList, hCount); - } - - _read_images(hList, hCount); - - firstTime = NO; - - return NULL; -} - - -static const char *load_images(enum dyld_image_states state,uint32_t infoCount, - const struct dyld_image_info infoList[]) -{ - BOOL found = NO; - uint32_t i; - - i = infoCount; - while (i--) { - header_info *hi; - for (hi = FirstHeader; hi != NULL; hi = hi->next) { - const headerType *mhdr = (headerType*)infoList[i].imageLoadAddress; - if (hi->mhdr == mhdr) { - prepare_load_methods(hi); - found = YES; - } - } - } - - if (found) call_load_methods(); - - return NULL; -} - -/*********************************************************************** -* unmap_image -* Process the given image which is about to be unmapped by dyld. -* mh is mach_header instead of headerType because that's what -* dyld_priv.h says even for 64-bit. -**********************************************************************/ -static void unmap_image(const struct mach_header *mh, intptr_t vmaddr_slide) -{ - if (PrintImages) { - _objc_inform("IMAGES: processing 1 newly-unmapped image...\n"); - } - - header_info *hi; - - // Find the runtime's header_info struct for the image - for (hi = FirstHeader; hi != NULL; hi = hi->next) { - if (hi->mhdr == (const headerType *)mh) { - _objc_unmap_image(hi); - return; - } - } - - // no objc data for this image -} - - -/*********************************************************************** -* _objc_init -* Static initializer. Registers our image notifier with dyld. -* fixme move map_images' firstTime code here - but GC code might need -* another earlier image notifier -**********************************************************************/ -static __attribute__((constructor)) -void _objc_init(void) -{ - // Register for unmap first, in case some +load unmaps something - _dyld_register_func_for_remove_image(&unmap_image); - dyld_register_image_state_change_handler(dyld_image_state_bound, - 1/*batch*/, &map_images); - dyld_register_image_state_change_handler(dyld_image_state_dependents_initialized, 0/*not batch*/, &load_images); -} - - -/*********************************************************************** -* _objc_unmap_image. -* Destroy any Objective-C data for the given image, which is about to -* be unloaded by dyld. -* Note: not thread-safe, but image loading isn't either. +* _objcInit +* Former library initializer. This function is now merely a placeholder +* for external callers. All runtime initialization has now been moved +* to map_images() and _objc_init. **********************************************************************/ -static void _objc_unmap_image(header_info *hi) +void _objcInit(void) { - if (PrintImages) { - _objc_inform("IMAGES: unloading image for %s%s%s%s\n", - _nameForHeader(hi->mhdr), - hi->mhdr->filetype == MH_BUNDLE ? " (bundle)" : "", - _objcHeaderIsReplacement(hi) ? " (replacement)" : "", - _gcForHInfo2(hi)); - } - - _unload_image(hi); - - // Remove header_info from header list - _objc_removeHeader(hi); + // do nothing } +#if !TARGET_OS_WIN32 /*********************************************************************** * _objc_setNilReceiver **********************************************************************/ @@ -986,6 +492,7 @@ id _objc_getNilReceiver(void) { return _objc_nilReceiver; } +#endif /*********************************************************************** @@ -1214,88 +721,6 @@ objc_write_cond_branch(void *entry, void *target, unsigned cond) #endif -/********************************************************************** -* secure_open -* Securely open a file from a world-writable directory (like /tmp) -* If the file does not exist, it will be atomically created with mode 0600 -* If the file exists, it must be, and remain after opening: -* 1. a regular file (in particular, not a symlink) -* 2. owned by euid -* 3. permissions 0600 -* 4. link count == 1 -* Returns a file descriptor or -1. Errno may or may not be set on error. -**********************************************************************/ -__private_extern__ int secure_open(const char *filename, int flags, uid_t euid) -{ - struct stat fs, ls; - int fd = -1; - BOOL truncate = NO; - BOOL create = NO; - - if (flags & O_TRUNC) { - // Don't truncate the file until after it is open and verified. - truncate = YES; - flags &= ~O_TRUNC; - } - if (flags & O_CREAT) { - // Don't create except when we're ready for it - create = YES; - flags &= ~O_CREAT; - flags &= ~O_EXCL; - } - - if (lstat(filename, &ls) < 0) { - if (errno == ENOENT && create) { - // No such file - create it - fd = open(filename, flags | O_CREAT | O_EXCL, 0600); - if (fd >= 0) { - // File was created successfully. - // New file does not need to be truncated. - return fd; - } else { - // File creation failed. - return -1; - } - } else { - // lstat failed, or user doesn't want to create the file - return -1; - } - } else { - // lstat succeeded - verify attributes and open - if (S_ISREG(ls.st_mode) && // regular file? - ls.st_nlink == 1 && // link count == 1? - ls.st_uid == euid && // owned by euid? - (ls.st_mode & ALLPERMS) == (S_IRUSR | S_IWUSR)) // mode 0600? - { - // Attributes look ok - open it and check attributes again - fd = open(filename, flags, 0000); - if (fd >= 0) { - // File is open - double-check attributes - if (0 == fstat(fd, &fs) && - fs.st_nlink == ls.st_nlink && // link count == 1? - fs.st_uid == ls.st_uid && // owned by euid? - fs.st_mode == ls.st_mode && // regular file, 0600? - fs.st_ino == ls.st_ino && // same inode as before? - fs.st_dev == ls.st_dev) // same device as before? - { - // File is open and OK - if (truncate) ftruncate(fd, 0); - return fd; - } else { - // Opened file looks funny - close it - close(fd); - return -1; - } - } else { - // File didn't open - return -1; - } - } else { - // Unopened file looks funny - don't open it - return -1; - } - } -} #if !__OBJC2__ @@ -1304,18 +729,37 @@ extern Class _objc_getOrigClass(const char *name); #endif const char *class_getImageName(Class cls) { - int ok; - Dl_info info; - +#if TARGET_OS_WIN32 + TCHAR *szFileName; + DWORD charactersCopied; + Class origCls; + HMODULE classModule; + BOOL res; +#endif if (!cls) return NULL; #if !__OBJC2__ cls = _objc_getOrigClass(_class_getName(cls)); #endif - - ok = dladdr(cls, &info); - if (ok) return info.dli_fname; - else return NULL; +#if TARGET_OS_WIN32 + charactersCopied = 0; + szFileName = malloc(MAX_PATH); + + origCls = objc_getOrigClass(class_getName(cls)); + classModule = NULL; + res = GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCTSTR)origCls, &classModule); + if (res && classModule) { + charactersCopied = GetModuleFileName(classModule, szFileName, MAX_PATH); + } + if (classModule) FreeLibrary(classModule); + if (charactersCopied) { + return (const char *)szFileName; + } else + free(szFileName); + return NULL; +#else + return dyld_image_path_containing_address(cls); +#endif } @@ -1326,19 +770,29 @@ const char **objc_copyImageNames(unsigned int *outCount) int max = HeaderCount; const char **names = calloc(max+1, sizeof(char *)); - for (hi = _objc_headerStart(); - hi != NULL && count < max; - hi = hi->next) - { - if (hi->dl_info.dli_fname) { - names[count++] = hi->dl_info.dli_fname; + for (hi = FirstHeader; hi != NULL && count < max; hi = hi->next) { +#if TARGET_OS_WIN32 + TCHAR *szFileName; + DWORD charactersCopied; + + szFileName = malloc(MAX_PATH); + + charactersCopied = GetModuleFileName((HMODULE)(hi->mhdr), szFileName, MAX_PATH); + if (charactersCopied) + names[count++] = (const char *)szFileName; + else + free(szFileName); +#else + if (hi->os.dl_info.dli_fname) { + names[count++] = hi->os.dl_info.dli_fname; } +#endif } names[count] = NULL; if (count == 0) { // Return NULL instead of empty list if there are no images - free(names); + free((void *)names); names = NULL; } @@ -1361,8 +815,12 @@ objc_copyClassNamesForImage(const char *image, unsigned int *outCount) } // Find the image. - for (hi = _objc_headerStart(); hi != NULL; hi = hi->next) { - if (0 == strcmp(image, hi->dl_info.dli_fname)) break; + for (hi = FirstHeader; hi != NULL; hi = hi->next) { +#if TARGET_OS_WIN32 + // fixme +#else + if (0 == strcmp(image, hi->os.dl_info.dli_fname)) break; +#endif } if (!hi) { @@ -1399,3 +857,106 @@ void objc_enumerationMutation(id object) { void objc_setEnumerationMutationHandler(void (*handler)(id)) { enumerationMutationHandler = handler; } + + +/********************************************************************** +* Debugger mode +* +* Debugger mode is used when gdb wants to call runtime functions +* and other methods while other threads are stopped. The runtime +* provides best-effort functionality while avoiding deadlocks +* with the stopped threads. gdb is responsible for ensuring that all +* threads but one stay stopped. +* +* When debugger mode starts, the runtime acquires as many locks as +* it can. Any locks that can't be acquired are off-limits until +* debugger mode ends. The locking functions in objc-os.h check each +* operation and halt if a disallowed lock is used; gdb catches that +* trap and cleans up. +* +* Each ABI is responsible for tracking its locks. Any lock not +* handled there is a potential gdb deadlock. +**********************************************************************/ + +#ifndef NO_DEBUGGER_MODE + +__private_extern__ int DebuggerMode = DEBUGGER_OFF; +__private_extern__ objc_thread_t DebuggerModeThread = 0; +static int DebuggerModeCount; + +/********************************************************************** +* gdb_objc_startDebuggerMode +* Start debugger mode by taking locks. Return 0 if not enough locks +* could be acquired. +**********************************************************************/ +int gdb_objc_startDebuggerMode(uint32_t flags) +{ + BOOL wantFull = flags & OBJC_DEBUGMODE_FULL; + if (! DebuggerMode) { + // Start debugger mode + int mode = startDebuggerMode(); // Do this FIRST + if (mode == DEBUGGER_OFF) { + // sorry + return 0; + } + else if (mode == DEBUGGER_PARTIAL && wantFull) { + // not good enough + endDebuggerMode(); + return 0; + } + else { + // w00t + DebuggerMode = mode; + DebuggerModeCount = 1; + DebuggerModeThread = thread_self(); + return 1; + } + } + else if (DebuggerMode == DEBUGGER_PARTIAL && wantFull) { + // Debugger mode already active, but not as requested - sorry + return 0; + } + else { + // Debugger mode already active as requested + if (thread_self() == DebuggerModeThread) { + DebuggerModeCount++; + return 1; + } else { + _objc_inform("DEBUGGER MODE: debugger is buggy: can't run " + "debugger mode from two threads!"); + return 0; + } + } +} + + +/********************************************************************** +* gdb_objc_endDebuggerMode +* Relinquish locks and end debugger mode. +**********************************************************************/ +void gdb_objc_endDebuggerMode(void) +{ + if (DebuggerMode && thread_self() == DebuggerModeThread) { + if (--DebuggerModeCount == 0) { + DebuggerMode = NO; + DebuggerModeThread = 0; + endDebuggerMode(); // Do this LAST + } + } else { + _objc_inform("DEBUGGER MODE: debugger is buggy: debugger mode " + "not active for this thread!"); + } +} + + +/********************************************************************** +* gdb_objc_debuggerModeFailure +* Breakpoint hook for gdb when debugger mode can't finish something +**********************************************************************/ +void gdb_objc_debuggerModeFailure(void) +{ + _objc_fatal("DEBUGGER MODE: failed"); +} + +// !defined(NO_DEBUGGER_MODE) +#endif diff --git a/runtime/objc-sel-set.h b/runtime/objc-sel-set.h index 8dc1753..c545b00 100644 --- a/runtime/objc-sel-set.h +++ b/runtime/objc-sel-set.h @@ -27,6 +27,9 @@ */ #include +#include "objc-os.h" + +__BEGIN_DECLS struct __objc_sel_set; @@ -34,3 +37,4 @@ extern struct __objc_sel_set *__objc_sel_set_create(uint32_t capacity); extern SEL __objc_sel_set_get(struct __objc_sel_set *sset, SEL candidate); extern void __objc_sel_set_add(struct __objc_sel_set *sset, SEL value); +__END_DECLS diff --git a/runtime/objc-sel-set.m b/runtime/objc-sel-set.m index 31edafb..38ef370 100644 --- a/runtime/objc-sel-set.m +++ b/runtime/objc-sel-set.m @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999-2004 Apple Inc. All rights reserved. + * Copyright (c) 1999-2004,2008 Apple Inc. All rights reserved. * * @APPLE_LICENSE_HEADER_START@ * @@ -31,23 +31,49 @@ // to 32-bit integers (like, the count), but SEL can be any size. #include -#import "objc-private.h" -#import "objc-sel-set.h" +#include "objc-private.h" +#include "objc-sel-set.h" -static const uint32_t __objc_sel_set_capacities[43] = { +#ifdef NO_MOD +// mod-free power of 2 version + +#define CONSTRAIN(val, range) ((val) & ((range)-1)) +#define SIZE 27 + +static const uint32_t __objc_sel_set_capacities[SIZE+1] = { + 3, 6, 12, 24, 48, 96, 192, 384, 768, 1536, 3072, 6144, 12288, 24576, 49152, + 98304, 196608, 393216, 786432, 1572864, 3145728, 6291456, 12582912, 25165824, + 50331648, 100663296, 201326592, UINT32_MAX +}; + +static const uint32_t __objc_sel_set_buckets[SIZE] = { // powers of 2 + 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, + 131072, 262144, 524288, 1048576, 2097152, 4194304, 8388608, 16777216, 33554432, + 67108864, 134217728, 268435456 +}; + +#else +// prime version + +#define CONSTRAIN(val, range) ((val) % (range)) +#define SIZE 42 + +static const uint32_t __objc_sel_set_capacities[SIZE+1] = { 4, 8, 17, 29, 47, 76, 123, 199, 322, 521, 843, 1364, 2207, 3571, 5778, 9349, 15127, 24476, 39603, 64079, 103682, 167761, 271443, 439204, 710647, 1149851, 1860498, 3010349, 4870847, 7881196, 12752043, 20633239, 33385282, 54018521, 87403803, 141422324, 228826127, 370248451, 599074578, 969323029, 1568397607, 2537720636U, UINT32_MAX }; -static const uint32_t __objc_sel_set_buckets[42] = { // primes +static const uint32_t __objc_sel_set_buckets[SIZE] = { // primes 5, 11, 23, 41, 67, 113, 199, 317, 521, 839, 1361, 2207, 3571, 5779, 9349, 15121, 24473, 39607, 64081, 103681, 167759, 271429, 439199, 710641, 1149857, 1860503, 3010349, 4870843, 7881193, 12752029, 20633237, 33385273, 54018521, 87403763, 141422317, 228826121, 370248451, 599074561, 969323023, 1568397599, 2537720629U, 4106118251U }; +#endif + struct __objc_sel_set { uint32_t _count; /* number of slots used */ uint32_t _capacity; /* maximum number of used slots */ @@ -63,7 +89,7 @@ struct __objc_sel_set_finds { // candidate may not be 0; match is 0 if not present static struct __objc_sel_set_finds __objc_sel_set_findBuckets(struct __objc_sel_set *sset, SEL candidate) { struct __objc_sel_set_finds ret = {0, 0xffffffff}; - uint32_t probe = (uint32_t)_objc_strhash((const char *)candidate) % sset->_bucketsNum; + uint32_t probe = CONSTRAIN((uint32_t)_objc_strhash((const char *)candidate), sset->_bucketsNum); for (;;) { SEL currentSel = sset->_buckets[probe]; if (!currentSel) { @@ -81,12 +107,14 @@ static struct __objc_sel_set_finds __objc_sel_set_findBuckets(struct __objc_sel_ // create a set with given starting capacity, will resize as needed __private_extern__ struct __objc_sel_set *__objc_sel_set_create(uint32_t capacity) { + uint32_t idx; + struct __objc_sel_set *sset = _malloc_internal(sizeof(struct __objc_sel_set)); if (!sset) _objc_fatal("objc_sel_set failure"); sset->_count = 0; - uint32_t idx; + for (idx = 0; __objc_sel_set_capacities[idx] < capacity; idx++); - if (42 <= idx) _objc_fatal("objc_sel_set failure"); + if (SIZE <= idx) _objc_fatal("objc_sel_set failure"); sset->_capacity = __objc_sel_set_capacities[idx]; sset->_bucketsNum = __objc_sel_set_buckets[idx]; sset->_buckets = _calloc_internal(sset->_bucketsNum, sizeof(SEL)); @@ -106,7 +134,7 @@ __private_extern__ void __objc_sel_set_add(struct __objc_sel_set *sset, SEL valu uint32_t oldnbuckets = sset->_bucketsNum; uint32_t idx, capacity = sset->_count + 1; for (idx = 0; __objc_sel_set_capacities[idx] < capacity; idx++); - if (42 <= idx) _objc_fatal("objc_sel_set failure"); + if (SIZE <= idx) _objc_fatal("objc_sel_set failure"); sset->_capacity = __objc_sel_set_capacities[idx]; sset->_bucketsNum = __objc_sel_set_buckets[idx]; sset->_buckets = _calloc_internal(sset->_bucketsNum, sizeof(SEL)); @@ -120,7 +148,9 @@ __private_extern__ void __objc_sel_set_add(struct __objc_sel_set *sset, SEL valu } _free_internal(oldbuckets); } - uint32_t nomatch = __objc_sel_set_findBuckets(sset, value).nomatch; - sset->_buckets[nomatch] = value; - sset->_count++; + { + uint32_t nomatch = __objc_sel_set_findBuckets(sset, value).nomatch; + sset->_buckets[nomatch] = value; + sset->_count++; + } } diff --git a/runtime/objc-sel-table.h b/runtime/objc-sel-table.h deleted file mode 100644 index 389900d..0000000 --- a/runtime/objc-sel-table.h +++ /dev/null @@ -1,32771 +0,0 @@ -// Automatically generated. Do not edit. -static const char * const _objc_builtin_selectors[] = { - "_fillsClipViewHeight", - NULL, - "accessibilityIsTitleAttributeSettable", - "theaterNumberOfAudioChannels", - "_makeHistory", - "setIgnoredWords:inSpellDocumentWithTag:", - "birthdayFieldPresent", - "contextID", - "rolloverMenuForCardProxy", - "errorExpectedTypeDescriptor", - "searchButtonRectForBounds:", - "_constrainColorIndexToVisibleBounds:dirtyIfNeeded:", - "objectGraphDescription", - NULL, - "installScrollValuesToScrollView:", - "_audioLevelsForPropertyID:", - "_cursorOfDividerAtIndex:position:dragConstraints:", - NULL, - NULL, - "initWithStartingColor:endingColor:", - "setAppleMenu:", - "maximumAdvancement", - "handleSwitchToCardAndColumnsFrom:animate:", - "kickYourSelfIntoMotion", - "textureColorSpace", - "supportsPlaying", - NULL, - "setCropInfo:", - "itemMatrix", - "_editSubgraph:", - "newChildObject", - "rateChangePreservesPitch", - "addTrackingRectForToolTip:reuseExistingTrackingNum:", - NULL, - NULL, - "_changeDrawerKeyState", - NULL, - "touchCachedImageForEmail:", - "allocateBatch:count:", - "notificationCenterForType:", - "setCurrentSelection:", - "objectID", - "target", - "_lockCachedImage", - "_setContentType:", - "setBaseWritingDirection:", - "initWithCSR:clHandle:", - "_listenForProxySettingChanges", - "setCoreUIWindowType:", - "_invalidateGlyphsForCharacterRange:editedCharacterRange:changeInLength:actualCharacterRange:", - "_setDelegate:", - "setGlyphGenerator:", - "setUsesRuler:", - "write", - "_indexForMoveRight", - "setMyButton:", - "_setKeyBindingMonitor:", - "_setURI:", - "asRef", - "setUpdateMovieBoxWhileResizing:", - "_installTrackingRect:assumeInside:userData:trackingNum:", - "_scriptingCount", - "addFirst:", - "_canGuaranteeOrderOfContentObjects", - "textView:doCommandBySelector:", - "_yesterdayString", - "_getSelectorForType:", - "_postpone", - "isContinuousSpellCheckingEnabled", - "_outputAudioSampleBuffer:fromConnection:", - "_restoreMode", - "layoutPopupViews", - "_growCachedRectArrayToSize:", - "setShowsSuppressionButton:", - "isHorizontal", - "saveQuery", - "isKeyExcludedFromWebScript:", - "CA_isAbsolutePath:", - NULL, - NULL, - "setShowsInvisibleCharacters:", - "_componentsOfInterestToDatePickerFromDate:", - "retainedFigSampleBuffer", - NULL, - "_setTrust:", - "resetToolbarToDefaultConfiguration:", - "nts_RestoreFromMetaDataIfNeeded", - "_arrangeObjectsWithSelectedObjects:avoidsEmptySelection:operationsMask:useBasis:", - "_ignoreForKeyViewLoop", - "bogusbogus", - "substringFromIndex:", - "accessibilityIsWindowsAttributeSettable", - "blurHorizontalPass3ROI:destRect:", - "charactersToBeSkipped", - "initWithKey:type:isReadOnly:appleEventCode:isLocationRequiredToCreate:", - "_spellingGuessesForRange:", - "initForWritingWithMutableData:", - "delayWindowOrdering", - "_defaultObjectClass", - "removeDocument:", - NULL, - "initWithTimeIntervalSinceReferenceDate:", - "addressBookWillDealloc:", - "rowsPerScreen", - "words", - "hasVerticalScroller", - "_NSNibPathForNibID:", - NULL, - "_intercellSpace", - "_setSelected:", - NULL, - "fontDescriptor", - "_clearRawPropertiesWithHint:", - "setUIController:", - "setSaveWeighting:", - "chapterlist", - "fauxFilePackageTypes", - "invalidateAnimatedCellsArrayCache", - "_dotMacEmailEncryptionUsage", - NULL, - NULL, - "_releaseURIArray", - "closeFileHandler", - "setUsesItemFromMenu:", - "cgContext", - NULL, - "peopleWithScreenName:", - "addEffectWithDictionary:", - "moveAnnotationToEnd:", - NULL, - "selectCell:", - "beginRenderTexture:colorSpace:virtualScreen:", - "clearShadow", - "_scheduleAnimationContextStackFlush", - "initWithRuns:glyphOrigin:lineFragmentWidth:elasticWidth:usesScreenFonts:isRTL:", - "_invalidLabelSize", - "systemDefaultPortNameServer", - "growBuffer:current:end:factor:", - "preferredPlaceholderForMarker:", - "processNode:permutations:path:replacingNode:subtreeWith:into:", - "alignmentRect", - "_setTexturedBackground:", - "_startAutoExpandingItemFlash", - "writeProperty:forKey:", - "_updatedState:", - "sortedArrayUsingFunction:context:", - "_updateOverlay", - "yTranslation", - "saveOptionCanUseFileType:", - "encodeWithCoder:", - "cStringUsingEncoding:", - "_hasKeyFocus", - "importFactor", - "unquiesce", - NULL, - "operationWasAborted", - "pixelFormatKYMC8", - "openListFromFile:", - NULL, - "processEventQ", - "_closeInlinePreview", - "headerView", - "_moveDown:", - "colorForProperty:", - "_resetCurrentSearchIndex", - "_selectWindow:", - "_drawCustomTrackWithTrackRect:inView:", - "setDatabaseUUID:", - "compressedSizeForOriginalSize:", - "pixelFormatRGB16", - "controlSize", - "imageBrowser:didMoveItemsAtIndexes:", - "setContinuous:", - "_validateSpecifier", - "resizeDisplayView:", - "cancelScheduledEndOfSearch", - "standardItemWithItemIdentifier:", - "shouldCreateIvarPorts", - "preservesAspectRatio", - "_setDrawsOwnDescendants:", - "addCancelButton", - "sessionFinished:", - "_sendDataSourceWriteDragDataWithIndexes:toPasteboard:", - "isPolicySpecificStatusCode:", - "gotoPreviousItem:", - NULL, - "stopClearSearchTimer", - "_flushAllCachedChildren", - "setImageLayer:originalLayer:mode:", - "_send:", - "_copyCGImageAndRect:forDrawingInRect:inReferenceContext:", - NULL, - "notActiveWindowFrameColor", - "needsDisplay", - "applyFontTraits:range:", - "lockFocusIfCanDrawInContext:", - "_setAlignmentRectInNormalizedCoordinates:", - "scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:", - "setConditionallySetsEditable:", - NULL, - "_assertFilterRestrictsInsertionOfObjects:atArrangedObjectIndexes:", - "mediaBrowserView", - "_getATSTypesetterGuts", - "_setDocumentEdited:", - NULL, - "launchQCPickerWithParent:withDelegate:fromView:centerPoint:onScreen:currentQCIdentifier:", - "originalURL", - NULL, - "highestMipmapItem", - "makeKeyAndOrderFrontWithEffect:", - "_isHidden", - "_getExternalData:", - "handlePrintScriptCommand:", - "commitChanges:", - "characterSetCoveredByFont:language:", - "shouldEdit:inRect:ofView:", - "tickMarkValueAtIndex", - "cropPRSFromCropRegion:cropSize:originalImageSize:", - "_updateForDocumentEdited:", - "setCurrentInputManager:", - "validateMenuItem:", - "internals", - "systemTabletID", - "systemVersion", - "trustSettingsDomain", - "codecType", - "removeAppleUseCoreUIAtIndexes:", - "setNeedsDisplayInRect:avoidAdditionalLayout:", - "fillColor", - "deselectMemberRow:subrow:", - "_invalidateExecutionMode", - "_enableRefreshOnWindow:", - "componentRemoveNotification:", - "discardMarkedText", - "indexFromURL:", - "isRegularFile", - "removeCurrentSchedule", - "valueClass:forBinding:", - "initWithPreview:forView:", - "initWithCIImage:options:", - "_registerMenuItemForKeyEquivalentUniquing:", - "setPreloadRange:", - "_fetchAllInstancesFromStore:intoContext:underlyingException:", - "accessibilityIsMainAttributeSettable", - "addNormalAndDownAppearanceWithStateToDictionaryRef:", - "ancestorsStartingWith:", - "insertBacktab:", - "insertROI:destRect:", - "iconForItem:", - NULL, - "setThemeFrameWidgetState:", - "deselectGroup:", - "getAttributeFromBuffer:allowBinary:", - "_animatePulse", - "indexOfCurrentSlideshowItem", - "_verticalDistanceForPageScroll", - "_invalidateBezierPathsForKeyFrame:", - NULL, - "_CAAdminEmailAddress", - "selfDidResize:", - "shouldRunSavePanelWithAccessoryView", - "isGatheringResults", - "isBusy", - "directoryTraversalOperation:shouldProceedAfterError:", - "_keyBindingMonitor", - "ibIsInDesignMode", - "_stateUpdated:", - "nts_UniqueId", - "_newLazyIconRefRepresentation:ofSize:", - "initWithContentRect:styleMask:backing:defer:drawer:", - "multiply:by:", - "_dayOfWeekForDate:", - "allowsExpandingMultipleDirectories", - "vertBlur2ROI:destRect:", - "_validateMultipleValue:forKeyPath:atIndex:error:", - NULL, - "firstUnlaidCharacterIndex", - "_remove:", - "autovalidates", - "_redoLayout:", - "_setEventDelegate:", - "allowsDragging", - "file", - "_interviewPadding", - NULL, - "contentDidChangeAtIndexes:", - "invalidateParagraphStyles", - "_initWithRTFSelector:argument:documentAttributes:", - "initWithPosition:objectSpecifier:", - "registerModelKeyPath:", - "copyPublicRecordsForClass:withDatabaseImpls:inAddressBook:", - "_reCalcTextButton", - "raise", - "_userDeselectColumn:", - "appendParameterDeclarationsToAETEData:", - "_updateTextSize", - NULL, - NULL, - "_getPartStruct:numberOfParts:withInnerBounds:", - "_opacityAtPoint:inBitmapImageRep:", - "isFBOSupported", - "discardThumbnail", - "action:", - "_setSortDescriptorsNoCopy:", - NULL, - "_isSettingSubmenuForOldMenu:", - "_certPanelSheetDidEnd:returnCode:contextInfo:", - "_setCurrentAttachmentRect:index:", - "selectionFromTopToPoint:", - "_isConnectionKeyInUse:", - "clearsDepthBuffer", - "drawsCellBackground", - "_captureVisibleIntoLiveResizeCache", - "_setKeyCellAtRow:column:", - "frameForPlusButton:atIndex:", - "askDiscardChangesWithFile:", - "_updateNodeList:byRemovingNode:sendPrepareMessageWithParentNode:", - "_setExplicitlyCannotAdd:insert:remove:", - "setKnobProportion:", - NULL, - "_pluginClassWithObject:", - "showInspector:", - "timeLimit", - "_applyStylesheet:arguments:error:", - "_clickedInExpansionTriangle:", - "DSQueryString", - "resumeInformation", - "endDisplay", - "_similarFontWithName:", - "PDFViewPerformFind:", - "isFlashMovie", - "removeObjectForKey:inDomain:", - "_openDocumentFileAt:display:", - "_fallbackLoadPreview:", - "_activateDocumentPreview:", - "figFormatDescription", - "clipViewBoundsChanged:", - NULL, - "_NSNibIDForNibPath:", - "_filterRestrictsInsertion", - "autoAdaptDuration", - "largerButton", - "_convertRectToSuperview:", - "lineFragmentRectForGlyphAtIndex:effectiveRange:", - "getAttribute:index:", - "pageColor", - "_coreUICircularValue:", - "standardizedURLPath", - "import", - "drawHelpIcon:inContext:", - "cellFrameForTextContainer:proposedLineFragment:glyphPosition:characterIndex:", - "associate:with:", - NULL, - "handleDelegateClickedFauxDisabledNode:", - "_checkSpellingForRange:excludingRange:", - NULL, - "_addCursorRect:cursor:forView:", - "loadArchive:", - NULL, - "currentTaskDictionary", - "iconSize", - "_popNamespaces", - "handleResponseSubnode:", - "openDescendantCount", - "_color", - "_newLineForLibXML2ElementNode:", - "quartzFilterManager:didRemoveFilter:", - "columnsAutosaveName", - "setDraggable:", - "_savePanelAccessoryViewForWritableTypes:defaultType:", - "addButtonWithTitle:", - "setAutofillColor:", - "preferredLanguages", - "_cfurlcredential", - NULL, - "control:textView:completions:forPartialWordRange:indexOfSelectedItem:", - "expire", - "__hierarchyControlAction:", - "isOneShot", - NULL, - "_setNeedsDisplayForTargetRow:column:operation:", - "CAJS_timerWithTimeInterval:function:repeats:", - "customRect:", - "listDictionary", - "_hasRowHeaderColumn", - "clearStopAnimation", - "setGroupIdentifier:", - "useTableViewLook", - "_setComposition:context:", - "_saveRequestForStore:originalRequest:andOptimisticLocking:", - "dateRangeExtendedWithDate:", - "setDeferred:", - "liveImportCell:", - "_gray136Color", - "_selectRange::::", - "accessibilityIsSearchButtonAttributeSettable", - "_guaranteeStorageInDictionary:addBinding:", - "encodeBool:forKey:", - "stores", - "_baselineOffsetForUILayout", - "_defaultLineHeightForUILayout", - "nts_ValueForProperty:row:", - "_addContent", - "creationDateYear", - "initWithCharacters:length:", - "fetchPredicate", - "nodeWithPath:", - "databaseUUID", - "infos", - "_isContextualMenu", - "selectedDirectories", - "_drawRowHeaderSeparatorAsSurface", - "criteriaSlices", - NULL, - NULL, - "panelShouldHaveSingleIndexPageButton", - "recordToOutputFileURL:bufferDestination:", - "_generateSQLForVariableExpression:inContext:", - "_presentAlertPanelForError:responder:responderCandidate:", - "convertToDictionary", - "shadowColor", - "appendCharacters:length:", - "computeMargin", - "lineWidthForType:", - "unregisterCallbackObserver:", - "initWithPatch:dataSource:", - NULL, - "positionOfGlyph:struckOverRect:metricsExist:", - "_refreshLinkedDevicesAttributeFromCallback", - "updateSearchHilight", - "createFTPReadStream", - "setMenuItem:", - "drawGroupsOverlays", - "cardsFromGroup", - "_addUpdatesToDatabaseOp:forManyToMany:", - "_moveInDirection:", - "dividerStyle", - "_layoutRightHandButtons", - "_oldStyleTypeNameForIdentifier:", - "childWithKey:", - "initWithKeyOptions:valueOptions:capacity:", - "windowEffectDidTerminate:", - "labelFontOfSize:", - "defaultClassPath", - NULL, - "hasTag:", - "currentFrameAsNSImage", - "dataWithBytesNoCopy:length:", - "datePickerStyle", - "indexSheetStatus", - "_setImpl:", - "copyDataToPasteboard:", - "sendEvent:", - "_allocateDatePickerCellExtraIvars", - "setManagedObjectClassName:", - "tintedImageWithColor:operation:", - "parentWillDie:", - "scrollerWidth", - "saveFrameUsingName:", - "_dirtyRect", - "configureForCanChooseFiles:", - "_startBatchWindowAccumulation:", - "setSimpleQueryString:withAdvancedQueryString:", - "storeNSBitmapImageRep:glID:offset:", - "_web_defaultsDidChange", - "focusImageAtIndex:", - "printingAdjustmentInLayoutManager:forNominallySpacedGlyphRange:packedGlyphs:count:", - "_responder", - NULL, - "viewWillMoveToSuperview:", - "_supportsMinAndMax", - "nts_FindMemberUID:inArray:", - "broadcast", - "_getTiffImage:ownedBy:", - "setNoDepthBuffer:", - "initWithOffset:", - "_blockClassForBlock:", - "_hasFocusRingInView:", - "configureForShowsPreviews:", - "_changeAllDrawersMainState", - NULL, - "associateSourceInstance:withDestinationInstance:forEntityMapping:", - "originalBodyStream", - "setCanGoNext:", - "supportedPixelBufferFormatsForManager:", - "setMipmapVMUsagePolicy:", - "slideshowSwitchToFullScreen:", - "hasChildNodes", - NULL, - NULL, - "indexOfSelectedItem", - "_setLiveResize:", - "_installAutoreleasePoolsOnCurrentThreadIfNecessary", - "menu:willHighlightItem:", - "deletePerson:", - NULL, - "_updateUserKEsAfterActivation:", - "initWithColorSpace:components:count:", - "addIndexes:", - "removeMipmapDataInfoWithUID:", - "dataRepresentation", - "_redisplay", - "fadeHUDIn", - "bindIntoRAMScheduleStep", - "_currentBorderIsTable", - NULL, - "cacheRetainCount", - "scheduleTrickleSyncRetry:", - "loadTidy", - "_turnOnVerticalScroller", - "mode", - "_transparency", - "_setFrame:updateBorderViewSize:", - "_preloadingEnded", - "dateYear", - "renderContext", - "initWithNodes:count:", - "invalidateAllCachedPropertyValues", - "subcacheMatchingMd5List:forIndices:count:", - "alwaysPresentsApplicationModalAlertsWithBinding:", - "updateInvalidatedFont:forObject:", - "imageCropView:keyDown:", - "outputFileURL", - "_addIndexedEntity:", - NULL, - NULL, - "setLegendVisible:", - "minimalParseCert:", - "initWithPreviousContext:", - "integrateReferenceInstance:", - NULL, - "_vCardKeyForGenericLabel:", - NULL, - "_isDocumentAddedToIPhoto:", - "usageInMovie", - "compare:options:range:", - "replaceSelectedPagesWithPageRange:drawNow:", - "faultHandler", - "entryViewForEntry:", - "allocForSQLEntity:", - "nts_ImportTipCards", - NULL, - "isDirectoryNode:", - "addErrorMessage:", - "_lookForDisplayBundles", - "drawCell:", - "titleWidth:", - "fileHandleWithStandardError", - NULL, - "_finishWritingFileAtPath:byTakingContentsFromFileAtPath:addingAttributes:usingTemporaryDirectoryAtPath:keepingBackupFile:error:", - "descriptorWithBoolean:", - "autoenablesItems", - "setSizeNeedsUpdate:", - "writeDateValue", - "CI_initWithRect:", - "_consistencyCheck:", - NULL, - "_hasTableWithName:", - "__finalize_QCPickerSelectionLayer", - "__oldnf_replaceFirstAppearanceOfString:withString:", - "removeAttribute:", - "ABIsAddressBook", - "setUpDataSources", - "maximumAvailableMemoryOfType:rendererID:", - "createPixelBufferFromProvider:withFormat:transformation:bounds:colorSpace:options:", - "setValue:type:forDimension:", - "filesystemItemRemoveOperation:shouldProceedAfterError:removingItemAtPath:", - "setRecursive:", - "setEndSubelementIdentifier:", - "_readFileListMode", - "selectedColorSpace", - "_bind:toController:withKeyPath:valueTransformerName:options:existingNibConnectors:connectorsToRemove:connectorsToAdd:", - "stretchImageHorizontalROI:forRect:userInfo:", - "dismissPopUp", - "_selectDownstream:", - "accessibilityPostNotification:withNotificationElement:", - "fileProperty", - "_selectCorrectScopeButton", - "horizontalLineScroll", - "_editParentGraph:", - "hackQueryForManyToManyPrefetching:andSourceObjectIDs:", - "drawBorderImage:middleImage:borderImage:inRect:withOrientation:flipped:", - "imageManagerDefaultOptions", - "userInfoForKey:", - "inputTopLine", - NULL, - NULL, - NULL, - "initWithPredicateOperator:leftKeyPath:rightKeyPath:", - "initPointersForResolutionData:", - "clearRecents:", - "_setQNamesAreResolved:", - "configureForInactiveState", - "mainOperation", - "_viewHandlesEvents", - "spellServer:didForgetWord:inLanguage:", - "people", - "redisplay", - "setAnimateCompositions:", - "serializeInt:atIndex:", - "_reestablishInternalCFCachedURLResponse:", - "_leftBezelToTitleOrImageHorizontalOffset", - "scaleUnitSquareToSize:", - "_setWindowNeedsDisplayInViewsDrawableRect", - "_replySequenceNumber:ok:", - "initWithColorSyncInfo:", - NULL, - "_relatedNodes", - NULL, - "selectDown", - "_calcMarginSize:operation:", - "fadeFromNormalToBlack:wait:", - "_baseString", - "modifyFontTrait:", - "setUpTrackingRects", - "_setDirection:", - "arrayByApplyingSelector:", - "setSpeakingSpeechFeedbackServices:", - NULL, - "_drawOptimizedRectFills", - "deserializeInts:count:atIndex:", - "setCity:", - "addNormalAppearanceWithStateToDictionaryRef:", - "_zeroScreenHeight", - "addOptionsToDictionaryRef:", - "_setDropHighilightColorIfSelected:", - "_getAttributesInNode:fromBuffer:listReference:count:includeValues:allowBinary:", - "newColor:", - "computeRowsCount", - "adjustAndDisplay:", - "_sizeToFitForUserColumnResize", - "_rangeOfPrefixFittingWidth:withAttributes:", - "initWithRanges:count:", - "windowDidChangeNumber:", - "cancelQueries:", - "uniqueProxyPortKeyFromName:", - "typeCodeValue", - "readFromFile:ofType:", - "countByEnumeratingWithState:objects:count:", - "_initializeICUStructuresWithLocale:andOptions:", - NULL, - "textureFlipped", - "setDirectoriesSubrowDelegate:", - NULL, - "_storeTypeForStore:", - "_hasSourceListBackground", - "_initWithSourceEntityDescription:destinationEntityDescription:", - "_getITypeFor:", - "_requestEditableState:", - "accessibilityShouldUseUniqueId", - "deleteForward:", - "_registerUndoForModifiedObjects:", - "cellPrototype", - "qcComposition", - "indexOfMember:inSortedMembers:", - "_fillInBlock:forElement:backgroundColor:extraMargin:extraPadding:isTable:", - "_runGarbageCollection", - "accessibilitySelectedAttribute", - "newCreatePrimaryKeyTableStatement", - "_members", - NULL, - "setAutoAdaptDuration:", - "_canCreateCollapsedSpecifierFromAbsolutePositionRecord:", - "setupTooltipViewForPoint:inNode:bounds:tooltipBounds:", - "_handleKeyEquivalent:", - "initOffScreenWithPixelFormat:size:colorSpace:patch:", - "sharedSyncManager", - "standaloneMonthSymbols", - "removeBinding:fromObject:", - "isMainWindow", - "setSubitems:", - "convertPoint:fromPage:", - "customAttributes", - NULL, - "writePaneGeometryToDefaults", - "isMemberOfClass:", - "maximumRecentDocumentCount", - "textObjectToSearchIn", - "displayedProperty", - "acquireLock:lockMode:", - "operationHasEnded:", - "initWithCarbonWindowRef:takingOwnership:disableOrdering:forNSViewHosting:", - "page", - "initWithClassDescription:", - "_oldFontSetWithName:", - "hudFadeInTimerElapsed:", - "cracklibDictionarylocation", - "_setTimelineColor:", - "observedNodesSet", - "hideToolbar:", - "_initWithDestinationName:valueExpression:", - "_dataEnciphermentUsage", - "indexPathFromSelectionInBrowser:upToColumn:", - "boundsForSelectedPages", - "initWithDefaults:initialValues:", - "setSelectionFromGUIDs:", - "addControlPointAtTime:withValue:", - "_undoableSetEffectsWithDisplay:", - "_resizeCursorForTableColumn:", - "colorUsingColorSpaceName:device:", - "_keyPathIfAffectedByValueForKey:exactMatch:", - "recalcOutsideShadow:forResolutionData:", - "_delegateDoesNotCreateRowsInMatrix", - "endDisplayAndComplete:", - "scrollPoint:fromView:", - "cellIndexAtPosition:", - "_resizedTargetImageRect:", - "_updateWindowFrame:", - "_controlColor", - "_setContextMenuTarget:", - "stopLiveCapture", - "_saveFrameUsingName:domain:", - "_titleToBezelOrIndicatorPadding", - "_drawMatrix", - "setScrollsDynamically:", - NULL, - "_prepareSynchronizationOfEditedFieldForColumnWidthChange", - "_addColumnWithIdentifier:title:dataCell:sortable:", - "_availableFontFamiliesForCollectionName:", - "removeObjectsFromIndices:numIndices:", - "_setAcceptsFirstResponder:", - "_validateValue:forKeyPath:ofObjectAtIndexPath:error:", - "_currentPoint", - "__oldnf_decimalIsNotANumber:", - "undoManagerForOperation:", - "timeSlider:didClickOnButtonWithTag:", - "allocWithEntity:", - "clipRect:", - "representedObject", - NULL, - "_pointFromColor:", - "exportCurrentItemToiPhoto", - "_buildSupportUnitsForVideoInputConnection:error:", - "isCDATA", - "needsAction", - "animationManager", - "writeBackgroundColor", - "depthLimit", - "registerPixelFormat:", - NULL, - "_setUndoManager:", - "_deleteNodeFromEntityCache:", - "keyframeStartTime:", - "fileModificationDate", - "setSizeMode:", - "initWithContainerClassDescription:containerSpecifier:key:name:", - "_updateKnownNotVisibleAppleMenu:", - "rulerView:handleMouseDown:", - "buildAlertStyle:title:message:first:second:third:oldStyle:args:", - "setSubrowSelection:", - "reply", - "rootDocument", - "initWithTransform:", - NULL, - "isOrScoped", - "_allocAuxiliary:", - "movie:shouldChangeController:", - NULL, - "_resolveTypeAlias:", - "colorWithDeviceHue:saturation:brightness:alpha:", - "initWithImageProvider:size::format:colorSpace:options:", - "_endCustomizationPalette:", - "metadataForPersistentStoreOfType:URL:error:", - "_disableChangeSync", - "drawAtPoint:", - "setButton:enabled:", - "windowFrameOutlineColor", - "_itemMenuInPaletteForEvent:", - "objectDidTriggerDoubleClickAction:", - "_updateDragInsertionIndicatorWith:", - "setJavaScriptCanOpenWindowsAutomatically:", - "_toolbarView", - "cacheFaultingStatement:", - "_writeDocumentProperty:value:toString:", - "registerForHardwareNotification", - "_collapseRootEntry:clearExpandState:", - "_invalidateGroupRowsIfNeeded", - "cellMargin", - "startImportVisibleCells", - "pointerAtIndex:", - "subsampling", - "targetHref", - "object", - NULL, - NULL, - NULL, - "cellFont", - "_web_parseRFC822HeaderFields", - "_getOriginalNSImageWithOriginalData", - "dispatchInstructions", - "_needsToRemoveFieldEditor", - NULL, - "doBilateralPass:points:weights:sums:slope:", - "initWithDir:", - "updateUI", - "_emailProtectionUsage", - "_calculateSelectedSegmentForPoint:", - NULL, - "_getPassword:", - "pushActiveListAnalyzer:", - "_textFont", - "_markerForMarkerFormat:itemNumber:isNumbered:substitutionStart:end:specifierStart:end:", - "setUseCleanAperture:", - "canExportToApplication:", - "initWithAssignmentVariable:expression:", - "setDrawsGrid:", - "setAppliesImmediately:", - "setInsertedObjects:", - "setDataCallback:", - NULL, - "_setAdditionalThingsFromEvent:", - "fullTitle", - "fontDescriptorByAddingAttributes:", - NULL, - "_readFromFileWrapper:ofType:", - "netServiceBrowser:didRemoveService:moreComing:", - "addLast:", - "frameDidChange:", - "_hiddenStateWithMode:", - "changeFieldLabel:", - "sourcePosition", - "setTopMargin:", - "splitterFrame", - NULL, - "dataSourceIndex", - "selectedColor", - "removeInfoForKey:", - "setLineFragmentPadding:", - "addToWindow:flags:", - "setAnimationDuration:", - "_separatorRectForInactiveWindow", - "defaultPortNameServer", - "_removePrivateAttributes", - "defaultAnimationForKey:", - NULL, - "plugInClassIsValid:", - "initWithCGLayer:options:", - "_restoreLevelAfterRunningModal", - "eventQueue", - "databaseWasReset:", - "_writeSelectionToState:fromPoint:", - NULL, - "managedObjectContext", - "removeFileAtURL:andReturnResultCode:", - "selectedDirectoryResultsSubrows", - "globalID", - "resizeByMovingKnob:toPoint:", - "filename", - "_endWiringNibConnections", - "_resolvedDecompressionOptionsForInputConnection:alsoRequiresDeviceNative:", - "_syncScrollerSizeOfColumn:", - "reloadMembers", - "initWithLimit:inScope:", - "intersectWith:", - "applyInContext:", - "__setTimeBase:", - "lock", - "invalidateCacheSinceIndex:", - "_determineIsSameTargetForDragInfo:", - "attachPopUpWithFrame:inView:", - "descendantNodeAtIndexPath:", - "getDrawingTransformForBox:", - "setWhiteBackground:", - "_loadFontFiles", - "raise:toPower:", - "_bitmapImageRepFromArbitraryImageRep:pixelsWide:pixelsHigh:", - "_setDNSName:", - "_windowTitlebarXResizeBorderThickness", - "pageNumber", - "updateTrackingAreas", - "originalPort", - "initWithDecimal:", - "setBackgroundColor:", - "expectedContentLength", - "_bottomCornerSize", - "_setInt:ifNoAttributeForKey:", - "tokenFieldCell:shouldUseDrawingAttributes:forRepresentedObject:", - "rulerAccessoryViewForTextView:paragraphStyle:ruler:enabled:", - "_validateError:forPresentationMethod:", - "_recentDocumentRecordsKeyForMenuTag:", - "shouldBeginDrag:", - "addRemoveOperationWithIndex:", - "outlookWebAccessServer", - "_buttonsRect", - "setZoom:", - "addItemWithTitle:andIdentifier:", - "didPostNotificationForNodeEventKind:notification:", - "setCriteria:andDisplayValues:forRowAtIndex:", - "_lockButtonOrigin", - "IKIPImageWithMaxSize:", - "_thumbnailWithSize:antialiased:qualityRequested:qualityProduced:", - "updateFormData", - "presentableNameForName:", - NULL, - "_cgsEventTime", - "_updateButtonsWithReadOnly:", - "MIMEType", - "grabFocusIfNeeded", - "_sortedSubentities", - "accessibilityMainAttribute", - "expressionWithFormat:arguments:", - "isInPriorityList", - "lineFragmentRectForProposedRect:remainingRect:", - "pointSize", - "_addPeople:usingAddressBook:", - "isWordInUserDictionaries:caseSensitive:", - "selectionIndexPaths", - "applicationShouldOpenUntitledFile:", - "_rowCacheForIndex:", - "invalidXMLCharacterSet", - "setRoundedEdges:", - NULL, - "_saveCollections", - "noteDirectoriesSelectionChanged", - "_uniqueNameForNewSubdocument:", - "setOnOpenGLContext:unit:", - "_undoUpdates:", - "_recursiveGenerateFormattingDictionaryPlistForItem:rowType:intoArray:withPriorValues:hasSiblings:", - "addElement:", - "inverseToOne", - "_convertRange:toPosition:", - "takeColorSpaceFrom:", - "_configureCell:forItemAtIndex:", - "setRunLoopModes:", - "setClassName:", - "_useSquareToolbarSelectionHighlight", - NULL, - "addBindVariable:", - "_forceSetLastEditedStringValue:", - NULL, - "_setKeyAgreementUsage:", - "paragraphCharacterRange", - "sendBeforeTime:streamData:components:from:msgid:", - "externalName", - "updateDisplayedViewWithTransition:", - NULL, - "scanString:intoString:", - NULL, - "_totalTabsLength:overlap:", - NULL, - "maxFormattedDisplayLabelWidth", - "setSupermenu:", - "handleGoIntoSelectedDirectory", - "setIndices:", - "computeInterpolatedResolution:data:", - "formatWidth", - "iconForFiles:", - "URL:resourceDataDidBecomeAvailable:", - "saveState:", - "drawColor:", - NULL, - "memberOfInputExtent:", - "privateSliderDidChanged:", - "_image", - "_propertyDescriptionsOfClass:fromImplDeclarations:presoDeclarations:suiteName:className:", - "enterFullscreen:", - "_enableChangeSync", - "_setModalInCache:forWindow:", - "systemCharacterProperties", - "_rowHeaderColumn", - "_setLayerTreeRenderer:", - "_infoSession", - "_imageNamed:", - "IKAccelerationCoefiscient", - "stringByAppendingPathExtension:", - "credentialWithKeychainItem:", - "initWithValue:label:property:addressBook:", - "changeFont:", - NULL, - "_fillToken:withString:position:", - "tokenFieldCell:completionsForSubstring:indexOfToken:indexOfSelectedItem:", - "addGroupView", - "sharedTracer", - "matchingFontDescriptorWithMandatoryKeys:", - "_sendCarbonNotificationFor:tags:withValuePtrs:andSizes:", - "_updateDetailLevelWidths", - "deviceSystem", - "eMapResultForMaterial:", - "displayedURL", - "preferencesNibName", - "filterGeneratorWithContentsOfURL:", - "_rulerOrigin", - "readTimeOut", - "ABBogus:", - "bitmapImageRepForCachingDisplayInRect:", - "_updateLayerMasksToBoundsFromView", - "screenRectForResource", - "canAddField:", - "_endScrolling", - "convertImageRectToViewRect:", - "initWithCharacterIdentifier:collection:baseString:", - "_installRulerAccViewForParagraphStyle:ruler:enabled:", - "nts_ReopenDatabaseForAddressBook:", - "_checkDisplayDelegate:", - "_setShadowParameters", - "_setKeyFrameEditor:", - "directoryListQuery", - "attachment", - "_enable", - "setIsUp:", - "_currentSuiteName", - "qualityChanged:", - "setPreviousText:", - "initWithImage:hotSpot:", - "_resetImage", - "sendBeforeDate:msgid:components:from:reserved:", - "setSelectedRanges:affinity:stillSelecting:", - "contentRectForBounds:", - "_accessibilityUIElementPathForChild:", - "compositionRenderer", - "trackingArea", - "getCString:maxLength:encoding:", - "lightPaperBackgroundUsingTexture:", - "_NSNavFilePropertyCompare:", - "hyphenGlyphForLanguage:", - "_fillGrayRect:with:", - "_removeOrRename:", - "_validateForSave:", - "transformFromRect:windowWidth:windowHeight:", - "_doUpdate:", - "magentaComponent", - "_raiseIfInvalidURL:", - "setDocument:", - "boundingBoxForControlGlyphAtIndex:forTextContainer:proposedLineFragment:glyphPosition:characterIndex:", - NULL, - "_currentChildOperation", - "setSelectedItemsReordering:", - "removeObservedKey:", - "__ivar_getTrackingCell", - "initWithMutableData:forDebugging:languageEncoding:nameEncoding:textProc:errorProc:", - "_postQueryStartedNotification", - "_editClickedCell:", - NULL, - "numberOfVisibleItems", - "levelsOfDetail", - "toolbarItemClicked:", - "pointingDeviceID", - "ISS__ay_performSelector:withObject:withObject:inThread:", - "showPools", - "issueChangePropertiesCommand", - "_newLineForElement:", - "_fetchConfigsWithURL:", - "_resetErrorInfo", - "_flushCurrentDocument", - "setPanTiltSpeed:", - "isMainThread", - "info", - "_parseHalf:intoArray:isValue:errorDescription:", - "noteMembersListChanged", - "startingColumn", - "setLastColumn:", - "fontDescriptorWithFace:", - "note", - "_imagesHaveAlpha", - "cyanComponent", - "_setSingleValue:forKeyPath:", - "isListChoice", - "updateCurGlyphOffset", - "deserializePList:", - "isGreaterThanOrEqualTo:", - "dragImage:fromWindow:at:offset:event:pasteboard:source:slideBack:", - "setIsContainer:", - "supportedRenderFormatsForContext:", - "_forKey:getType:andSuite:", - "sendAppleEventSetup:", - "_addOption:", - "_ensureSubviewNextKeyViewsAreSubviews", - "drawOverlayRect:", - "_loadFromDOMRange", - "setAlwaysPresentsApplicationModalAlerts:", - "nts_Save", - "_nameWithRequiredExtensionCheck:", - "uniqueMembersInSelectedGroups", - "imageScaling", - "_createLayer", - "draggingPasteboard", - "scrollSelectionToView", - "searchElementForConjunction:children:", - "defaultDepthLimit", - "_windowTitlebarYResizeBorderThickness", - "_abCompareWithinIntervalAroundTodayYearless:", - "_initWithObservances:count:", - "_windowBorderGradientFromGrayValue:toGrayValue:colorSpace:", - "decomposedStringWithCanonicalMapping", - "removeObjectsAtArrangedObjectIndexes:", - "setLongitude:latitude:", - "_startServer", - NULL, - "reservedSpaceLength", - "_focusRingVisibleRect", - "_doStopDrawer", - "getLineFragmentInsertionPointArraysForCharacterAtIndex:inDisplayOrder:positions:characterIndexes:count:alternatePositions:characterIndexes:count:", - "_findInCacheMapWithRadius:strokeColor:fillColor:mode:lineWidth:", - "childNodes", - "noteGroupsListChanged", - "standardWindowButton:", - "setScriptErrorNumber:", - "updateComponentState", - "_updateRulerlineForRuler:oldPosition:newPosition:vertical:", - "_registerUnitWithName:abbreviation:unitToPointsConversionFactor:stepUpCycle:stepDownCycle:", - "exit", - "_wasReshapingEnabled", - "backgroundComposition", - "unsuppressAllNotifications", - "setVCardField:isPrivate:", - "addIMValueTo:", - "_disable", - "entityNamed:", - "selectedTag", - "isItemShownInPopupIfSoleEntry:", - "bestPixelFormatWithCompatibility:forProvider:usingColorSpace:", - "_setNeedsDisplayInRect:", - "setAttributes:Values:ValueSizes:Count:", - NULL, - "suiteDescriptionFromPropertyListDeclaration:bundle:", - "pathsForResourcesOfType:inDirectory:forLocalization:", - "registerLayerWithView:", - "_ikMainThreadInvoke", - "rootLayer", - "_resizeSelectedTabViewItem", - "_targetAndArgumentsAcceptableForMode:", - "drawFragmentationInRect:fromPosition:andLength:", - NULL, - "startPrefetchThumbnails", - "_isEventInContentView:", - "elementAt:", - "masterTemplateHasChanged:", - "performFindPanelAction:forClient:", - "_initWithCGEvent:eventRef:", - "_resizeDeltaFromPoint:toEvent:", - "nts_PopulateWithDictionary:includeCoreProperties:addressBook:", - "returnDisconnectedBindingsOfObject:", - "_recursiveEnsureSubviewNextKeyViewsAreSubviewsOf:", - "setValueWraps:", - "initWithNodeClass:", - "setDeadKeyProcessingEnabled:", - "URLWithString:relativeToURL:", - "getMaximumAscender:minimumDescender:", - "_lastKeyView", - "_removeProperty:", - "setIsRuleGrouping:", - "enforceParameter:interpolatedValue:", - NULL, - "_dynamicToolTipManagerClass", - "portClassFromParameterInfo:", - "setSyncState:keychain:", - "installGRLPerformCallbacks", - "isReferenceToReferenceFile", - "addItemWithRecentPicture:", - NULL, - "bindTextureToContext:textureUnit:applyMatrix:savedState:", - "setCalculationMode:", - "invalidateCachedDrawingImage", - "_suspendLoading", - "_startLiveResizeCacheOK:", - "wrapperWithValue:", - "_removeObserver:forProperty:", - "subpaths", - "setRelationshipKeyPathsForPrefetching:", - "initWithView:className:", - "_updateURLsToCache", - "_coreUIDrawTab:withState:inRect:", - "familyName", - "menuFontOfSize:", - "_fixHeaderAndCornerViews", - "allBundles:", - "updateGroups", - "relatedIDsForKey:", - NULL, - "insertContainerBreak:", - "_modelAndProxyKeys", - "gotoPreviousSelectionPoint:", - "_expandRep:expandImageContentNow:", - "expressionForVariable:", - "removeObjectForKey:", - "setNestingMode:", - NULL, - "importVisibleCellsProgress", - "_parseCharacterAttributes", - NULL, - "inputBottomLineParams", - "_finalizeStatement", - "layerAtLocation:", - "setURLs:currentIndex:preservingDisplayState:", - "image", - "hasBackingStore", - "_suggestGuessesForWord:inLanguage:", - "_menuFormRepresentationChanged", - "balance", - "graphViewClass", - "windowWillReturnUndoManager:", - "abWords", - "_keyListForKeyNode:", - "_blockRowRangeForGlyphRange:", - "textBlocks", - "principalClass", - "nonSelectedColor", - "_invalidateLayoutForExtendedCharacterRange:isSoft:", - "maxValueForControlType:keyFrame:", - NULL, - NULL, - "_setCtrlAltForHelpDesired:", - "searchElement", - "orderFrontRegardless", - "_updateForEditedMovie:", - "_surfaceNeedsUpdate:", - "becomeMainWindow", - "indexOfMipmapItem:", - "newGroup:", - "pixelFormatRGBA16", - "connectionWithRegisteredName:host:usingNameServer:", - "_createCGImage:format:colorSpace:matrix:bounds:", - "calculateRowsAndColumnsForBlankSize:frameSize:", - "_validSize:force:", - NULL, - "documentPreviewViewForPreview:forView:forcedPreviewType:", - "preprocessorColor", - "_attributesAreEqualToAttributesInAttributedString:", - "processKeyword:option:keyTran:arg:argTran:quotedArg:", - "_allowedTypesFromSavePanelType", - "keyboardFocusIndicatorColor", - "_dataSource", - "closeWindowForPerson:", - "_usingToolbarShowHideWeightingOptimization", - "setTypingAttributes:", - "initWithLayer:", - "runSlideshowWithDataSource:inMode:options:", - "addMember:", - "conjoinedElementForProperties:value:withComparison:", - "stringColor", - "removeSubgroup:", - "_crackPoint:", - "removeFromContext:", - "_printSession", - "croppedImage", - "_pkinitServerAuthUsage", - "searchScopeDisplayName", - "_setCertAuthorityCertSigning:", - "setCaption:", - "pathForImageResource:", - "_hasDarkShadow", - "selectionForRect:", - "setNeedsResyncWithDefaultVoice:", - "truncationMode", - "drawSpellingUnderlineForGlyphRange:spellingState:inGlyphRange:lineFragmentRect:lineFragmentGlyphRange:containerOrigin:", - "_setSinglePage:", - NULL, - "_bulletCharacter", - "conversationIdentifier", - "itemsForSearchString:withPartialResults:", - NULL, - "primaryKeys", - "sharedImageEditView", - "_setHighlightedRowsFromNodes:maintainFirstVisibleRow:", - "_enlargeVertically:", - "_keyboardUIActionForEvent:", - NULL, - "sortSubviewsUsingFunction:context:", - "removeTimer:forMode:", - "isFloatingPanel", - "contentSizeOfGrid:", - "_sendQueuedAction", - "setInformativeText:", - "suffix", - "_commonInitState", - "setDragHighlight:", - "_unregisterWindowNotifications", - "accessibilityDecodeOverriddenAttributes:", - "recentMenu", - NULL, - "alignCenter:", - "URLFromPasteboard:", - "setScope:", - "commit", - NULL, - "mediaDataReferenceEnumerator", - "_handleKeyUp:inNode:", - "cacheDisplayInRect:toBitmapImageRep:", - "_defaultTableHeaderReverseSortImage", - NULL, - "memberOfInputBottomLineParams:", - "updateTableColumnDataCell:forDisplayAtIndex:", - "setDisplaysWhenScreenProfileChanges:", - NULL, - "CI_affineTransform", - "positionOfGlyph:forLongCharacter:struckOverRect:", - "initWithStream:", - "clearFilterCache", - NULL, - "predicateName", - "initWithRegistryClass:andObjectClass:", - "_provideAllPromisedData:", - "_stopCacheTimeOutTimerIfNeeded", - "fileNameExtensionWasHiddenInLastRunSavePanel", - "_gradientImage", - "setDocumentView:", - "_selectableToolbarViews", - "initWithUIController:group:", - "selectNext:", - "containsTimer:forMode:", - "netServiceBrowser:didNotSearch:", - "copyIcon", - "languageChoices", - "initWithController:dataSource:", - "_singleValueForKey:", - "slideshowPlayStopped:", - "_doBidiProcessing", - "createCGImage:format:", - "_grestore", - "convertPointToBase:", - "serverFieldValue", - "activateIgnoringOtherApps:", - NULL, - "updateGrids", - "endDocument", - "_addKeyPathsFromPredicate:toSet:", - "_certificates", - "instantiateNibWithExternalNameTable:", - "glyphRangeForBoundingRect:inTextContainer:", - "glyphIndexForCharacterAtIndex:", - "_adjustSubviewsIfNecessary", - "nts_shouldUpdateDateRelatedSmartGroups", - "initWithObservedNode:", - "ISS__ay_performSelector:inThread:beforeDate:", - "_captureVisibleIntoImageCache", - "getNewIDForObject:", - "supportedPreviewTypes", - "performClick:", - "download:didReceiveAuthenticationChallenge:", - "containerSize", - "defaultsDictionary", - "_displaySomeWindowsIfNeeded:", - NULL, - "setAllowsDragging:", - "_registerToolbarInstance:", - "runModalPageLayoutWithPrintInfo:delegate:didRunSelector:contextInfo:", - NULL, - "evaluateWithObject:", - "_recursiveOrderOutSurfacesForHiddenViews", - "_applyAttributes:", - "_lightGrayRGBColor", - "maxTimeForControlType:keyFrame:inTimeLine:", - "isMakeHistoryEnabled", - "committedValuesForKeys:", - "setUsesArrowStyle:", - "_ignoringScrolling", - "valueWithPointer:", - "setDisplaysMarkupAnnotations:", - "isEditable", - "_createTextureBufferFromImageBuffer:target:bounds:needsClipping:flippedState:options:", - "_proceedGivenDBInfo:", - "extractSearchableAttributesFromResource:", - NULL, - "canCycle", - "drawAtPoint:inContext:", - "colorWithCalibratedHue:saturation:brightness:alpha:", - "_validateStrikethrough:", - "setReturnValue:", - "_setTopLevelObjects:", - "setShadowOpacity:", - "_setPreviousToolbarSizeAndDisplayMode:", - "_freeRef:", - "addFileWrapper:", - "_shortNameFor:", - "stringByReplacingOccurrencesOfString:withString:options:range:", - "_choosePart:", - "selector", - "persistenceStore", - "imageBrowser:getFreeFormLayoutAtIndex:position:scaleFactor:", - "writeToFile:ofType:", - "valueForKey:", - "_fullCacheUpdate", - "setQueuePriority:", - "_contextAuxiliary", - "activeSegment", - "saveConfigurationUsingName:", - "unsetOnOpenGLContext:", - "isSymbolicLink", - "supportedWindowDepths", - "configureForAllowsExpandingMultipleDirectories:", - "cancelPerformSelectorsWithTarget:", - "imageView", - "setModel:", - "_updateTooltip", - "aliasesByName", - "addStateGRL:", - "_resetDragMargins", - NULL, - "fulfillFault:withContext:", - NULL, - "_createLayerTreeRenderer", - "createAndCacheRowHeightSumsIfNecessary", - "setAllowsImageEditing:", - NULL, - "numberOfVisibleCols", - "editSelectedGroupWithUndo:", - "_makeAllCollectionsNonEditable", - "_initFlippableViewCacheLock", - "addActionToDictionaryRef:", - "_fileModificationDate", - "_cflastIndexOfObject:inRange:", - NULL, - "updateExtensions", - "attributesAtPath:traverseLink:", - "canSelectNext", - "_keyViewFollowingModalButtons", - "cgColor", - "applyAuthToRequest:", - "getThumbnail:", - "writeAlignedDataSize:", - "documentPreviewURL", - "getWhitePointVectorsR:g:b:", - "valueForKeyFrame:controlType:inTimeLine:", - "_disableEnablingKeyEquivalentForDefaultButtonCell", - "setPropertyMappings:", - "_cf2nsCookies:", - "_lockForReading", - NULL, - "_smallestEncodingInCFStringEncoding", - "objectWithUID:withResolution:withKey:", - "requestStreamForTransmission", - "accessibilitySelectedTextAttribute", - "isOneway", - "setOnMouseExited:", - NULL, - "_setMenuName:", - "_aquaScrollerVariantChanged:", - "trackingMode", - "_binderWithClass:withBinders:createAutoreleasedInstanceIfNotFound:", - "sendCancelToOwner", - "_calcScrollArrowHeight", - "startFreeTemporaryCache", - "_displayedView", - "setSeed:", - "_removeFromGroups:", - "isLinearX0:y0:x1:y1:x2:y2:", - "isDRMAuthorized", - "setDataCell:", - "sharedHeartBeat", - "_zeroPinnedResizeColumnsBySharingDelta:lastSharingColumn:resizeInfo:", - "_coreUISize:", - "multiStatusRequestWithURL:method:responseClass:", - "_sizeHorizontallyToFit", - "_beginSrcDragItemWithEvent:", - "togglePageMembershipInSelectedPages:drawNow:", - "layoutRectForTextBlock:glyphRange:", - "postOperation", - NULL, - "_setSound:", - "setMenuItemIndex:", - "_underlineStyleForArgument:", - "_sharedDateFormatter", - "setBitmap:rowBytes:bounds:format:", - "_dataFromBase64String:", - "removePersistentStore:error:", - "_keySegment", - NULL, - "changedValues", - "versionString", - "keyAtIndex:", - "_addCurrentDirectoryToRecentPlaces", - NULL, - "_imageRepsWithContentsOfFile:expandImageContentNow:", - "imageBrowserSelectionDidChange:", - "targetForAction:", - "itemTitleAtIndex:", - "positivePrefix", - "selectionShouldChangeInTableView:", - "viewForName:", - "_contentsOfHTMLData:encoding:strippingTagsSeparatedByString:", - "_validateCarbonCatalogInfo", - "_stopObservingSelectionIfNecessary", - "rotationAngle", - "nextPK64", - "_calibratedColorOK", - "setResourcePool:", - "_rawKeyEquivalent", - "delete:", - "requestIsCacheEquivalent:toRequest:", - NULL, - "playerViewWithFrame:forRepresentationInstance:forCell:", - "previewRange", - "_allowAnimated_setFrameCenterRotation:", - "setShowsFullscreenButton:", - "insertItem:atIndex:", - "initWithGlyphIndex:characterRange:", - "setMaximumFrameRate:", - "_providerThread:", - "blueControlTintColor", - "usedSpace", - "validateVisibleColumns", - "setMinimumSignificantDigits:", - NULL, - "ISS_classicPortForScheme:", - "deserializeIntAtIndex:", - "_setFontPanel:", - "rowHeightForRow:", - "waitForDataInBackgroundAndNotifyForModes:", - "_contentToFrameMaxXWidth", - "_rulerline::last:", - "updateColorOptionsUI", - "_type", - "pdfView", - "setImage:imageProperties:", - "_blockRowRangeForCharRange:", - "keyBackPointer", - "currentDirectory", - "expired", - "_setResourceForkReferenceNumber:", - "_addToGroups:ordered:", - "initWithImage:options:", - "lockDirectoryPath", - "urlAddresses", - NULL, - "_resetDisableCounts", - "_keyEquivalentVirtualKeyCode", - "attributedCertificateName:showsIssuer:selected:prefix:", - "setRows:", - "_drawOverlayRectSet:", - "_goneMultiThreaded", - "theaterStatus", - "localizedNameForFilterName:", - "drawAtPoint:withAttributes:", - "_clearPressedButtons", - "setInkListFromArray:", - "pageDownAndModifySelection:", - "controlFromPoint:", - "addressBookDatabaseFile", - "initWithProperty:withPopup:", - "setUserSpaceScaleFactor:", - "_popURLToCacheWithRequestIndex:", - "getPath", - "animationForKeyPath:", - "_makeTable:inNode:", - "firstName", - "dateWithTimeIntervalSince1970:", - NULL, - "isDownloading", - "setCursorForAreaOfInterest:", - "instantiateNodeWithName:", - "_adjustMinContentSizeForMinFrameSize:", - "takeStoredValuesFromDictionary:", - "_willPowerOff", - "setShowsHelp:", - "abArrayCombinedWithArray:", - "IKIPFrame:constrainedToScreen:", - "setFrameCount:", - "indentationMarkerFollowsCell", - "menuForEventDelegate:", - "addFilterToRegistry:properties:", - "runLoopModesForAnimating", - "_focusRingCGColor", - "_iLifeMediaBrowserFrameworkInstalled", - "setAttributeType:", - "saveGraphicsState", - "__delete:context:", - "setDraggingSourceOperationMask:forLocal:", - "setFlavor:", - "setSelectionFromDroppedNode:selectionHelper:", - "_isSidebarCollapsed", - "baseWindowWillClose:", - "vendorPointerType", - "locationForSubmenu:", - "destroyContext", - "initWithFilter:connectionID:", - "parseContentsOfURL:", - "attachToAudioMixerNode:element:scope:isReadOnly:", - "setBoundsRotation:", - "_performDragForSlice:withEvent:", - NULL, - "initWithIndex:parent:", - "indexOfItemContainingDataSource:inArray:arrayIsIndexed:newIndexIs:uidToIndexCache:", - "_distributeAvailableSpaceIfNecessary:toFlexibleSizedItems:lastItemIsRightAligned:", - "addAnnotationControl:", - "activateNextAnnotation:", - "resizeComponents", - "isEditingAtIndex:withObject:", - "startRunning", - "controlPointsCount", - "titleRect", - "writeToFile:error:", - "canInsert", - NULL, - "dockTile", - NULL, - "_isImageCache", - "_getInputRampParams", - "toggleRuler:", - "_outlineAction:", - "_forcesLeadingZeroes", - "currentDestination", - "pixelFormatRGBh", - "addFullScreenButton", - "setIsActive:", - "_setArrowsConfig:", - "parentCrayonView", - "_restoreValidation", - "waitWithTimeout:", - "fetchRequest", - "roughSizeEstimate", - "_getFSSpecForPath:", - "_topHandling", - "selectedSubrows", - NULL, - NULL, - NULL, - "_scriptingRealDescriptor", - "IKNSImageAdditionalPossibleExtensions", - "initWithGroup:person:properties:addressBook:", - "_addManyToManysToDatabaseOp:", - "newPrimaryKeyInitializeStatementForEntity:withInitialMaxPK:", - "_inlineSlideshowGoToNextItem:", - "registerPort:name:nameServerPortNumber:", - NULL, - NULL, - "indexCarbonMenu:resultGRLs:isRootMenu:systemHelpMenu:", - "decodeDownloadHeader:headerLength:modificationTime:filename:", - "readDataToEndOfFile", - "setSpeechChannelWithVoiceCreator:voiceID:", - "_stopAnimationWithWait:", - "animateCompositionsIfNeeded", - "compoundPredicateType", - "setPopup:", - "differenceParameter:new:old:into:", - NULL, - "isWellFormed", - NULL, - "setEnableTextHighlightDrawing:", - "_tryDrop:dropRow:dropOperation:", - "_initWithProperties:defaultSubcontainerAttributeKey:inverseRelationshipKeys:", - "fieldsIncludedAreCleared", - "_quotesForRange:useGermanApostrophes:useDutchApostrophes:", - "doPass:sums:", - "_scriptingShouldCheckObjectIndexes", - "ruleEditorSizeChangedForSearchController:", - "menuRepresentation", - "selectKeyViewFollowingView:", - "_count", - "rulerView:willSetClientView:", - "cellLabel", - "panel:willExpand:", - "setFormatString:", - "ejectButtonFrameForCellFrame:", - "_readVersion0:", - "performActionWithHighlightingForItemAtIndex:", - "removeListEnabled", - NULL, - "_maxRuleAreaRect", - "notificationPort", - "glyphGenerator", - "refreshDisplayedCard", - "_getFSRefForPath:", - NULL, - "_sheet:didEndWithResult:contextInfo:", - "_pathsForResourcesOfType:inDirectory:forRegion:", - NULL, - "setQueueLimit:", - "setEntityName:", - "_messageStringForType:", - "removePasswordView", - "updateChildNodesForKeyPath:", - "_adjustLineScroll", - "ab_smallestTimeIntervalAroundTodayYearLess", - "_isVisibleUsingCache:", - "_predicateRestrictingToSubentitiesForEntity:", - "sourceDimensions", - "_globalWindowNum", - "setDataLength:", - "_widthOfColumn:", - "_dictionaryForSavedConfiguration", - "_setFaultHandler:", - NULL, - "nts_ImportFromMetaKitDatabaseAtPath:andSave:", - NULL, - "setPlaysSelectionOnly:", - "patchIsInMacro:", - "descriptionWithCalendarFormat:locale:", - "_fileControlCallbackTimeout:", - NULL, - "propertyListFromInputValues", - "baseAddressForSkippedRows:skippedPixels:", - "fileAttributesToWriteToURL:ofType:forSaveOperation:originalContentsURL:error:", - "setAutosizesAndCenters:", - NULL, - "setMinimumFractionDigits:", - "setFields:", - "MD5", - "_removePersistentStore:", - "standardUserDefaults", - "loadCIImageWithName:", - "previewBounds", - "canMixDynamicAndStaticContent", - NULL, - "setHeaderLevel:", - "ISS__ay_postNotificationName:object:userInfo:inThread:", - NULL, - "abGlobalMailRecentAPIUnlockInFile:line:", - "screenRect", - "_indexOfItemWithPartialTitle:", - "systemFontSize", - "_containerRelativeFrameOfColumn:", - "protectionSpace", - "initWithSourcePath:andLocalDestination:", - "nts_imageNameForPerson", - "setShouldCloseWithWindow:", - "verticalAlignment", - "insertRow:", - "nodeActorForNode:", - "initWithDouble:", - "_setImageNumber:", - "setImportFactor:", - "hasControls", - "initWithSelector:", - "defaultRecentPictureWithImageWrapper:cropSize:", - "initWithFilter:options::", - "_handleHelpURL:", - "_initForURL:withContentsOfURL:ofType:error:", - "_windowDidHideToolbar", - "_deviceClosePath", - "_countByEnumeratingWithState:objects:count:forKeys:", - "_accessibilityPerformClickAction:", - "abGlobalAPIUnlockInFile:line:", - "hide:", - "movieUnfilteredPasteboardTypes", - "_openDialog:file:", - "replaceHeaderView", - "_needToPrefetchMipmap:", - "initWithBindingTarget:", - "_loopHit:row:col:", - "accessibilitySetFocusedAttribute:", - "dataRepresentationOfType:", - "_singleValueForKeyPath:", - "allowsReverseTransformation", - "appendWhereClauseToSQL", - "setConjunction:", - "initWithController:retainController:key:valueTransformer:binding:", - "qdCreatePortForWindow:", - "_informAffectedStoresOfInterestByChildContext:inObjectsWithObjectIDs:withSelector:", - "setGroupsByEvent:", - "_trashContainsOrIs:", - "_updateButtonState", - "stopListening", - "setStartSubelementIdentifier:", - "initWithKey:", - "collatorWithName:", - "_DAVUnlock", - NULL, - "_copyMetadataFromStore:toStore:migrationManager:", - "initWithOwner:mediaType:formatDescription:attributes:", - "_keyEquivalentGlyphWidth", - "propertyList:isValidForFormat:", - "imageUnfilteredTypes", - "shouldShowEffects", - "windowDidResignKeyNotification:", - "selectToMark:", - "_setUpdated:", - "subentityColumn", - "computeHighlight", - "initWithPerson:model:", - "startPlay", - NULL, - "findBundleResources:callingMethod:directory:languages:name:types:limit:", - "initWithShadow:", - "_newSortingLastName", - "_changeSizeStyle:", - "totalSpace", - "addImage:forDuration:atTime:withAttributes:", - "_initWithfeImage:", - NULL, - "dateWithDate:", - "pixelSamples", - "actionMenuFilter:", - "_atEndOfTextTableRow:atIndex:", - "_registerOrCollectSuiteDescription:", - "passes", - "_addDragTypesTo:", - "_buildUIDtoIndexCache:", - "setCacheHint:", - "_invalidateObjectValue", - "setupKeyboardNavigation:", - "transitionFrame", - "dateFormat", - "timeZoneNames", - "_revertAlertSheet:wasPresentedWithResult:inContext:", - "viewWillResetCursorRects", - "_setMenu:", - "_realStoreTypeForStoreWithType:URL:error:", - "nts_TracksModification", - "_setAvoidsActivation:", - "setZeroSymbol:", - "_updateUbertrustPopupValues:", - "unregisterServiceProviderNamed:", - NULL, - "_setControlView:", - "setUserAgent:", - "processElement:", - "setMinificationFilter:", - "_childrenByUniqueName", - "replaceNodeWithIdentifier:withDataFromDelegate:", - "rawValue", - "initWithRed:green:blue:alpha:", - "isByref", - "writeToURL:ofType:forSaveOperation:originalContentsURL:error:", - "certificateSheetDidEnd:returnCode:contextInfo:", - "setTitlePosition:", - "shadowMapCoordinatesForStrip", - "registerName:", - "bufferPixelFormat", - "_initializeRegisteredDefaults", - "setFrameSize:", - NULL, - "initializeDataSource:", - "initWithCString:noCopy:", - "setChildSpecifier:", - "initWithOperatorType:modifier:negate:", - "windowWillMiniaturize:", - "tokenField:completionsForSubstring:indexOfToken:", - "isLinear", - "inputExtent", - "_toolbarItemCommonInit", - NULL, - "_addMarker:", - NULL, - "toValue", - "setFilterTypes:orUTIs:", - "_focusOnCache:", - "defaultButtonCell", - "selectedUTType", - "installCGOverlay:", - "_currentPageBounds", - "_drawRowHeaderBackgroundInRect:", - "_putCellNoUpdate:atRow:column:", - "setLastNameNormalized:", - "selectWithFrame:inView:editor:delegate:start:length:", - "indexReferenceModelObjectArray", - "_executeSave:didCommitSuccessfully:actionSender:", - NULL, - "_localClassNameForClass", - "initWithNamespace:", - "_usesSourceListColors", - "components:fromDate:toDate:options:", - "hasUndoManager", - "scanDouble:", - "_updateInvalidatedObjectValue:", - "_visibleName", - "_getGaugeFrame", - "_titleCellHeight", - "_setFont:", - NULL, - NULL, - "tableView:portForRow:", - "prefetchDataForRecords:", - "composite:into:", - "_excludeObject:fromPropertyWithKey:andIndex:", - "movie:linkToURL:", - "_drawThemeProgressArea:", - "updateFontPanel", - "initWithFrame:delegate:", - "initForDeserializerStream:", - "setStringColor:", - "_willPresentCreationError:", - "hasDuration", - "initWithFunc:ivarOffset:", - "_adjustToMode", - "_backgroundColors", - "bestLocationRep:matchesBestLocationRep:", - "_show:", - "deleteTextureInCurrentContext", - "setBackgroundWindowLevel:", - "setMovieBeingSet:", - "initWithResource:withParent:", - "glyphRange", - "setShowsCheckerboard:", - "_cgColor", - "_originalNextKeyView", - "preferredExtensionForMIMEType:", - "_createSubfields", - "setSpeed:", - "convertRectFromBase:", - "standardRecordTypes", - "readData:length:", - "_minXTitlebarDragWidth", - "_eventInTitlebar:", - "setDescription:", - "_renderingBounds", - "done", - "saveFilter:", - "setAttribute:", - "centerImage", - "windowRegion", - "descriptionInStringsFileFormat", - "hasCardWithEmail:", - "newDeleteStatementWithRow:", - "animatedCells", - "requestExpression", - "freeRect:", - "collapsesBorders", - "valueWithQTTime:", - "endDisplayNoComplete", - "supportedTextureBufferFormatsForFormat:", - "loops", - "_currentAttachmentIndex", - "boolValue", - "_viewSurfaceDidComeBack:", - "_web_createIntermediateDirectoriesForPath_nowarn:attributes:", - "setWords:", - "_getUUID", - "internalSaveTo:removeBackup:errorHandler:temp:backup:", - NULL, - "maximumFrameRate", - "_configFileCommonNameAndSerialNumber:", - "enumeratorOfInputWhiteParams", - "embedded", - "_setSelectorName:", - "isSafe", - "setBottomMargin:", - "month", - "createsSortDescriptor", - "isRootEntity", - "mouseUp:", - NULL, - "deepNodeCopy:", - "miniaturizeAll:", - "initWithFile:options:", - "attributesForInputPort:nodeIdentifier:", - "parsePhoto:", - NULL, - "_shouldShowFocusRingInView:", - NULL, - "gridColor", - NULL, - "reversedSortDescriptor", - "_tryState:interactive:", - "compositionOutputs", - "appendSubThumbnail:", - "rulerView:willAddMarker:atLocation:", - "setContactIndex:", - "automaticRearrangementKeyPaths", - "initIndex:", - NULL, - "coreUIDrawOptions", - "setFrameAutosaveName:", - NULL, - "_propFindRequestPostHandler:", - "_setAppleEventHandling:", - "stringByConvertingHTMLEntities", - NULL, - "addBorderStyleToDictionaryRef:", - "selectedQCIdentifier", - "mouseTracker:shouldStartTrackingWithEvent:", - "invalidateAllItemsLayout", - "filter:setValue:forKey:", - NULL, - NULL, - "cookieAcceptPolicy", - "_expandJustEnoughToLoadRepProperties", - NULL, - "_isLockingFocus", - "_createSaveButtonIfRequired", - "_getWindowCache:add:", - "_placeAccessoryView", - "_unpackTextInputEventRef:", - "_openableFileExtensions", - "_scriptingAddToReceiversArray:", - "URLWithString:", - "truncationString", - "splitterTrackingRect", - "setHidesOutlineColumn:", - "drain", - "_doPositionDrawer", - "updateRuler", - "hostWithName:", - "controlColor", - "CAJS_scheduledTimerWithTimeInterval:function:repeats:", - "itemHasDiskCache:", - "_hasgState", - "imagingModeForcedToSharedSurface", - "_cgImage", - "allowsToolTipsWhenApplicationIsInactive", - "_removePropertyNamed:", - "currentToolMode", - NULL, - "brightnessComponent", - NULL, - "stopModal", - NULL, - "_objectValue:forString:", - "tableRow:ofTableView:", - "initialPoint", - "isDaylightSavingTimeForTimeInterval:", - "setCancelButtonCell:", - "initWithContentsOfMappedFile:withFileAttributes:", - "elementWithRole:subrole:parent:", - "step:", - "replaceObjectAtIndex:withObject:", - "titlesForItem:", - NULL, - "propertyLineForGenericABProperty21:vCardProperty:", - "accessibilityStyleRangeForCharacterIndex:", - "setCompletes:", - "_printer", - "setSaveFileName:", - "outlineRoot", - "generatePropertyName:", - "_configureIntegrityCheck", - "setStartSubelementIndex:", - "_addSubview:", - "members:notFoundMarker:", - "_delegateSupportsEditing", - "parseHeader", - "currentValue", - "_setMultipleValue:forKeyPath:atIndex:", - "_minXminYResizeRect", - "setSelectedCompositionIndex:", - "filesystemItemLinkOperationWithSourcePath:destinationPath:", - "_middleIndexForCount:", - "IKDVGrabberUpdated:", - NULL, - "_initWithBytesOfUnknownEncoding:length:copy:usedEncoding:", - "alertDidEnd:returnCode:contextInfo:", - "setExifOrientation:", - "_performClickOnSlice:withEvent:", - "_hideChildren", - "authorize:", - "_visibleRows", - "_maxCachedThumbnails", - "selectedRow", - "setAbstract:", - "filterWithName:compatibilityVersion:keysAndValues:", - "bitmapData", - "_toolbarCommonBeginInit", - "controlsController", - "setCacheDepthMatchesImageDepth:", - "_contentToFrameMaxYHeight", - "destinationAttributeName", - "dictionaryWithObject:forKey:", - "loopsBackAndForth", - "currentSize", - "sendWireCountForWireID:port:", - "imageWithData:bytesPerRow:size:format:options:", - "relockResourceAtPath:withDuration:", - "_configureSavePane", - "movieWithData:error:", - "pixelFormat422YpCbCr8_601", - "writePath:docInfo:errorHandler:remapContents:markBusy:hardLinkPath:", - "_stopObservingUndoManagerNotifications", - NULL, - NULL, - "invalidateFocusPoint", - "_old_drawImage:withFrame:inView:", - "nextSearchStringForNewValue:", - "attributedStringForObjectValue:withDefaultAttributes:", - "supermenu", - "sendString:", - NULL, - "currentReplyAppleEvent", - "publicRecordWithUniqueId:inAddressBook:", - "displayedMembersSubrows", - "initWithAppleEventCode:value:isHidden:presentableDescription:name:", - "_drawOrientedLabel:inRect:", - "addAnnotation:", - "readFromFile:", - "_supportsGetValueWithUniqueIDForKey:perhapsByOverridingClass:", - "createContext", - "alternateImageForSegment:", - "trustPolicies", - "_nonNilSetValueWithSelector:", - "synchronize", - "_parseNode:", - "areCursorRectsEnabled", - "dataSourceDidChange", - NULL, - "updateFrame", - "insertGlyphs:length:forStartingGlyphAtIndex:characterIndex:", - "_aboveContentBox", - "_resetClickedRowAndColumn", - "_ascenderDeltaForBehavior:", - "_getBlockStart:end:contentsEnd:forRange:stopAtLineSeparators:", - "_portsFromList:withSetFlags:unsetFlags:", - "pasteFont:", - "_firstMoveableItemIndex", - "setSwitchedToIndexMode:", - "displaysAnnotations", - "_auxiliaryStorage", - "writeRTFDToFile:atomically:", - NULL, - "updatedPeople", - "addListener:", - "allowsImageEditing", - "_getNextResizeEventInvalidatingLiveResizeCacheIfNecessary:", - "setLastFileListMode:", - "ikSetNeedsDisplayInRect:", - NULL, - "test", - "matches:", - "_tabRect", - "_descriptionForNode:", - "barRequest:", - "temporaryItem", - "_allowTabbingIntoCells", - "commonISOCurrencyCodes", - "timeZoneDetail", - "connectionForProxy", - "company", - "handleButtonHit:", - "previewPanel:willLoadPreviewForDocumentURL:", - "accessibilityIsNumberOfCharactersAttributeSettable", - "languageWithName:", - "_didMountDeviceAtPath:", - "cachedChildren", - "setSecond:", - "lockFocus", - "columnAutoresizingStyle", - "createNSImageForManager:withOptions:", - "_setReceiveHandlerRef:", - "currentDocumentURL", - NULL, - "textUnfilteredFileTypes", - NULL, - "itemAtIndex:", - "_frameRectForIndexInGrid:gridSize:", - "layout", - NULL, - "flipsIfNeeded", - "sharedPreviewView:didStopSharingWithPreviewPanel:", - "directoryContentsAtURL:andReturnResultCode:", - "_preferredPlaceholderForMarker:onlyIfNotExplicitlySet:", - "SCTPerformDelayedSelector:", - "_ignoringChangeNotifications", - "_objectTypeDescriptionForClassAppleEventCode:isValid:", - "setSearchValue:", - "pushSubnodeForEditing:", - "bodyForContact:", - "_selectItem:atIndex:", - "lazyBrowserCell", - "_blockRowRangeForGlyphRange:completeRows:", - "_startSound", - NULL, - "_resumeLayerTreeRenderingForWindowOrderIn:", - "fetchPublicRecordsForClass:withPredicate:addressBook:", - "_testLayoutTree", - "colorWithAlphaComponent:", - "deserializeListItemIn:at:length:", - "layerSuperview", - "colorWithKey:", - "_controlView:textView:doCommandBySelector:", - "_fixCommandAlphaShifts", - "_resumeIfNotTopHandling:withScriptCommandResult:", - "navView", - "_createClipIndicatorIfNecessary", - "thumbnailToRightOfPoint:", - "editorDidBeginEditing:", - NULL, - "_removeProxyPasswordForProxyURL:", - "_cleanupMenuMaps", - "_setTableCells", - "_accessibilityMaxValue", - "jobTitleFieldPresent", - "setMinimum:", - NULL, - "createCGLayerWithSize:info:", - "filterName", - "isEntityUsable:", - NULL, - "initWithArchive:options:", - "portKey", - "_scriptIsYesForKey:default:", - "isNSDate__", - "insertValue:atIndex:inPropertyWithKey:", - "blurVerticalPass3ROI:destRect:", - NULL, - "mouseDownLocation", - "warningValue", - NULL, - "_removeRangeInArrayAtIndex:", - "currentDocument", - "_computeCommonItemViewers", - "_resetCursorRects", - "retainedCompressionSessionOptions", - "initWithData:isSingleDTDNode:options:error:", - "_fileWriterUnitElementForConnection:", - "_isFlattened", - "compareObjectValue:toObjectValue:", - "_addDependentValueKey:", - NULL, - "selectsInsertedObjects", - "vendorID", - "_avoidsActivation", - "browser:didClickOnDisabledCell:atRow:column:", - NULL, - "allowedInputSourceLocales", - "_loadRecentSearchList", - "formIntersectionWithCharacterSet:", - "_writeURLStringInRange:toPasteboard:", - "_dragImageForCell:withEvent:offset:", - "setVersionIdentifiers:", - "rowAtIndex:", - "_withinDate", - "objcClassName", - "initWithExtent:format:", - "ISS__ay_performSelector:withObject:withObject:inThread:beforeDate:", - "_cacheTransientStateOfObject:", - "_setPaperSize:inPrintSession:pageFormat:", - "_canSaveGraphRootedAtObject:intoStore:givenOthers:", - "_invalidateNumberOfRowsCache", - "download:didReceiveResponse:", - "accessibilityRangeForLineAttributeForParameter:", - "moveIndexAtTop:", - "highlightSelectedItem:", - "_groupCellAttributesWithDefaults:highlighted:", - "_scriptingMightHandleCommand:", - NULL, - "addDescription:forSubelementName:", - "_setDefaultButtonCell:", - "_allowsDisplayMode:", - "_setState:", - NULL, - "match:strokeColor:fillColor:mode:lineWidth:", - NULL, - "enableUndoRegistration", - "setEdge:", - "setFocusStack:", - "updateControlButtonsForOutlineViewSelection", - "renderBezelGroupWithPoints:count:radius:strokeColor:fillColor:lineWidth:", - "mapIntoVRAM", - "_physicalSizeCompare:", - "setAllowsUndo:", - "rangesContainLocation:", - "_drawBorderWithFrame:", - "thisIsACompany:", - "showsApplicationBadge", - "_alternateButtonTitle", - "openCustomLabelEditorForProperty:withPopup:", - "showAndShiftFocus", - "transformedValue:", - "second", - "finalWritePrintInfo", - "_forceSetView:", - NULL, - "completed:forType:", - "nts_StringForIndexing", - "defaultCredentialForProtectionSpace:", - "tableAction:", - "_initWithEntityMappings:", - "accessibilitySetVisibleCharacterRange:", - "addRect:", - "controller:didChangeToSelectionIndexes:", - "_accessibilityTreatButtonAsToolbarButton:", - "length", - "quartzFilterWithURL:", - "windowWillLoad", - "ensureLayoutForGlyphRange:", - NULL, - "coreUIRenderer", - NULL, - "getPropertyCSSValue:", - "initWithRTFDFileWrapper:", - NULL, - "showsShadowedText", - "applicationWillUpdate:", - "_recursiveDisableTrackingRectsForHiddenViews", - "setAltersStateOfSelectedItem:", - "thumbnailDidLoadNotification:", - "imageDataForPerson:", - "groupsController:outlineView:objectValueForTableColumn:byItem:", - "leftChild", - "_isReadOnlyIgnoresInert:", - "_gatherDataAndPerformMigration:", - "noteFirstLineParagraphStyle", - NULL, - "setReordering:", - "_setShowsAllDrawing:", - "simpleTraverseWithPathArray:pos:", - "completionsForPartialWordRange:indexOfSelectedItem:", - "updateGRLIndex", - "storedValueForKey:", - "_initWithPickers:", - "initWithSlideshow:dataSource:slideshowMode:options:", - "_updateLayerCompositingFilterFromView", - "displayableString", - "_old_initWithCoder_NSBrowser:", - "handleDelegateChangedCurrentDirectory", - "arrayWithCapacity:", - "settingsView:settingForKey:", - "_accessibilityViewCorrectedForFieldEditor:", - "imageBrowser:removeItemsAtIndexes:", - "listeners", - "setCachedChildren:forObservedNode:", - "downCaption", - "setDestination:allowOverwrite:", - "createRelationshipsForDestinationInstance:entityMapping:manager:error:", - NULL, - "setCanDRMInteractWithUser:", - "reallyInsertObject:atIndex:", - "_unsetFinalSlide", - "initWithImage:context:", - "_000103", - "encodeFloat:forKey:", - NULL, - "clearAllForRemoteLocation:", - "savePanel", - "statusCode", - "classDescriptionForKeyPath:", - NULL, - "fastIndexForKnownKey:", - "_deselectAll", - NULL, - "setImagingModeResetting:", - "previewPanel:shouldHandleEvent:", - "resizeBoundsForNote:inBounds:", - "flushPreferences", - "_lineFragmentDescription:", - "bindInRamMipmapItem:withUID:", - "preferredLocalizationsFromArray:", - "pointInConsumerOrderRect:inNode:bounds:", - "_nameAtIndex:", - "_insertKeyFrame:", - "imageByRenderingInRect:format:callback:data:options:", - "_itemVisibilityPriority", - "setText:", - "reallyRemoveFilter:", - NULL, - "_coreUIBezelDrawOptionsWithFrame:inView:", - "pixelFormat422YpCbCr8_709", - "rolloverCaption", - "initWithKey:appleEventCode:type:isOptional:isHidden:presentableDescription:name:", - "_engravedBoldActiveForegroundTextColor", - "extendSelectionAtStart:", - "_web_hasCaseInsensitivePrefix:", - "colorRenderingIntent", - "drawNote:inBounds:withColor:", - "_contents", - "setQuadPointsFromArray:", - "lockWhenCondition:", - "initWithCGSRegion:", - NULL, - "_setupButtonImageAndToolTips", - "draggingSourceOperationMaskForTableView:", - "_insertItemInSortedOrderWithTitle:action:keyEquivalent:", - "appendString:withFont:", - NULL, - "_mightHaveSpellingAttributes", - "numberWithLong:", - "_windowScreenDidChange:", - "_swapName", - "createProviderWithSource:options:", - "cleanupFind", - "setTracksModification:", - "_resizeContentsOfPreviewBox", - "_wiringNibConnections", - "_generateIdentifier", - "showInfoPanel:", - "_dataIndexFromRowIndex:", - "transparentBackground", - "_objectMatchesEntity:", - "faultingStatementForRelationship:", - "nextEventMatchingMask:untilDate:inMode:dequeue:", - "addRequestMode:", - "_keyCodeFromRecord:", - "_testWithComparisonOperator:object1:object2:", - NULL, - NULL, - NULL, - "_storeOrderedByFileProperty:orderedAscending:", - "drawSelectionAndOverlays", - "_addBindVarForConstId:ofType:inContext:", - "initWithObjectToken:node:", - "subcacheUsingFilteringFunction:userInfo:userInfoReleaseCallback:", - "createContextForCGImage:width:height:data:", - "_bestSettingWithBitsPerPixel:width:height:exactMatch:", - "shouldChangeTextInRanges:replacementStrings:", - "scrollColumnsRightBy:", - "view:customToolTip:drawInView:displayInfo:", - "newNode", - "setByAddingObjectsFromSet:", - "_hasWindowRef", - "_setNeedsDisplayInRectForLiveResize:", - "expandIndexPath:", - "numberOfItemsInImageFlow:", - "_userAgent", - "setType:creator:", - "_UTIMIMETypeForExtension:", - "_immediateScrollToPoint:", - "URL", - "afterEntityLookup", - "_makeEditable::::", - "_fileListModeControlCell", - "initWithString:locale:", - "pathComponentCellClass", - NULL, - "_updateSearchMenu", - "charValue", - "allocateSize:", - "blur:radius:", - "_orderOutAndCalcKeyWithCounter:", - "valueWithFont:range:", - "wantsPeriodicDraggingUpdates", - "treatsDirectoryAliasesAsDirectories", - "_doRemove", - "clearPastedImage", - "setCertificatesDisclosed:", - "updateWithFocusRing", - "removeObserver", - "addColor:forKey:toDictionaryRef:", - "duplicateWithClass:", - "indexLessThanOrEqualToIndex:", - "shouldDisplayControls", - "_finishShowAnimation", - "addFieldWithPopup:property:stringAttribute:endOfRange:", - "initWithValue:", - "setGridStyleMask:", - "_setPressedStateImage", - NULL, - NULL, - "_handleFileListSelectionChanged:", - NULL, - "updateLayout", - "gridWithCompositions:", - "yellowColor", - "_propertiesOfType:", - "_valueForKey:withInputs:exists:", - "_resolveHelpKeyForObject:", - "__setOrder:forConsumerSubpatch:", - "setWantsLayer:", - "setAffectedStores:", - "arrayWithObjects:count:", - "setCarbonDelegate:", - "displayNameForCollectionWithName:", - NULL, - "_tryUserMoveToParentNode", - "_setDefaultTargetAndActionOnView:", - "_generateSQLForSubqueryExpression:trailingKeypath:inContext:", - "currentPage", - "drawSheetBorderWithSize:", - "regularColorIfPossible:", - "classForClassName:", - "reportException:", - "_betweenDropFeedbackStyle", - "ivarInputPorts", - "_web_URLWithString:relativeToURL:", - "shapeWithRect:", - "_bindVariablesWithInsertedRow:", - "resourceDataUsingCache:", - "invTransform:", - "setAutorepeat:", - "setBottomColor:", - "initWithTextureName:releaseCallback:releaseInfo:context:format:target:flipped:colorSpace:options:", - "_accessibilityScreenRectForSegment:", - "_fastCharacterContents", - NULL, - "setPlaysEveryFrame:", - "_selectedRangesByTogglingRanges:withRanges:initialCharacterIndex:granularity:", - "cropInfo", - "freeImageCache", - "tableView:validateDrop:proposedRow:proposedDropOperation:", - "_fillSpellCheckerPopupButton:", - "switchPanes:", - "_typeSelectStringForIndex:", - "sharedUserDefaultsController", - "_graphiteKeyboardFocusColor", - "writeGlyphInfo:", - NULL, - "_batch_release", - "getNewMipmapsFromMipmapDB:", - "drawIrisClosedInRect:", - "setActiveSegment:", - "_isDocumentXMLStore:", - "setFrameOrigin:", - "_dispose", - "currentIndex", - "removeInput:", - "_backupEngaged:", - "isPrinting", - "setMnemonicLocation:", - "_setCertificateData:", - "_drawKeyViewOutline:", - "pixelFormat", - "changeAttributes:", - "setVariableSizeCacheLength:", - "outlineView:writeItems:toPasteboard:", - "mailRecents", - "removeAllToolTipsForView:", - "encodedLineForValue:", - NULL, - NULL, - "registerForCompletionOfDrag:", - "bookID", - "versionIdentifiers", - NULL, - "DPSContext", - "setPrimitiveCreationDateYear:", - "_isSynonym", - "serializeInts:count:", - "_orderFrontModalColorPanel", - "allPersonProperties", - "instantiateWithFile:", - "timeScale", - "readInt", - "setRowIndex:", - "_toolbarContentsAttributesChanged:", - "_setIsFirstItem:", - "initWithLong:", - "_orderOutHelpWindow", - "scrollByPage:", - "objectMechanismsRequiredForObject:", - "_hideAllScopeButtons", - "recordDescriptor", - "objectForInfoDictionaryKey:", - "parameter:differs:from:", - "enableNotifications", - "_menu", - "_setChannelMapping:error:", - "operationCanAbort", - "_isPaged", - "_drawRowHeaderSeparatorInClipRect:", - "_distinctUnionOfSetsForKeyPath:", - "splitView:effectiveRect:forDrawnRect:ofDividerAtIndex:", - "dataObject", - "isFullScreen", - NULL, - "frameRotation", - "_setApplicationID:", - "muted", - "sharedCameraServices", - "openWithApplication:", - NULL, - NULL, - "initWithType:leftExpression:rightExpression:", - NULL, - "rulerView:didMoveMarker:", - "togglePlatformInputSystem:", - "bilateralInitROI:destRect:userInfo:", - "animationValueForKey:forCell:", - "directoryQueryStatusChanged:", - "_rootEntity", - "_scrollLastColumnMaxXEdgeToVisible", - "repositionHUDWindow", - NULL, - NULL, - "_setDisplayState:updatePreviewView:", - "_mouseInTitleRect:", - "kerningShift", - "finalize", - "divide:by:", - "_typeDescriptionForName:suiteName:isValid:", - "_isFakeFixedPitch", - "enterExitEventWithType:location:modifierFlags:timestamp:windowNumber:context:eventNumber:trackingNumber:userData:", - "updateTrackingRect", - "_drawerHorizontalOpenOffset", - "_logObservingInfo", - "addAnImageWithPath:toArray:", - "flushWindowIfNeeded", - "alphanumericCharacterSet", - "_sourceListFont", - "_sizeVerticalyToFit", - "_containsSimilarValue:property:", - "_itemViewer", - "isColumnSelected:", - "setSelectionZoomRect:", - "canonicalXMLStringPreservingComments:", - "_processHeader", - "initWithContentsOfURL:error:", - NULL, - "_fadePopUpWindow", - "createConnection", - "_newWithName:fromPath:forDeviceType:", - "_smartTagForTag:", - "createTextureBufferFromImageBuffer:withFormat:target:transformation:bounds:colorSpace:options:", - NULL, - "_setOrderOutInProgress:", - NULL, - "directoryResults", - "life", - "didImport", - "_initReaderWithClass:", - "_setLayer:", - "lastUpdatedDefaultKey", - NULL, - "_hasOverriddenAwake", - "draggingLocation", - "_setFrameSize:", - NULL, - "setChanges:", - "initWithElementSize:capacity:", - "_validateDeclarationStrings:forKey:", - "_finalSlideLocation", - "deletionStatement", - NULL, - "sharedSystemTypesetter", - NULL, - "setFieldType:", - "setRepresentedObject:", - "movie:shouldContinueOperation:withPhase:atPercent:withAttributes:", - "initWithWeaksReferences:", - "_unobstructedVisibleRectOfColumn:", - NULL, - "soundUnfilteredFileTypes", - "dropLastComponent:", - "nts_SetIsModified:", - "handleEventInThread:", - "_setInputs:", - "_sendCarbonNotification", - "headerToolTip", - "_engravedMenuOffsetTextColor", - "_sendDelegateCanSelectRow:", - "browserZoom", - "fetchObjectsWithFetchRequest:error:", - NULL, - "_setParserError:", - "mipmapItems", - "_showField:", - "_assertValidStateWithSelector:", - "setVisualContext:forConnection:", - "_ikVisibleRect", - "_setTableFlags:", - "initWithSettings:showPrintPanel:sender:delegate:didPrintSelector:contextInfo:", - "fetchLimit", - NULL, - "effects", - "_drawTickMarks", - "completedString:", - "showPopup", - "_postSelectionIsChangingAndMark:", - "assign:key:value:isNew:", - "freeRAMCache", - "savePanelDidEnd:returnCode:contextInfo:", - NULL, - "_modelKeysTriggeringChangeNotificationsForDependentKey:", - "componentUpdateNotification:", - "underlineThickness", - "imageRepsWithPasteboard:", - "applicationOpenUntitledFile:", - "deleteReferencesToTrack:ofType:", - "newStandardItemWithItemIdentifier:", - "initWithDataRef:type:", - "imageBrowser:willMoveItemsAtIndexes:", - "_sliderAction:", - NULL, - NULL, - "_indexForMoveUp", - "_typesetter", - "initWithButton:", - "_doPreSaveAssignmentsForObjects:", - "setAllowsColumnReordering:", - "_scrollerEventForEvent:", - "cleanUpOperation", - "_readURLStringIntoRange:fromPasteboard:", - NULL, - "attachmentStringForEmailCertificate:", - "retainIndex:", - "leafItem", - "setContainerIsRangeContainerObject:", - NULL, - "_cfLowercase:", - NULL, - "preferredPasteboardTypeFromArray:restrictedToTypesFromArray:", - "initWithGlyphName:glyph:forFont:baseString:", - "_handleAppActivation:", - "recenterResolutionData:toX:andY:", - "nts_AddMembersAndSubgroupsFromDictionaryRepresentation:withRecordMapping:", - "_displayValueForKeyPath:", - "dataWithLength:", - "array", - "_setAttributedDictionaryClass:", - "_commandMethodSelectorsByName", - NULL, - NULL, - "_compatibleListShouldUseAlternateSelectedControlColor", - "contextWithCGLContext:pixelFormat:options:", - "acceptHelpResults:isLastBatch:", - "setVisualizePatchExecution:", - "registerImageRepClass:", - "loadFileWrapperRepresentation:ofType:", - "_setIChatSigningUsage:", - NULL, - "_removeActiveConnection:", - "_setIdentifiedItems:", - "serviceError:error:", - "_userSelectTextOfNextCell", - "_setIChatEncryptionUsage:", - "loadNibFile:externalNameTable:withZone:", - "addAddToiPhotoButton", - "_canHide", - "accessibilityIsSortDirectionAttributeSettable", - "_setTopRow:animate:", - "decodeDownloadData:dataForkData:resourceForkData:", - "_beginListeningForSessionStatusChanges", - "setResetOutputs:", - NULL, - "_synchronizeTextView:", - "initWithMovie:", - "_metalStyle", - "initWithObjects:", - "updateLineSpacingUI", - "_leftmostInsertionIndexForNode:inOrderedNodes:withSortDescriptors:", - "propagatesDeletesAtEndOfEvent", - "_desiredKeyEquivalentModifierMask", - NULL, - "addCharactersInString:", - "removeChildWindow:", - "nts_PopulateWithDictionary:withRecordMapping:generateIds:addressBook:", - "buttonGroup", - "encodeRect:forKey:", - "_reverseScanLines", - "getAttributesForCharacterIndex:", - "_chSheetDidEnd:returnCode:contextInfo:", - "_installOpenRecentMenus", - "titleFont", - "appendEnumerationDeclarationToAETEData:includingParts:", - "isMovableByWindowBackground", - "getLineStart:end:contentsEnd:forRange:", - "adjustSize", - "_setAnimates:", - "migrateStoreAtURL:withManager:metadata:options:error:", - "canCreateProxyPortWithOriginalPort:", - "_web_startupVolumeName_nowarn", - "setCellClass:", - "mostCompatibleStringEncoding", - "_invalidateUsageForTextContainersInRange:", - "_selectToolbarItemViewerInDirection:relativeToView:", - "addSelection:", - "_newPredicateWithInheritanceForFetchRequest:", - "_itemInStatusBar:withLength:withPriority:", - "_destroyFloatStorage", - "_appIdentifierFromServiceDictionary:appURL:", - "tabletID", - "connectionWasEstablished:", - "decimalNumberBySubtracting:", - "buttonClicked:", - "zoomInX", - NULL, - "fadeIn:orientation:", - "deselectAll:", - "_findIndexOfFirstDuplicateItemWithItemIdentier:", - "showPreviousDocument:", - "_highlightColorDependsOnWindowState", - "rowsInRect:", - "gotoBeginning", - "flipKnob:horizontal:", - "initWithName:fromFile:", - NULL, - "beginGrouping", - NULL, - "updateReferenceIndexesToReflectInsertionAtIndex:", - "bindItemFromDisk:withUID:", - "__fcCreateBlackListWithIndexes:", - "indexOfGroup:", - "_notes", - "mainThread", - "_isNSDocumentBased", - "addHeartBeatView:", - "objectForServicePath:", - "inlayROI:forRect:", - "doesPropertyExist:", - "selectText:", - "setValueTransformerName:", - "coreFindStrings:", - NULL, - "updateDragRectWithProgress:", - "advanceToEOLUnicode", - "parseSuiteOfPairsKey:separator:value:separator:allowOmitLastSeparator:", - "ISS_IANACharSetNameFromEncoding:", - "initWithContainerClassDescription:", - "_createDocument", - "_noteToolbarShowsBaselinePropertyChanged", - "applyDiff:toOldArray:withDataSource:allocator:allocatorSelector:", - "nts_CustomImageData", - "initForReadingWithData:", - "_windowWantsSquareToolbarSelectionHighlight", - "connectionUnitComponentSubType", - "updateFocusPoint", - "_release_1", - "undoNestedGroup", - "rangeOfString:options:range:", - "_tokenAttachmentForPoint:glyphIndex:drawingRect:", - "slideshowMode", - "lineFragmentUsedRectForGlyphAtIndex:effectiveRange:", - "useCleanAperture", - "_multipleValuesObjectCount", - "_releaseDockWindowID", - "performActionForControl:", - "_replaceObject:withObject:", - "insertRowAtIndex:withType:asSubrowOfRow:animate:", - "visualMovieBoxBackgroundColor", - "_setRenderingBorder:", - "bind", - "_locationOfOriginPoint:", - "_serverConnection", - "accessibilityLineNumberForCharacterIndex:", - "_countBindings", - "predefinedAttributesForIndex:", - "accessibilityFocusedUIElementAttribute", - "_drawIndicatorInRect:", - "_isInternalFontName:", - "arrayOrNumberFromResolutions:andValues:withCount:", - "edgeAntialiasingMask", - "_performTypeSelect:", - "processNode:", - "shouldCollapseAutoExpandedItemsForDeposited:", - "_normalListmodeDown::::", - "autoconfigureWithPatch:", - "nofSubItems", - "setImage:dirtyRect:", - NULL, - "setPDFView:", - "_clearTemporaryAttributesForCharacterRange:changeInLength:", - "_freeTemporaryCacheStepWithVisibleIndexes:blackList:", - "processDocumentFragment:", - "cachedDrawingImage", - "setShadowOffset:", - "inputStreamWithData:", - "_setMarkedWidth:", - "initWithCompoundTypes:", - "flattenMipmapItemIfNeeded:withUID:", - "setContentsChanged", - "initWithContainerClassID:key:containerIsa:", - "_setIsUserRemovable:", - "defaultLineJoinStyle", - "usesPageLabels", - "initWithObjects:forKeys:count:", - NULL, - "notificationWithName:object:", - "_newNode:", - "_setOptions:withBindingInfo:", - "insertObjectIntoMasterArrayRelationship:atIndex:selectionMode:", - "trackMarqueeTextSelection:", - "initWithProperties:classExtensionDescriptions:", - "versionForClassName:", - NULL, - NULL, - "characterIndexForGlyphAtIndex:", - "setCropInfo:smallIcon:", - "sendData:", - "_setDefaultPrototypeCell", - "_isToolTipCreationAndDisplayEnabled", - "transformBy:interior:", - "toolTipForCell:", - "initWithObjectToken:track:", - "_scriptTerminologyPluralName", - "save:", - "addCursorRect:cursor:", - NULL, - "sendAppleEventCompleted", - "_drawQCBackground", - "includesPropertyValues", - "_filenamesAlwaysIncludingDirectories", - "_NSThemeWidgetCell_commonInit", - "deselectAll", - "linearBumpCenter:size:fromLevel:toLevel:angle:", - "_initWithData:error:", - "async", - "pause", - "_generateToOneSQLStringInContext:", - "identifier", - "drawSwatchOfColor:inRect:", - "cursor", - "isBadImage", - "releaseRenderedTexture:forCGLContext:", - NULL, - "IKAnimatedRepresentation", - "validStartCharacter:", - "monthSymbols", - "applyPaste:", - "setBaseSpecifier:", - NULL, - "_clearRefreshedObjects", - "activeColor", - "setKBProductString:", - "_cfNumberType", - "initWithEntity:alias:fetchColumns:inScope:", - "totalAdditionalHeightAtRow:", - "_tabRectForTabViewItem:", - "_desiredTextAreaSize", - "objcCreationMethodSelector2", - "setMinDoubleValue:", - "tableParameters", - NULL, - "certData", - "initWithPhoneString:", - "displayableSubpredicatesOfPredicate:", - "secondsFromGMTForDate:", - "objectsForFetchRequest:inContext:", - "setInnerHTML:", - "updateFromPMPageFormat", - NULL, - "keepLastRenderedCIImage:", - "paragraphSeparatorCharacterRange", - "_indexOfFirstGlyphInTextContainer:okToFillHoles:", - "__ivar_setClickedRow:clickedColumn:", - "isOCSPStatusCode:", - "_nameOfDictionaryForDocumentTag:", - "_doAttributeDecoding", - "_validateFaces:", - "initWithSimpleQueryString:searchScopes:", - "setSlideshowPanel:", - "_changeMainState", - "lineBreakInString:beforeIndex:withinRange:useBook:", - "toggleUsingSmallToolbarIcons:", - NULL, - "imageBounds", - "compositionIndexForPage:", - "alwaysUsesMultipleValuesMarker", - "freeVRAMCache", - "_handleKeyEvent:", - "operationScheduledForTime:dequeue:", - "_setForceItemsToBeMinSize:", - "breakUndoCoalescing", - "scaleFrame", - "handleMachMessage:", - "canonicalLocaleIdentifierFromString:", - "addDependency:", - "_ensureMediaBrowserViewLoaded", - "allowsCutCopyPaste", - "_disableChangeNotifications", - "_internalNextTypeSelectMatchFromRow:toRow:forString:", - "writeColorTable", - NULL, - "setValue:forInputKey:", - "rightIndentMarkerWithRulerView:location:", - NULL, - "_beginDrawView:", - NULL, - "prepareDeleteStatementWithRow:", - "IKImageIOLocalizedString:", - NULL, - "createDisplayList", - "_cfurl", - "_clearInitialFirstResponderAndLastKeyViewIfAutoGenerated", - "_setForceActiveControls:", - "setNeedsDisplay:", - "elementSize", - "_didChangeValuesForKeys:", - NULL, - "_shouldCoalesceTypingForText::", - "_rowHeightStorageComputeRectOfRow:cacheHint:", - "insertElements:count:atIndex:", - "initWithRegion:", - "_releaseAllPreWillChangeExpandedNodes", - "accessibilitySetSelectedAttributeOfChild:toValue:", - "_textDidChange:", - "toggleSearchMenu:", - "setAutomaticLinkDetectionEnabled:", - "_setWindowsNeedUpdateForSecondaryThread:", - "drawImage:atPoint:", - "panel:shouldShowFilename:", - "minDoubleValue", - "initMovingAndDisappearingAnimationWithItems:diff:", - "stopAnimations", - "_setDevice:", - NULL, - "saveLastImportContent", - "_contentToFrameMaxXWidth:", - NULL, - "_adjustDate:byEras:years:months:days:hours:minutes:seconds:", - "registerHelpBook", - "setPassphraseInfoStrings:::", - "isOutputTraced", - "horizBlur8ROI:destRect:", - "documentDidEndPageFind:", - "addRecordsToGroup", - NULL, - "_scriptingBooleanDescriptor", - "usesFindPanel", - "supportsSetAttributeValues", - "fileWrapperOfType:error:", - "request:acceptResponseWithHTTPStatusCode:", - "_tokenizeString:intoArray:errorDescription:", - NULL, - "setPickerMask:", - "_chooseGuess:", - "_changeIDsForManagedObjects:toIDs:", - "_setBackgroundColorWithRed:green:blue:alpha:", - "_queueBatchForDealloc:", - "_computeMenuForClippedItemsIfNeeded", - NULL, - "_sharedTextCell", - "insertString:atIndex:", - "clearMark", - NULL, - NULL, - "setContentResizeIncrements:", - "markUniqueIdsAsCompleted:", - "_proxyMutableArrayValueForKey:", - "_web_rangeOfURLUserPasswordHostPort", - NULL, - NULL, - "_delegate_nextTypeSelectMatchFromRow:toRow:forString:", - "_setTitleFixedPointWindowFrame:display:animate:", - "setValue:forUndefinedKey:", - "_copyDragCursor", - "evaluateFromResolutionArray:valueArray:arrayCount:atResolution:", - "setWindowsMenu:", - "setMovie:", - "addresses", - "closeButton", - "initPropFindWithURL:withDepth:lookingForProps:", - "_drawsOwnDescendants", - "_cancelTypeAhead", - "addTableColumn:", - "abortTransitionAndSetRendertime:", - "replaceCharactersInRange:withCString:length:", - "initWithDir:cStrings:", - NULL, - "greekingThreshold", - "nextUnicodeBase64Line:", - "substituteQuotesForRange:", - "removeMetadataForRecordWithUniqueId:", - "insert:", - NULL, - "_parseParagraphAttributes", - "_getGlyphIndex:characterIndex:forWindowPoint:pinnedPoint:preferredTextView:partialFraction:", - "_removeChildForUniqueName:", - NULL, - "show", - "setControlPoint:time:value:", - "_updateAutosavedRecents:", - "_writeFonts", - "setShortWeekdaySymbols:", - "_validItemViewerBoundsAssumingClipIndicatorNotShown", - "purgeResources", - "_updateColorSpace", - NULL, - NULL, - "customValuesDictionary", - "_highlightedNodes", - "removeRow:", - "_setIsPresent:", - "findUser:", - "_faceForFamily:fontName:", - "setTiltAngle:", - NULL, - "policyValues", - "sizeWithAttributes:", - "_isBooleanBinding:", - "poolCountHighWaterMark", - "createThumbnailFromImageSourceRef:", - "_fetchedPreviewTypeForDocumentPreview:", - NULL, - "graphicsContext", - "displayRect:", - "_drawCenteredVerticallyInRect:scrollable:", - "_viewFreeing:", - "redoMenuItemTitle", - "duplicate:", - NULL, - NULL, - "trackByIndexAndType:type:flags:", - "_drawOutlineCellAtRow:", - "blueBayerReconstructionProcessedROI:destRect:", - "performSelector:", - "_menuBarShouldSpanScreen", - "setCountPerRow:", - NULL, - "setBecomesKeyOnlyIfNeeded:", - "accessibilityValueIndicatorAttribute", - "setVolume:", - "defaultCenter", - "_drawingByHIView", - "_scheduleAutoExpandTimerForItem:", - "newWithProperties:quartzFilter:", - "_sizeAllDrawers", - "objectsByEvaluatingWithContainers:", - "_setAttributes:newValues:range:", - "frameCount", - "_setTimelineIdentifier:", - "_XMLStringWithOptions:appendingToString:", - "_appropriateColorPanelSliderPane", - "addToolbar", - "linkTextAttributes", - "_chosenIdentityToSignInvitation", - "smallIcon", - "characterRange", - NULL, - "setOpenGLTextureID:withGLContext:", - "lossyCString", - "becomesKeyOnlyIfNeeded", - "_growRegistrationCollectionForEntitySlot:toSize:", - "movieVisualContext", - "validateValue:forKeyPath:error:", - "_handleTabKey:", - "_wantsKeyDownForEvent:", - "initWithBundle:nibName:", - "_unregisterMenuForKeyEquivalentUniquing:", - "initForRelationship:sourceAlias:destinationAlias:correlationAlias:direct:inScope:", - "setSystemLanguages:", - "_fillLayoutHoleAtIndex:desiredNumberOfLines:", - "_shouldProceedAfterErrno:copyingItemAtPath:toPath:", - "_retainedObjectWithID:optionalHandler:withInlineStorage:", - "_makeKeyAndOrderFrontWithEffect:canClose:willOpen:toFullscreen:", - "originalDontAskUnresolvedDataRefsFlag", - "lockFocusIfCanDraw", - "_setTrackingAreasDirty", - "_destroyRealWindowIfNotVisible:", - "_searchWithGoogleFromMenu:", - NULL, - "nextKeyView", - "_web_errorWithDomain:code:failingURL:", - "maximumLineHeight", - "setIsPaneSplitter:", - "usableSortDescriptorsFromArray:", - "_makeUpCellKey", - "initWithPath:", - "sendCarbonUpdateHICommandStatusEvent:withMenuRef:andMenuItemIndex:", - "_adjustTextBoundingRect:toFitInCellFrame:withMaxSize:", - "lockResourceAtPath:withDuration:", - "_fromRecord:getContainerInfo:andKey:", - "storeCurrentBrowsingNodePath:", - "_forwardMetadata", - "setWithSet:", - "createKeyValueBindingForKey:typeMask:", - "fillTemplate:withReplacements:", - "_validateSessionCredentials", - "_notifyFamily_DidSetAllCurrentItems:", - "_validateDeletesUsingTable:withError:", - "_endTopLevelGroupings", - "_setDocViewFromRead:", - "_setPaperName:inPrintSession:pageFormat:", - NULL, - NULL, - "originalImageIsInvalid", - "_userCanMoveColumn:toColumn:", - "assertFileHandlerIsReady", - "initWithDir:separator:pattern:", - NULL, - "_didEndSheet:returnCode:contextInfo:", - "partialControllerKey", - "sRGBColorSpace", - "proxyPort", - "setStackSize:", - "drawCellAtRow:column:", - "_utiUsage", - "netServiceDidResolveAddress:", - NULL, - "_textFieldWithStepperTrackMouse:inRect:ofView:untilMouseUp:", - "_animateFadeOut", - "valueWithCATransform3D:", - "_mutableSetValueForKeyPath:ofObject:atIndex:raisesForNotApplicableKeys:", - "_responseWithCFURLResponse:", - "unregisterForPropertyChangedNotifications", - "setButtonBordered:", - "_open:", - "_resizeContentsOfMiniMode", - NULL, - "writeListTable", - "_updateOverlayFrame", - "simpleCommandsArray", - "_windowChangedHilite:", - "roundingIncrement", - "setIndex:", - "setDate:", - "focusedIndex", - "getValues:forAttribute:forVirtualScreen:", - "glyph", - "_resizeWithDelta:fromFrame:beginOperation:endOperation:", - NULL, - "setDefaultTimeZone:", - "closeAll:", - "storeNode:withUID:withResolution:", - NULL, - "sourceRepresentation", - "addNavigationLayer:", - "_codeSigningDevelopmentUsage", - "countOfRecordsForClass:matchingPredicate:takeLock:", - "_setupWindow", - "didEndAlert:returnCode:contextInfo:", - NULL, - "extraArgument1", - "isEqual:", - "_getBucketForSeekingToPoint:", - "_changedTransientProperties", - "performAction:onSelectedTimeLines:withSelectedKeyFrames:object:context:", - "setCalendarFormat:", - NULL, - "_applicationWillDeactivate:", - "imageContents", - "inFlightAnimationWithObject:animation:", - "_blockRowRectForCharRange:rect:", - "_setClient:", - "gotoBeginning:", - "setSensibility:", - "_changeWasUndone:", - "addPropertiesAndTypes:withAddressBook:", - "sublayerEnumerator", - "writeDelayedInt:for:", - "addObserver", - "initWithNibName:bundle:", - "updateCanGoBackAndNext", - "_rearrangementExtensions:", - "SCTWindowIdentifier", - "saveChanges", - "_tabHeight", - "_sendDidFailToDispatchNotification", - "_draggedURL:", - "_configureSearching", - "_setKeyAlgorithm:", - "launchApplication:showIcon:autolaunch:", - "_clearLockedObjects", - "executeSubpatches:arguments:", - "_checkCollectionMoveOut:", - "valueClassForBinding:", - "initWithContainerSpecifier:key:", - "addTemporaryAttribute:value:forCharacterRange:", - "_setImpactsWindowMoving:", - "drawWithCurrentRendererInRect:", - "indexMenuBar:", - "_wantsRevealovers", - "_setSelectableItems:", - "outputImageWasModifiedByDelegate", - "setEnumerator:", - "_populateMiniMode", - "accessibilityIsSelectedTextRangeAttributeSettable", - "setAllowsIdentitySelection:", - "_clearEditingTextView:", - "_readablePasteboardTypesForRichText:importsGraphics:usesFontPanel:usesRuler:allowsFiltering:", - "_loadPickerUI", - "_exposedBindings", - "openPanel", - "unlockWithPassword:", - "adjustCTM:", - "_selectNextSubfield", - "_pathForImageTaggedByEmails:", - "_startAnimation", - "nts_CreateInfoWithAddressBook:", - "bindingCategory", - "cellAttribute:", - "setAllowedClasses:", - "fetch:", - "getColorFromAppearanceString:", - "drawSelectionIndicatorInRect:", - "parseABExtensionType:", - "temporaryAttributesAtCharacterIndex:effectiveRange:", - "accessibilityPopUpMenuCreated:", - "setReplyMode:", - "_configurePathComponentPicker", - "nts_RemoteLocation", - "nodeWithIdentifier:", - "_reconcileToSuiteRegistry:", - "updateLockFileTimeStamp", - "originalProvider", - "setTimingFunction:", - "rulerView:shouldMoveMarker:", - "_didSelectComposition:", - "_isVisible", - "_fixupKeyboardLoop", - "IKIPSetFrame:constrainedToScreen:", - "setMenuView:", - "enterFullscreenWithEffect:frame:fromPanel:", - "previousPage:", - "noteContentValueHasChanged", - "_clearAllChanges", - "_shouldForceShiftModifierWithKeyEquivalent:", - "scaleFactor", - "evaluateWithObject:substitutionVariables:", - "_accessibilityPopUpButtonCellPressAction:", - "unlockTopMostReader", - "pathnameForDatabase", - "_createCGColorWithAlpha:", - NULL, - "saveOptionsHandler", - "mapData", - "cachedMipmapWithUID:", - NULL, - "_setHasRetainedStoreResources:", - "indexOfFirstCharacterOnPage:", - "loadFromDirectory:", - "_accountInfoPostHandler:", - "initWithData:bytesPerRow:size:format:colorSpace:", - NULL, - "_removeFormatDescriptionPropertyListener", - "tabletPoint:", - "_presentDiscardEditingSheetWithError:discardEditingCallback:otherCallback:callbackContextInfo:relatedToBinding:", - "isEqualToArray:", - NULL, - "_markerAtIndex:inText:", - "_dnsName", - "printDocument:", - "_setWindowNumber:", - "_setCompileResult:", - "markWithTag:notify:", - NULL, - "removeNodeForKey:", - "_windowTitlebarButtonSpacingWidth", - "writeInfo", - "countForKey:", - "setButton", - "makeIdentity", - "_clearConfigPanel", - "fontWithName:matrix:", - "_ruleOptionPopupChangedAction:", - "_workspaceDidResignOrBecomeActive:", - "applicationQuit:handle:", - "_isViewValidOriginalNextKeyView:", - "_compositeAndUnlockCachedImage", - "globallyUniqueString", - "selected", - "_copyCompositeCoreUIDrawOptions", - "_setIsCritical:", - "normalizeAdjacentTextNodesPreservingCDATA:", - "_setHideNonPartDrawing:", - "_newObjectGraphStyleRecordForRow:andObject:", - "_processMetaElementWithName:content:", - "rectSetBeingDrawnForView:", - "_prepareCropPRSUndo:", - "needsToDrawRect:", - "_delegateRespondsToGetToolTip", - "_observePreferredFileNameOfChild:", - "ensureAttributesAreFixedInRange:", - "_autorecalculateMinSize:maxSize:", - "initWithEntity:propertyDescription:", - "outlineView:willDisplayCell:forTableColumn:row:", - "_addDisplayedView", - "slideshowDidStop", - "contentMaxSize", - "arrayOfObjects", - "numberWithUnsignedShort:", - "_termOneShotWindow", - NULL, - "sharedFrameworksPath", - "totalCacheUsed", - NULL, - "_locationOfRow:", - "setUniqueID:", - "_setKeepCacheWindow:", - "shouldDrawFocusRing", - "lockFileContentsDictionary", - "applicationWillResignActive:", - "ignoreWord:inSpellDocumentWithTag:", - "unlockForThreadedOperation", - "tokenFieldCell:writeRepresentedObjects:toPasteboard:", - "resolveURL:withTarget:", - "abortParsing", - "popUndoObject", - "videoDecompressionRequirementForConnection:", - "_drawGraph:selectionRingColor:selectionRingWidth:nodeCount:nodeList:connectionCount:connectionList:", - "valueForHTTPHeaderField:", - "setPredicateName:", - "initWithUnsignedInteger:", - "_selectToolbarItemViewerPreviousToView:", - "panel:directoryDidChange:", - "drawSeparatorInRect:", - "mainWindow", - "_boolValueFromObject:", - "_doOpenUntitled", - "setUnderlyingDataAreVolatile:", - "SNNROI:destRect:", - NULL, - NULL, - "_clearKeyCell", - "finishAwakeFromNib:", - "setLayoutRect:forTextBlock:glyphRange:", - "attributeKeys", - "session:authenticateForURL:withRealm:attempt:username:password:", - "_shouldTryCoreUIBezelDrawingWithFrame:inView:", - "breakConnection", - "controller:didChangeToSortDescriptors:", - "rootObject", - NULL, - "clipFrameChanged:", - "isActive", - "_chunkAndFindMisspelledWordInString:language:learnedDictionaries:wordCount:usingSpellServer:", - "initWithDrawingView:rects:", - "setFillMode:", - "_drawHeaderFillerInRect:matchLastState:", - "fullNoiseReduction:pattern:radius:slope:", - NULL, - NULL, - "performDefaultImplementation", - "object:didAddObservance:", - "setAlternateButtonTitle:", - "attrStringForWarning:type:font:", - "scrollToSelected", - "entityVersionHashesByName", - "_currentImage", - "compositionLayer", - "setMouseCol:", - "boundsDidChange:", - NULL, - "shapeWidth", - "setMapData:", - "attributesForNodeIdentifier:", - "outlineTableColumn", - "setStartUpDelay:", - "setChanged:", - NULL, - "_restoreMiniaturizedWindow", - "setHintCapacity:", - "_rootmostLayerTreeHostAncestor", - "pathStyle", - "performSelector:withObject:afterDelay:", - "posterTime", - NULL, - "_customizationPaletteSheetWindow", - "beginPage:label:bBox:fonts:", - "_setRawDataAccess:", - "selectedIndexAndQuality:", - "_font", - "zoomValue", - NULL, - "inverseManyToMany", - "isValid", - NULL, - "_currentCollectionName", - NULL, - "_callImplementor:context:chars:glyphs:stringBuffer:font:", - "handleFileListModeChanged", - "availableVideoPreviewConnections", - "generateGlyphsForGlyphStorage:desiredNumberOfCharacters:glyphIndex:characterIndex:", - "_tableFlags", - NULL, - "_drawGrowBoxWithClip:", - "_dragHandleColors", - "setSubmenuRepresentedObjectsAreStale", - "UTF8String", - NULL, - "_resizeWeightSharedWithDuplicateItems", - NULL, - "setDisplayPattern:", - "_setupHistoryControl", - "createManyToManyTablesForEntity:", - "setCompression:factor:", - NULL, - "playerView", - "postNotificationName:object:userInfo:", - "selectItemWithObjectValue:", - "_enumeratedBindings:storage:number:numberFirstBinding:maxNumber:", - "automaticallyNotifiesObserversOfAppleUseCoreUI", - "_typeIdentifierFromCarbonCode:", - "_decodeDepth", - "_IKBuildImageWrapperForType:withObject:withOwner:", - "antiAliasingFilter:phase:greenAmount:redBlueAmount:", - "thumbnailWithSize:", - "comboBox:indexOfItemWithStringValue:", - "didRecycleResource:", - "isButtonVisible:", - "_privateAttributesWithIdentifier:", - "_valueForDepth:", - "fileSystemRepresentationWithPath:", - "allGroups", - "_validateAllObjectsAfterMigration:", - "drawAtPoint:fromRect:operation:fraction:", - "numberOfItemsInComboBoxCell:", - "thumbnailSize", - "encodeObject:", - "_userSetStateOfCellsInSet:toState:", - "imageRenderedSize", - NULL, - "_convert:toValueClassUsing:", - "attributedSubstringForMarkedRange", - "preview", - "renderWithBounds:matrix:function:info:", - "_typeDescriptionForName:", - "isInFrontWindow", - "_encodeObjectValuedMapTable:withCoder:", - "outlineView:typeSelectStringForTableColumn:item:", - "browser:sizeToFitWidthOfColumn:", - "selectTabViewItem:", - "setFireTime:", - "removeControlPoint:", - "setParentWindow:", - "_setToPresentCritical", - "autoPlay", - NULL, - "highlightColorInView:", - "flipCellsHorizontally", - "removePortForName:", - "addItemsWithRecentPictures:", - NULL, - "_animates", - "dashCountRaw", - "_packedGlyphs:range:length:", - "_escapeHTMLAttributeCharacters:withQuote:appendingToString:", - "descriptionFunction", - "_saveCacheAndIndexes:", - NULL, - "alignLeft:", - "typeToUnixName:", - NULL, - "setupTableView:", - NULL, - "dateYearless", - "_changeSyncPostingEnabled", - "_currentPath", - "localizedRecoverySuggestion", - "_canShowToolTip", - "_userRemoveItemAtIndex:", - "_hiddenWindows", - "_bindingInformationWithExistingNibConnectors:availableControllerChoices:", - "computeFigure:rectangle:", - "originalWidthForIndex:", - "initWithView:", - "_viewForControlID:", - "_anyUsage", - "imageIndexesInDocumentRect:", - "windowIsSpellingPanel:", - NULL, - "_applySelectionToItems:", - "setupAttributes", - "setVmUsagePolicy:", - "_acceptableRowAboveKeyInVisibleRect:", - "_revertDisplayValueBackToOriginalValue:", - "symbolicatorForTask:", - "_readColorIntoRanges:fromPasteboard:", - "_resizeButtons", - "setGrouping:", - "_liveResizeCacheableBounds", - "encoding", - "acquireFunction", - NULL, - NULL, - "autosizesCells", - "accessibilityInsertionPointLineNumberAttribute", - "setNeedsLayout", - "_nxeventTime", - "_eventRef", - NULL, - "selectedPeople", - "subrowIndexesForRow:", - NULL, - "encodeBytes:length:", - "_activeBackgroundColor", - "_adjustFreeFormLayout", - "startLineStyle", - "isExecutableFileAtPath:", - "RTFDFromRange:", - NULL, - NULL, - "_blinkCaret:", - "_acceptableRowBelowRow:tryAbovePoint:", - "_loadBundle", - "_gray204Color", - "hasSubmenu", - "typeDescriptions", - "initWithFrame:forMenuItem:", - "deserializeAlignedBytesLengthAtCursor:", - "_detailedContentsAtPath:", - "_handleChildAdded:", - "sampleBufferWithFigSampleBuffer:", - "gradientType", - "setChapterlist:", - NULL, - "_bodyStreamCanRead", - "initWithX:Y:Z:W:", - "imageExporterClasses", - "ancestorSharedWithLayer:", - "propertyValueWithKey:uniqueId:addressBook:", - NULL, - "_label", - "_isBeingEdited", - "vendorDefined", - "createPatchWithName:", - "_enableSelectionPostingAndPost", - "takeValue:fromPort:", - "defaults", - "_lmouseUpPending", - "objcDescriptorCreationMethodSelector", - NULL, - "initWithBool:", - "_adjustHelpDependentButtons", - NULL, - "deltaStateForUID:", - "_keyEnciphermentUsage", - "_isUpdating", - NULL, - "helpCursorShown", - "visibilityPriority", - "toolbarDidRemoveItem:", - "showsLogonButton", - NULL, - NULL, - "_scaleEffectForItemFrame:fullscreenFrame:fromPanel:subEffects:", - "setWidth:type:forLayer:", - "showcaseRect:window:position:", - "connectionGraphNodeForConnection:", - "_setUnprocessedUpdate:", - "imageFlowDidStabilize:", - "_cgsevent", - "setInt64:", - "_imageInterpolation", - "setToolTip:forSegment:", - "processDocumentType:", - "circleRect", - "renderOptionsForOptionsCallback:param:", - "_toggleOrderedFrontMost:", - "contentsAtPath:", - "showNode:inDirectory:selectIfEnabled:", - "runOperationModalForWindow:delegate:didRunSelector:contextInfo:", - "_progressPanelWasCancelled:contextInfo:", - "_setHiddenExtension:", - "_abortEditingIfFirstResponderIsASubview", - "_parseDocumentAttributes1", - "_filterMainSource:", - "isLiveCapturing", - "abNormalizedUID", - "__oldnf_containsChar:", - "cycleToNextInputLanguage:", - "_processLibXML2MetaNode:", - "drawUnderlineForGlyphRange:underlineType:baselineOffset:lineFragmentRect:lineFragmentGlyphRange:containerOrigin:", - "setCollapsedLayout", - "linearGradientCenter:size:fromAlpha:toAlpha:angle:offset:", - "horizBlur32ROI:destRect:", - "fetchMetadata", - "_generateSQLEndsWithStringInContext:", - "addMembers:", - "setShowZoomSlider:", - "_groupObjectsByRootEntity:", - "isColumn", - NULL, - "_getDisplayDelegateFadesOutWhenInactive:", - "notReadyError", - "_resumeUIHeartBeatingInView:", - "_lockViewHierarchyForDrawing", - "canInitWithData:", - "fxButtonClicked:", - "_colorWellCommonAwake", - "setItemHeight:", - "_allowAnimated_setCompositingFilter:", - "boundsHeightGivenWidth:font:", - "_createPattern", - "isQuery", - "currentVirtualScreen", - "setIsEmptyColumn:", - "valueForControlPoint:", - "_rowObjectFromPredicate:", - "lockTimeout", - "moveBackward:", - "add:", - "_ensureSelectionAfterRemoveWithPreferredIndex:sendObserverNotifications:", - "setupWithOptions:", - "setKeyView:", - "_convertPoint:fromAncestor:", - "sublayers", - "prepareCountStatementWithFetchRequest:", - "_wasCGOrderingEnabled", - "pasteboardByFilteringTypesInPasteboard:", - "thumbnailImageSize", - "externalNameForPropertyName:", - "movieBounds", - "layoutSublayers", - "_addQuoteForLibXML2ElementNode:opening:level:", - "keyFrameSelected:inTimeLine:", - "imageWithPathInner:", - "center", - "_valueForRequiredCocoaAttributeKey:fromElement:", - "_synchronizeUserDefaultsIfNecessary", - "doubleClickAtIndex:inRange:", - "_collapsePanel:andMoveParent:toFrame:", - "evaluatedReceivers", - "fontDescriptorWithName:matrix:", - "setBitmapRepresentation:", - "_setIgnoringScrolling:", - "copyRenderedTextureForCGLContext:pixelFormat:bounds:isFlipped:", - "anyObject", - "unregisterForPropertyChanges", - "nativeRotation", - "encryptChanged:", - "containsPoint:", - "fetchRequestForSourceEntityNamed:predicateString:includesSubentities:", - "getGlobalWindowNum:frame:", - "_decrementLine:", - "unlock:", - "_updateFormatDescriptionFromCallback", - "_establishEventSnapshotsForObject:", - "setDocumentEdited:", - "currentTextContainer", - "numberOfThumbnails", - "emptyView", - "initForFetch:context:countOnly:", - "accessibilitySizeOfChild:", - "canBecomeVisibleWithoutLogin", - "imageAlignment", - "_editNote:", - "initWithURLResponse:", - "_setObjectHandler:", - "unsignedCharValue", - "_startelement:attributes:", - "isIrisClosed", - "symbolForAddress:", - "updateOptionsWithMarketingVersion:", - "regionOf:destRect:", - "parseCertPolicies:", - "insertTabIgnoringFieldEditor:", - "entityName", - "classDescriptionForDestinationKey:", - "datePickerCell:validateProposedDateValue:", - "coerceToDescriptorType:", - "checkGrammarOfString:startingAt:language:wrap:inSpellDocumentWithTag:details:", - NULL, - "_explicitlyCannotRemove", - "nts_IsParentGroupOfRecord:", - "defaultActionForKey:", - "servicesMenu", - "cameraIsGone:", - "_placeSuggestionsInDictionary:acceptableControllers:boundBinders:binder:binding:", - "userControlForAnnotation:", - "schedule:mode:", - "currentParagraphStyle", - "naturalSize", - "createSoftwareContext", - "setFieldVisible:withBool:", - "setExportToiPhoto:", - "cheapChromaBlurROI:destRect:", - "microsecondOfSecond", - "bindCGCache", - "loadNibNamed:owner:", - "departmentFieldPresent", - "generateNewGLTextureID", - "endInputStream", - NULL, - "_printSettingsValue", - "setLastEditedStringValue:", - "_okForSaveMode", - "setSubEffects:", - "setTitle:", - "nts_GroupUID", - "canBeCompressedUsing:", - "pixelFormatI16", - "heartBeatCycle", - "_commitOnMouseDown:", - "didLayoutDocumentView:", - "_isDarkWindow", - "_removeItem:fromTable:", - "initWithOutputIntents:quartzFilter:", - "_updateFormatDescription", - "classDescriptionsInSuite:", - "setImagePosition:", - "_documentURLAtIndex:", - "_clearCurrentAttachmentSettings", - "rowsCount", - "setPortClass:", - "_openInlinePreview", - "groupsController:outlineView:isItemExpandable:", - "sizeDidChange", - "_clearPreviousKeyWindowProperties", - "usePixels", - "_clearUnprocessedUpdates", - "enableExecution:", - "dispatchNameDoubleClick:", - "executeFetchRequest:error:", - "setPosition:atIndex:", - "accessibilitySharedTextViews", - "outlineView:setObjectValue:forTableColumn:byItem:", - "hasCGCache", - "initWithFrame:pullsDown:", - "setCurrencyGroupingSeparator:", - "itemNumberInTextList:atIndex:", - "allowedContentBindingMask", - "_isKeypathScopedToSubquery:", - "metaDataCachePathForUID:", - "_allLabels", - "writeKeywordsDocumentAttribute", - NULL, - "imagePath", - "externalMovie:", - "transitionImage", - "commonInitWithDictionary:", - "disabledWhenInactive", - "createRealObject", - "_abCompareNotWithinIntervalAroundTodayYearless:", - "_unregisterInstance", - "_releaseEvents", - "createPredicateForFetchFromPredicate:", - "addThumbnailForIndex:toArray:", - "setCertificate:", - "didAddToPersistentStoreCoordinator:", - "_drawAlternatingRowBackgroundColors:inRect:", - "textBackgroundColor", - "retreatMonthButtonCellForDatePickerCell:", - NULL, - "removeTextContainerAtIndex:", - "systemFontSizeForControlSize:", - "formatter", - "addNameDefaultValueToDictionaryRef:", - "setLocaleListForDefaultFontFallback:", - "_setAutovalidatesItems:", - NULL, - "_web_fileNameFromContentDispositionHeader_nowarn", - "_imagesWithData:hfsFileType:extension:zone:expandImageContentNow:", - "matchesPattern:caseInsensitive:", - NULL, - "_registerViewNotifications", - "imageBufferRef", - "setClass:forClassName:", - "replaceValueAtIndex:inPropertyWithKey:withValue:", - "_target", - "renderingContext", - "_frameOfOutlineCellAtRow:", - "_initWithCGSEvent:", - "descriptorByTranslatingObject:ofType:inSuite:", - "spacing", - "_focusInto:withClip:", - "setAttachmentFrame:", - "_nestingModeShouldHideAddButton", - "virtualScreen", - "_buttonTitleForTag:", - "setSendsSearchStringImmediately:", - "initWithVCardRepresentation:", - "insertItemWithRecentPicture:atIndex:", - "_defaultType:", - "registerNotificationsForWindow:", - "_shouldDisplayView:forDocumentPreview:", - "_createProfileFor:", - "vendor1", - "_findColorListNamed:forDeviceType:", - "_hasCursorRectsForView:", - "listOptions", - "__swapCompositions:", - "beginUsingMenuFormRepresentation:", - "_existsForArray:", - "_colorList", - "_setToolbarShowHideResizeWeightingOptimizationOn:", - NULL, - "setClient:", - "unregisterViewNotifications", - "_getCGImageRefCreateIfNecessary", - "resultType", - "setBezelStyle:", - "drawPageBorderWithSize:", - NULL, - "_addCert:certData:commonName:", - "_getTextAreaFrame:stepperCellFrame:forDatePickerCellFrame:", - "datePickerMode", - "performSelectorDelayed:", - "extendedNodeInfo", - "moduleWasInstalled", - "soundNamed:", - "performMenuAction:withTarget:", - "accessibilityIsVisibleCharacterRangeSettable", - "_addTrackingRectsForView:", - "setRepresentation", - "initWithRulerView:", - NULL, - "tokenizingCharacterSet", - "_firstSelectedCell", - "whitespace", - "_descriptorByTranslatingData:ofType:inSuite:", - "bind:toObject:withKeyPath:options:", - "_accessibilityTitleCell", - "_printSettingsForGetting", - "_adjustedCenteredScrollRectToVisible:forceCenter:", - "reduceWithKernels:::", - "tokenAttachment:shouldUseTokenAttachmentCell:", - "_invokeSelector:withArguments:onKeyPath:ofObjectAtIndexPath:", - "_accessibilityParentAdjustedHitTestElement:atLocation:", - "_clockAndCalendarAdvanceMonthButtonCell", - NULL, - "_createAutosaveRecordForDocument:", - NULL, - "layoutSublayersOfLayer:", - NULL, - "_setRepresentedURL:", - "pathForResource:ofType:inDirectory:forLocalization:", - "rectForSegment:inFrame:", - "boundsForThumbnail:", - "getIndexes:maxCount:inIndexRange:", - "setCurrentValue:", - "composition", - "setInputPortOrder:forKey:", - "_rulerAccViewLeftTabWell", - "imageFileExtensions", - "setItemViewer:", - "registerClient:", - "canInstantiateWithFile:", - "isFieldEditor", - "setCapacityHint:forSlot:", - "sharpenReconstructedGreenEdges:radius:intensity:edgeIntensity:edgeThreshold:edgeMaskRadius:edgeMask:", - "_addNode:atPosition:", - "initWithComparisonFunction:", - "_compositeNameIncludingAuxiliaryElements:", - "_setTrustHeaderValue:", - "_enableToolTipCreationAndDisplay", - "decodeQTTimeRangeForKey:", - "_baseLineHeightForFont:", - "_setIndex:", - "pointerSerialNumber", - "accessibilityRangeForSelection:", - "toolbarInstancesWithIdentifier:", - "addressBookWithDatabaseDirectory:", - "matrix", - NULL, - "setQueryAttributes:", - "_buttonWidth", - "setAllowsEditingTextAttributes:", - "_layoutEnabled", - "_finishedWiringNibConnections", - "initWithLeftExpressions:rightExpressionAttributeType:modifier:operators:options:", - "inputPorts", - "hasVRamLeftToContinueSchedule", - "_renderLayerPropertyAffectsGeometry:", - "_cellForPoint:characterIndex:level:row:column:range:", - NULL, - "contentInsetColor", - "mouseRow", - "initWithPath:directory:", - "setAutosavingDelay:", - "_removeHoleFromRanks:", - "nextSingleByteStringInEncoding:quotedPrintable:stopTokens:trim:", - "cString", - "_pathForLocalImage", - "timeStyle", - "resetCaches", - "sharedURLCache", - "_web_countOfString:", - "propPatchWithSession:URI:updatingProps:token:inNameSpace:", - "_addImage:named:", - "processEntity:", - "abortPrefetchThumbnails", - "simpleTraverseWithPath:", - "createSharedGWorld", - "indexOfLastCharacterOnPage:", - "accessibilityIndexForAttachment:", - "lineHeightMultiple", - "_enableMovedPosting", - "setClip", - "_accessibilityTreatSegmentedControlAsToolbarButtons:", - "setThread:withObject:withSessionUID:", - "_responsibleDelegateForSelector:", - "matchQualityOfColorAtIndex:toColor:filtered:ifBetterThan:", - "_setPlaceholderAttributedString:", - "resourceImageNamed:", - "_sizePopUp", - "_selectAnyValidResponderOverride", - "_postColumnConfigurationDidChangeNotification", - "initWithFormat:baseAddress:releaseCallback:releaseInfo:bytesPerRow:pixelsWide:pixelsHigh:flipped:colorSpace:options:", - "_focusedCrayon", - "_updateLayerGeometryFromView", - "initWithURL:options:", - "ensureQueue", - "_drawFromRect:toRect:operation:alpha:compositing:flipped:ignoreContext:", - "_wantsHeartBeat", - "initWithTexture:size:flipped:colorSpace:", - "range", - "_shouldShowFirstResponderForCell:", - NULL, - "_setGraphEditor:", - "_isLocatedByURL:withCache:", - "_doUserSetListMarkerFormat:options:", - "_moveObjectsInContainer:toContainer:withKey:atIndex:replace:", - "convertRect:toLayer:", - "maxItemSize", - "setSelectedGroupsFromModel:", - "_drawMappingAlignmentRectToRect:withState:backgroundStyle:operation:fraction:flip:", - "setPrecision:", - "__oldnf_replaceLastAppearanceOfString:withString:", - "_indicatorImageForCellHeight:", - "getBytes:", - "itemSupportedByiPhoto", - "_colorPickers", - "alloc_10_4", - "_clearGLContext", - "phoneFormatsDictionary", - "nibBundle", - "_initContentView", - "_shouldMinimizeWindowForEvent:", - NULL, - "items", - "setCacheDBIndex:", - NULL, - "_imageByRenderingInRect:format:callback:data:options:", - "accessibilityIsVisibleColumnsAttributeSettable", - "performActionForPerson:identifier:", - "setDiskCapacity:", - "_internalTypeSelectStringForIndex:", - "allowsColumnReordering", - "willPopRenderState:", - "isDataRetained", - NULL, - "shouldIncludeMember:", - "initWithName:URI:", - "initWithFormat:locale:arguments:", - "updateView", - "_sharedData", - "oldCustomRect", - "setIsFileListOrderedCaseSensitive:", - "initWithExpressionType:operand:selector:argumentArray:", - "classForCoder", - "drawInRect:fromRect:alpha:", - "_updatePredicate", - "resolvedKeyDictionary", - "_enableMatrixLiveResizeImageCacheing", - "_initServicesMenu:", - "_defaultUserActionForEvent:", - "_builtInLocalizedDescription", - "_threadedGenieFXWithImage:fromScreenRect:toScreenRect:withAlpha:", - "distributionStringsForMembers", - "extraArgument2", - "_setNeedsDisplayForColumn:draggedDelta:", - "saveLanguagesToDefaults", - "bindThumbnailWithSize:fromMipmap:withUID:toLocation:", - "IKCreateCGImage", - "reportStreamError", - "_endLiveResizeForAllDrawers", - "selectorForCommand:", - "_loadContentData", - NULL, - "PDFViewUserOpenGutterToWidth:", - "_groupCellAttributedStringForString:withDefaultAttributes:highlighted:", - "accessibilityLineForIndexAttributeForParameter:", - "_restoreModalWindowLevel", - "calculateFigure:size:", - NULL, - "element", - "abShowWindowDragProxie", - "_addOptionValue:toArray:withKey:type:", - "setError:", - NULL, - "_setToolbarViewWindow:", - "_selectRectRange::", - NULL, - "nts_AlternateName", - "_itemAtViewIndex:", - NULL, - "willHide", - "setDebugMode:", - "_setSelectedMember:withHistory:", - "preloadPDFXOptions", - "_validateBundleSecurity", - "accessibilityIsMinValueAttributeSettable", - "filesystemItemCopyOperationWithSourcePath:destinationPath:", - "hasEffects", - "rulerView:userClickedOnMarker:", - "copyRequestWithSession:sourceURI:destinationURI:token:", - "pageClass", - "clearDirectoryResultsSelection", - "initWithAddress:port:", - "setHostName:", - "_invalidateRunLoopTimer", - "_computeTargetItemViewFrameRects", - "widthAdjustLimit", - "indicatorImageInTableColumn:", - "arrayByExcludingToObjectsInArray:", - "_cfTrimWS", - "_constructTreesForTemplates:", - "imageRepsWithContentsOfURL:", - "item", - "_GC_queueForDealloc:", - "showImportDecisionPanelForDelegate:count:duplicatesCount:hasErrors:", - "exceptionWithName:reason:userInfo:", - "_drawThemeTab:withState:inRect:", - "_templateControlValueDidChange:", - "sendActionOn:", - "selectedCell", - "isMuted", - "otherMouseUpDelegate:", - "readBinaryStoreFromData:originalPath:error:", - "_isDoingHide", - "resetSelectionIndexes", - "currentDirectoryNode", - "_readColorsFromLibrary", - "_internalXMLStringWithOptions:appendingToString:", - "lightGrayDeviceColor", - "setBestVirtualScreenForRenderingSize:", - "_QNamesAreResolved", - "writableTypesForSaveOperation:", - "localizedFormattedDisplayLabels", - "_delayedDeactiveWindowlessWell:", - "helpMenuClosed", - "createIndexesForEntity:", - "firstIndentMarkerWithRulerView:location:", - "defaultLockDuration", - "_verticalOriginForRow:", - "outlineView:shouldExpandItem:", - NULL, - "actionForKey:", - "_cacheRow:rect:", - "matcher:foundService:", - "generatePrimaryKeysForEntity:batch:", - "newToolbarButton", - "_noise2d:y:", - "securityLockIcon", - "isGridBased", - "objectFrom:withIndex:", - NULL, - "setRowHeight:", - "willChangeValue", - "initWithAEDescNoCopy:", - "accessibilitySelectedRowsAttribute", - "_typeSelectInterpretKeyEvent:", - "defaultStringValue", - "doubleClickAtIndex:", - "invalidateTextSelection", - "separatorColor", - "panelSelectionDidChange:", - "_drawColumnHeaderWithIndexes:", - "_calcAndSetFilenameTitle", - "_printWithInfo:showingPrintPanel:", - NULL, - "initializeGrabberIfNeeded", - "initWithFormat:shareContext:", - "selectedRecord", - "setValue:forProperty:", - NULL, - "_publicAttributesWithIdentifier:", - "vectorWithValues:count:", - "setResultType:", - "mipmapCache", - "scrollToPoint:", - "setPlaceholderAttributedString:", - "_isNegation", - "_firstPageNumber", - "_dimpleDragStarted:event:", - "timeIntervalSinceDate:", - "_growBoxRect", - NULL, - "parseEMAIL", - "_changeTexture", - "importLock", - "initWithView:layoutManager:characterIndex:attachmentCell:", - "generateAccessibilityTable", - "tokenFieldCell:hasMenuForRepresentedObject:", - "getRow:column:ofCell:", - "setRelatedIDs:forKey:options:andTimestamp:", - "setAllowsFloats:", - "connectionClass", - "_drawDropHighlight", - "initWithSavedQueryData:title:", - NULL, - NULL, - "addToFavoritesAtIndex:", - "_informParentStore:ofInterestInObjects:", - "port", - "initWithData:documentClass:options:error:", - "filters", - NULL, - "cacheRetain:", - "_createMenuSeparatorItem", - "nextQuotedPrintableData", - NULL, - "sizeWithBehavior:usesFontLeading:baselineDelta:", - "orderForConsumerSubpatch:", - "autofill", - "copyCGLPixelFormatForDisplayMask:", - "keyEquivalentOffset", - "animationDidStop:", - "cancelAllOperations", - "secureTextViewForWindow:", - "replaceInView:", - "_setAppleMenuEnabled:", - "scrollRectToVisible:fromView:", - NULL, - "selectedCompositionIndex", - NULL, - NULL, - "createFileAtPath:contents:attributes:", - "performClickOnCell:", - "mergedModelFromBundles:", - "blurVerticalPass9ROI:destRect:", - "modifyOptionsViaPanel:", - "allObjects", - "_buttonHeight", - "_web_intForKey:", - "stopObservingModelObjectAtReferenceIndex:", - "shouldProceedAfterError:linkingItemAtPath:toPath:", - "initWithSourceModel:destinationModel:", - "_typesFilterableToType:", - "findFontLike:forCharacter:inLanguage:", - "_cycleUtilityWindowsReversed:", - "_setEmailProtectionUsage:", - "getFileSystemRepresentation:maxLength:", - "numberOfThreadsAlive", - "customProperties", - "completePathIntoString:caseSensitive:matchesIntoArray:filterTypes:", - "_isUnprocessedUpdate", - "movieControllerView", - "replaceObjectsInRange:withObjects:count:", - "_removePropertyForKey:", - "_attributesFromArchive:", - "isInputRampParams", - "_shouldShowRegularToolTipOnExpansionToolTip", - "parseError:", - "setFloatingPanel:", - "_panelSizeExcludingToolbar", - "_values", - NULL, - "removeNamespaceForPrefix:", - NULL, - "sampleTextForTriplet:", - "accumulate::minRadius:factor:", - "popOperation:", - "_uninstallTrackingAreas", - "initMultiStatusRequestWithURL:method:", - NULL, - "_resetAllChanges", - "_portsUpdated", - NULL, - "_scrollRangeToVisible:forceCenter:", - "drop:", - "_rectArrayForRange:withinSelectionRange:rangeIsCharRange:singleRectOnly:fullLineRectsOnly:inTextContainer:rectCount:rangeWithinContainer:glyphsDrawOutsideLines:", - "_setPatch:", - "transformForOrientationAndDPI", - "_pagesCountforCompositionsCount:", - "setMarkerFormatInWindow:textList:delegate:", - NULL, - "_imageForMenu", - "_addDrawerWithView:", - "_adjustedFrameFromFrame:value:currentScaleFrame:", - "encodeObject:isBycopy:isByref:", - NULL, - "initWithKeyFrameList:", - "_insertHoleInRanks:", - "reallyDealloc", - "comparisonForProperty:", - "_ivars", - "hasInheritance", - "newCreateTableStatementForEntity:", - "_accessibilityTableRow:", - "_limitedViewWantsRedisplayForItem:inRect:", - "fontMenu:", - "itemData", - "crayons", - "_controlAppearanceChangesOnKeyStateChange", - "textView:draggedCell:inRect:event:atIndex:", - "setupAudio", - "selectedGroupsInMembersColumn", - "popNibPath", - "_giveUpFirstResponder:", - "preferredLanguage", - NULL, - "multipleThreadsEnabled", - "_pageFormatForGetting", - "setCustomProperty:", - NULL, - "idlingEnabled", - "setThumbnailLimit:", - "initWithString:attributes:layoutSize:options:", - "coerceData:toColor:", - NULL, - "requestFileSizeCalculation", - "connection:didFailWithError:", - "yankAndSelect:", - "_formattedAddressFromDictionary:includeName:includeCompany:order:", - "write:toURL:securely:andReturnResultCode:", - "_regionsArray", - "mutableArrayValueForBinding:resolveMarkersToPlaceholders:", - "_cycleDrawers:", - NULL, - "updateCard:withImportedCard:", - NULL, - "_handleChildChanged:", - "bundleLanguages", - "supportedBufferPixelFormats", - "availableFonts", - "_searchMenuTracking", - NULL, - "groupIdentifier", - "didSendActionNotification:", - "makeBig", - "_restrictColumnResizingToWidth", - "handlePreviewTextChange", - "regularFileContents", - "debugMode", - "_maximumSizeForSearchFieldToolbarItem", - "objectValueForDisplayValue:", - "scrollPageDown:", - "_diskCacheCreateDirectory", - "_openFile:withApplication:asService:andWait:andDeactivate:", - "windowID", - NULL, - "valueOfAttribute:forResultAtIndex:", - "slideshowDidChangeCurrentIndex:", - "_inactiveStateShowsRolloversForSegment:", - "_applyTargetConfigurationWithoutAnimation:", - "download:didCreateDestination:", - "countOfCachedChildrenForNode:createIfNeeded:", - "hasMenuForTokenAttachment:", - "fileManager:shouldRemoveItemAtPath:", - "backgroundStyle", - "_saveToURL:ofType:forSaveOperation:delegate:didSaveSelector:contextInfo:", - "initWithData:URL:MIMEType:textEncodingName:frameName:", - "_finishedTableViewInitWithCoder", - "filteredSetUsingPredicate:", - "_specifiesCollection", - "destinationEntityForEntityMapping:", - "setMask:", - "setFocusRingType:", - "orderFrontStylesPanelInWindow:textView:", - "_imageForDivider:keyWindow:", - "_subclassDescriptionsForDescription:", - NULL, - "setAllowLoadingOfUnsupportedPreviewTypes:", - "defaultNeutralTint", - "_setDisableLiveResizeImageCaching:", - NULL, - "_addTrackingRects", - "_selectionIndexesCount", - "_isFileClosed", - "usesEPSOnResolutionMismatch", - "_storeRootDirectory", - "_toolbarButtonIsClickable", - "initWithUser:", - "_valueForOptionalCocoaAttributeKey:fromElement:", - "performInvocation:waitUntilDone:", - NULL, - "compileStatusForSourceOfType:", - "setRegistryString:", - "emapROI:forRect:", - "_bodyBackgroundColor", - "_adjustObject:mode:triggerRedisplay:", - "_drawTitlebar:", - "tokenTextView:shouldUseReadablePasteboardTypes:", - "setSingleTableEntity:", - "initWithCIFilterShape:", - NULL, - "_notifyView_InsertedNewItem:atIndex:", - "_addActionFrom:toDictionary:forCarbonMenu:base:", - "productionApertureExceedsMaximumTexture", - "predicateForFetchRequestInContext:", - "addedPeople", - NULL, - NULL, - "stopMetaDataControllerAndWait", - "_updateLocalizedDictionaryForNewLocalizedKeyTable", - "setControlsFixed:forKeyFrame:", - "pushInvocation:", - "writeOutInfo", - NULL, - "setIncludesPropertyValues:", - "isKindOfEntity:", - "horizPass9ROI:destRect:", - "nts_ShouldLaunchABDForListening", - "defaultKnob", - "doShowResource:", - "_menuMinimumWidthForEvent:inCellFrame:ofView:", - "isValidColorSpace:", - "requiresDirectKeyValueCodingCall", - "previewPanel:didChangeDisplayStateForURL:", - "setPrimitiveModificationDate:", - "selectionAffinity", - "_unregisterUniqueContext:", - NULL, - "mark", - "setCollapsesBorders:", - "_wantToBeModal", - "highlightRecovery:pattern:clipLevels:redPhase:greenPhase:bluePhase:redBlueSwap:image:", - "_stopUsingDevice", - "chooseRollOverIdentifier:withSelection:", - "enableMakeHistory", - "initWithBinder:object:", - "processDocument:", - "_separatorFinishInit", - "getInputRampParams", - "_fadeFindIndicator:", - "rectArrayForCharacterRange:withinSelectedCharacterRange:inTextContainer:rectCount:", - "setShouldBeVisibleOnlyOnCurrentSpace:", - "_validateOpacitySlider", - "_computeNominalDisplayedLabelSize", - NULL, - "redoActionName", - "_doResetOfCursorRects:revealovers:", - "portWithMachPort:options:", - "setAccessoryControllers:", - NULL, - "prepareMatches:", - NULL, - "autoPlayNextItem:", - "exifOrientation", - "standardizedPath", - "applicationWillTerminate:", - "_adjustEditedCellLocation", - NULL, - "_isURLString:", - "attributeForLocalName:URI:", - "_setApplicationIconImage:setDockImage:", - "calcDrawInfo:", - "_readAcceptCookiesPreference", - "saveResolutionData:into:", - "_contextMenuEvent", - "setCenter:", - "previewView:receivedDrop:forURL:", - "abEllipsizeWithFont:withWidth:", - "baseOptions", - "accessInstanceVariablesDirectly", - "_setHighlighted:displayNow:", - "ivarOutputPorts", - "draggingDestinationWindow", - "AddressKeys", - "W", - "_hasTabs", - "minimunWindowWidth:", - "href", - "execLoading", - NULL, - "_oneWordName", - "_handleFrameChangeForSubview:", - "_noteLengthAndSelectedRange:", - "mainWindowController", - "additionalDuration", - "valueAtIndex:inPropertyWithKey:", - "_characterCoverage", - "_compositionInfo", - "closeInspector:", - "removeRunLoop:", - "stopTimer", - "sizeToCells", - "enumeratorOfInputRampParams", - "getDocument:docInfo:", - "animationChannelEnabled:", - "destinationEntityExternalName", - NULL, - "_setWasReshapingEnabled:", - "_setup", - "_scriptingPointWithDescriptor:", - "valueForBinding:atIndex:resolveMarkersToPlaceholders:", - "_verifySelectionIsOK", - "setValue:inObject:", - "_registerForDragTypes", - "autosavesConfiguration", - "createNewMaskedImage:", - "makeKeyWindow", - "initializeRecipe:", - "usesVisualContext", - "_isSynchronous", - "isRendering", - "_debugDrawRowNumberForRow:clipRect:", - "_removeCurrentColor", - "_scrollColumnToVisible:private:", - "_decipherOnlyUsage", - "_validateLinkTargetCarbonCatalogInfo", - "insertionIndexForGroup:", - "code", - "initWithContentKind:occurrence:", - NULL, - "_setCurrentPreview:documentPreview:displayedView:canDelayDisplay:transition:", - "numberOfRows", - "setCurrentIndex:", - "_hasActiveAppearanceIgnoringKeyFocus", - NULL, - "_rulerAccViewCenterTabWell", - "_writeRTFInRange:toPasteboard:", - "setUseOriginalLayerToDraw:", - "blackColor", - "newFaultingPredicateForSourceID:andRelationship:", - "convertFont:toFamily:", - "_detatchNextAndPreviousForView:", - "matchesOnMultipleResolution", - NULL, - "removeEntriedOlderThanSessionID:", - "initWithContentRect:contentImage:forView:selfDestruct:", - "sidebarController", - "tabDelimitedTextData", - "encodeSize:forKey:", - "showsStateColumn", - "heightFieldImage:withBlur:usingDistortion:andInitialConditions:", - "evaluateString:", - "setTrack:", - "entity", - "_modifySelectedObjects:useExistingIndexesAsStartingPoint:avoidsEmptySelection:addOrRemove:sendObserverNotifications:forceUpdate:", - "initWithTitle:action:keyEquivalent:representedNavNode:", - "abortAllToolTips", - "_backingColorSettingPhase:", - "takeObjectValueFrom:", - "_installCarbonAppDockHandlers", - "updateSyncIndicatorsReloadItems:", - "_setInitialNameFieldContentsFromPosixName:", - "allowedTypes", - "displayID", - "appleEventCodeForReturnType", - "changeValue:forKey:", - "_drawDropHighlightOutlineForRow:", - "leadingOffset", - "dataWithCapacity:", - "_addInsertsToDatabaseOp:forManyToMany:", - "didChangeValueForKey:", - "mipmapDBIndex", - "_getRow:column:forPoint:", - "show:", - NULL, - "qfilter", - "addPageToSelectedPages:drawNow:", - "colorWithRGBA:", - NULL, - "addressEntityWithValue:", - "keysForLocalizedString:", - "validateRename", - "_undoInsertions:", - "setAuthorization:", - "_adjustLength", - "requestType", - "clearVarietyCharSets", - "recentPicturePopup:willPopupRecentItems:", - "buildRepresentationFromSearchElement:builder:order:", - "pageAtIndex:", - "diffuseROI:destRect:", - "setColor:", - "URLProtocol:didReceiveAuthenticationChallenge:", - NULL, - "_mergeRegionInvalidatedDuringDisplayIntoDirtyRegion", - "_printSettingsWasEdited", - "controlTextDidChange:", - "_processDeletedObjects:", - "nameSorting", - "createImageForVNodeAtPath:maximumSize:", - "_moveUp:", - "contentObjectWithEditedMode:contentIndex:", - "firstStringValueOfProperty:", - "resultsTable", - "_setForceFixAttributes:", - "__createConnectionFrom:to:forKey:withUserInfo:", - "_drawHighlightWithFrame:inView:", - "perform:with:", - NULL, - "_updateForLiveResizeWithOldSize:", - "addCertificate:to:forUser:domain:settings:", - "dataPtr", - "_isCString", - "_setCredentials:", - "endAngle", - "delete", - "didMatchString:", - "resizeLeftCursor", - "setGroups:", - "_setEntity:", - "_errorOffendingObjectDescriptor", - "beginTransaction:", - "accessibilitySetSelectedTextAttribute:", - "_trackingAreasDirty", - NULL, - "nts_Cleanup", - "zoomOutY", - "addressBookMetaDataDirectory", - "_makeNextCellOrViewKey", - "_setUsesLightBottomGradient:", - "_valueInMultiValue:", - "_invalidateForKeyChange", - NULL, - "setIKView:", - "_undoableSetGizmoPositionWithDisplay:", - "_clearDragMargins", - "_drawView:", - "cellIndexAtPoint:", - "initWithFrame:mode:cellClass:numberOfRows:numberOfColumns:", - NULL, - "_request", - "_stopObservingRowObjectsRecursively:", - "textView:menu:forEvent:atIndex:", - "setMinCount:", - "scalesWhenResized", - "propertyForKey:", - "addRows:", - NULL, - NULL, - "_updateSeekingSubmenuWithScreenPoint:viewPoint:event:", - NULL, - "topChangeCommand", - "_constructTitleMappingDictionariesFromOptionDictionaries:localizationItemIndex:", - "_setWin32MouseActivationInProgress:", - "willStopRenderingPatch:", - "unsignedShortValue", - "_compareWidthWithSuperview", - NULL, - "_ensureDatabaseMatchesModel", - "_setBrowserOptimizationsEnabled:", - "_compositeFlipped:inRect:fromRect:operation:fraction:", - "pointSizeFromAppearanceTokens:", - "tableView:defaultSubRowForRow:", - "setAnnotation:ofType:", - "encodeValueOfObjCType:at:", - "_windowTitlebarTitleMinHeight:", - "_refreshServerList", - "popUpWithEvent:inView:", - "ensureLayoutForBoundingRect:inTextContainer:", - "_drawSortIndicatorIfNecessaryWithFrame:inView:", - "_valueForBindingWithResolve:mode:", - "socketType", - "setIsSynchronous:", - "moveSelectionRight", - "appleEventCodeForKey:", - "_cancelActionIfCmdDot:", - "windowTitlebarLinesSpacingWidth:", - "processString:", - NULL, - "initWithInvocation:", - NULL, - NULL, - "setPreservesContentDuringLiveResize:", - "setSaveButtonAction:target:", - "_rebuildOrUpdateServicesMenu:", - "windowWillUseStandardFrame:defaultFrame:", - "_makeBranchTableForKeys:count:", - "reflection", - "handleTakePictureAbortedNotification:", - "setSuperviewBeingDeallocated:", - "_endedLoadingPreview:documentPreviewView:result:", - "tokenFieldCell:shouldUseDraggingPasteboardTypes:", - "_setWantsHideOnDeactivate:", - "_mutableIndexSetInAppliedGridForRect:", - "initWithEngine:indexHandler:", - NULL, - "readFromURL:ofType:", - "_concludeDefaultKeyLoopComputation", - NULL, - "_betweenDropGapSize", - "cardScrollView", - "_shadowType", - "tableView:namesOfPromisedFilesDroppedAtDestination:forDraggedRowsWithIndexes:", - "_confirmSize:force:", - "documentChangedIfDragSelectedPagesToIndex:", - "unsignedLongLongValue", - NULL, - "_setNeedsToRemoveFieldEditor:", - "_recursiveAllValues", - "setWraps:", - "_setView:", - "backupDatabaseToPath:", - "controller:didChangeToSelectionIndexPaths:", - "_setAlwaysDrawsActive:", - "drawInRect:angle:", - "parseBody:", - "setDraggingDestinationDelegate:", - "insertChild:atIndex:", - "setLoaded:", - "setWhite:", - "_organizationUnit", - "_javascriptFromKernel:", - "currentButtonCell", - "rangeOfUnit:inUnit:forDate:", - "initFromPreferencesWithApplicationID:", - "setObject:atIndex:forDatabaseKey:", - NULL, - NULL, - "foregroundColor", - "IKIPJPEGDataWithMaxSize:compression:", - "_modelsReferenceID", - "endPoint", - "int32Value", - "parameterString", - "executeSaveChangesRequest:withContext:", - "numberWithUnsignedInteger:", - NULL, - "_resumeLayerTreeRenderer", - "SQLGenerationV1Default", - "_drawMenuIndicatorForSegment:withRect:inView:", - "_setup:state:", - "_rowHeaderSeparatorLineColor", - "scrollRowToVisible:", - "logicalSize", - "setupImportPanelWithTitle:selector:target:object:", - "isExecuting", - "getCount", - "rawIntegerRowsForSQL:", - "getNthInputImagePort:", - "pixelDepth", - "_displayWidth", - "membersController", - "_handleSelfTestEvent:", - "_didPresentModalAlert:contextInfo:", - NULL, - "_doAttachDrawerIgnoreHidden:", - "_setPreviousKeyWindow:", - "substituteFontForFont:", - "nextPersonWithLength:addressBook:", - "seed", - "_nonPredicateValidateValue:forKey:inObject:error:", - "_descriptionWithTabCount:", - "_computedAttributesForElement:", - "setOrigin:rotation:scale:", - "unregisterMovieNotifications", - "_linkDragCursor", - "_installPBuffer", - "initWithEvent:inView:", - "splitCell:range:", - NULL, - "initWithType:location:", - "allImportableFilesFromPaths:", - "_searchInDictionary:", - "poseAs:", - NULL, - "handleUserGoUpDirectory", - "setButtonID:", - "parseOid:", - "imagePickerValidated:code:contextInfo:", - "itemBoundsInScreenCoordinatesForItem:itemIndex:", - "maxTimeLoaded", - "bindMipmapItem:withUID:", - "_combobox_windowDidBecomeKey:", - "setSerialNumber:", - "processCells:withBrowser:", - "groupsController:outlineView:child:ofItem:", - "lineFragmentRectForGlyphAtIndex:effectiveRange:withoutAdditionalLayout:", - NULL, - "initWithExpressionType:", - "arrayByAddingObjectsFromArray:", - "imageWithCGImage:options:", - "pdfDocument", - "eMapResult:eMap:type:", - "_scriptTerminologyName", - "colorAtIndex:filtered:", - NULL, - "_postDidChange", - "openOnEdge:", - "constrainResizeEdge:withDelta:elapsedTime:", - "getRGBColorValue", - "setLineDash:count:phase:", - NULL, - "_setWasCGOrderingEnabled:", - "setAllowsCutCopyPaste:", - "imageByApplyingEffects:", - "context", - "_setTextShadow:", - "_performMutatorOperation:object:index:", - "effectDescriptionWithDictionary:", - "recentSearches", - "authenticateComponents:withData:", - "_RTFDFileWrapper", - "showFlare", - "setMenuRepresentation:", - "removeObjectsForKeys:", - "textureTarget", - "accessibilitySetSelectedColumnsAttribute:", - "_autoLockStepper", - "_setKnobThickness:usingInsetRect:", - "lockRequestWithSession:URI:duration:", - "_contextMenuTarget", - "setCacheSize:", - "setDefaultPreferencesClass:", - "_setAllPossibleLabelsToFit:", - "setDeltas:", - "vrTrack", - "recursiveSetImpliedPropertiesForAnimation:object:keyPath:targetValue:", - "initWithCGLContext:pixelFormat:colorSpace:composition:", - "iconAsAttributedString", - NULL, - "_setNeedsToolTipRecalc:", - "setSelectedRecords:", - "setStyleMask:", - "fireDate", - NULL, - NULL, - "_shouldValidateMenuFormRepresentation", - "_autosaveForTimer:", - NULL, - "updateImageView", - "_viewGlobalFrameDidChange:", - "_invalidateOrComputeNewCursorRectsIfNecessary", - "foreignKeyConstraintDefinitions", - "setShowsAlpha:", - "characterRangeForGlyphRange:actualGlyphRange:", - "_startTableRowDefinition", - "stringWithCString:encoding:", - "initWithNotificationCenter:", - "setBrowser:", - NULL, - "_redisplayCellForNode:", - "favoriteAttributesForName:", - "_viewDidDrawInLayer:inContext:", - "_updateIndicators", - NULL, - "nts_LaunchABDIfNeeded", - "setImagingModeAllowsGWorld:", - "generateMetadataDescription", - "sharedTextRulerOptions", - "updateMultiValue:forProperty:changes:", - "_valueAsFilePath", - "_appInactive:", - "_descriptorByTranslatingString:ofType:inSuite:", - NULL, - "frameCenterRotation", - "addMigratedStoreToCoordinator:withType:configuration:URL:options:error:", - "usesUnnamedArguments", - "setPosition:ofDividerAtIndex:", - "_caConfigFileExtension", - "_vCard21RepresentationOfRecords:", - "_loadMenuItemIconsIfNecessary", - "dataReferenceWithReferenceToURL:", - "initWithFileAttributes:", - NULL, - "setApertureMode:", - "handleFailureInMethod:object:file:lineNumber:description:", - "propertyCache", - "_mouse:force:", - "isLocationRequiredToCreateForKey:", - "deleteConnection:", - "_rowHeaderShadowSurface", - "_fontFromDescriptor:", - "_setDiskHost:port:scheme:", - "setHorizontallyResizable:", - "postExternalChangeDEMNotificationForEngineType:onDisplayID:", - "initWithDuration:animationCurve:", - "descriptorWithDescriptorType:bytes:length:", - "setKeyEquivalent:", - "unlockFocus", - "setData:dataSourceIndex:subIndex:", - "drawInRect:onView:pinToTop:", - "_windowMovedToRect:", - "disableDisplayPositing", - "_propertyChanged:", - "editingHasEnded:", - "_setPageOrderFromPrintInfo", - "setAutomaticallyMinimizeRowMargin:", - "queryNode", - "legendVisible", - "_countForKeyPath:", - "objectByApplyingXSLTString:arguments:error:", - "showGuessPanel:", - "originalImagePathForRecent:", - "_scriptingObjectAtIndex:inValueForKey:", - "supportedPixelBufferFormatsForFormat:", - "databaseChangedForUserInfo:groupsChanged:peopleChanged:", - "mouseMoved:", - "appendClause:forKeyPath:allowToMany:", - "isPartialStringValid:proposedSelectedRange:originalString:originalSelectedRange:errorDescription:", - "_middleViewFrameChanged:", - "willCurrentItemBeExportedToiPhoto", - "_booleanValueForAttributeKey:fromElement:", - "browser:writeRowsWithIndexes:inColumn:toPasteboard:", - "fileExtensionHidden", - NULL, - "setAutoBackupEnabled:", - "_smallEncodingGlyphIndexForCharacterIndex:startOfRange:okToFillHoles:", - "setMaxViewFrameSize:", - "closeAllDocuments", - "shouldAntiAlias", - "scaleSegment:newDuration:", - "dataWithContentsOfURL:error:", - "compareObject:toObject:", - NULL, - "_hitTestForEvent:atColumn:row:", - "createBoxDictionary", - "parseTEL", - "_limitedViewMenuItemWantsRedisplay:inRect:", - "loadImageWithName:", - "collapseGroup:", - "setupWindowNotifications:", - NULL, - "TIFFRepresentationOfImageRepsInArray:usingCompression:factor:", - "_releaseEffect", - "previewView", - "_setEntityTag:", - "accessibilityOverriddenAttributes", - "performSublayout", - "zeroSymbol", - "_setAutoPositionMask:", - "hasUnsavedChanges", - "openGLUnlock", - "_updateNameFieldContentsFromHideExtensionButtonState", - "finishAddingGroupDictionaryRepresentations:recordsByUniqueId:", - "_fieldEditorUndoManager", - "_nextNonHiddenColumnFromColumn:", - "subEffectWithID:", - "controlTextDidEndEditing:", - "setAutosaveName:", - "persistentStoreCoordinator", - "clearsBackground", - "initWithAppleEventCode:alernativeTypeDescriptions:", - NULL, - "Z", - "_deallocateGState", - "setOrientation:", - NULL, - "isCopyingOperation", - NULL, - "replaceGlyphAtIndex:withGlyph:", - "_sendSelectionChangedNotification", - "textEditor", - "sourceOfType:", - "_userCanSelectIndex:", - NULL, - "setAlwaysUsesMultipleValuesMarker:", - NULL, - "loadColorLists", - "slideshowWillStart", - "countOfInputWhiteParams", - "initWithContextAttributes:", - "_scriptingCanAddObjectsToValueForKey:", - "recordSnapshot:forObjectID:", - "suspendRendering", - "startNicestRendering", - "stateKeysWithIdentifier:", - NULL, - NULL, - "setPublicRecord:", - "getProposedHUDFrame", - "_registrationDictionaryForUnitNamed:", - "_setStatesImmediatelyInObject:mode:triggerRedisplay:", - "currentConversation", - "setCountKeyPath:", - "isCustomProperty:returnType:customProperty:addressBook:", - "indexPathForOutlineView:row:", - "_affectedExpandedNodes:", - "stepKey:elements:number:state:", - "nts_ImportMailRecentsFromMetaKitIfNeededIntoContext:", - "setEchosBullets:", - "_hasActiveRequest", - "queryStringChangedForSearchController:", - "sharedPrintInfo", - "_stopAutoExpandingItemFlash", - "_portFromSelector:", - "CGX_initWithTexture:size:flipped:isDest:", - "_stepperCellValueChanged:", - "_web_looksLikeAbsoluteURL", - "_updateRefreshTimer", - "adjustedWindowFrameForOpening:", - "graphicsContextWithAttributes:", - "_processEndOfEventNotification:", - "blueColor", - "_parseDocumentAttributes2", - NULL, - "showsInvisibleCharacters", - "_characterIndexForMoveBackwardFromSelectedRanges:", - "initComponent", - "_accessibilityToolbarItemLabelAtIndex:", - "_drawBezelBorder:inRect:", - NULL, - "setServicesMenu:", - "initWithIndexesInRange:", - "IKEditPanelLocalizedString:", - "controlAlternatingRowColor", - "setFileType:", - "initWithDOMRange:", - "updateAndOrUI", - "setActions:", - "_compiledScriptID", - "urlPathRelativeToPath:", - "_supportedPixelFormatsForContext:compatibility:", - "mergeMultiValue:forProperty:", - "replyToApplicationShouldTerminate:", - "_specifiesSetting", - "_shouldAutoscrollForDraggingInfo:", - "setBinaryAttributes:", - NULL, - "_hasBackgroundColor", - "initWithContentsOfURL:", - "_emptyRulePartSubviews", - "endDrawingInView:", - NULL, - "resetDisplayedMemberSubrows", - "cacheResolutionInfoForResolution:createIfNeeded:", - "_highlightSelectedItem:", - "_swapToolbarItemViewerPreviousToView:", - NULL, - "_removeTabViewItems:", - "isToManyCountKeyPath:", - "parser:foundAttributeDeclarationWithName:forElement:type:defaultValue:", - "imageRepWithCIImage:", - "_codeSigningUsage", - "parseVERSION", - "_drawToolbarTransitionIfNecessary", - "_setCSR:", - "setIsDraggingOver:", - "animatedCellsArrayCache:", - "stringWithContentsOfFile:usedEncoding:error:", - "_attrStatusString:status:", - "presentableName", - "_loadScriptSuites", - "initWithName:color:image:", - NULL, - "timebase", - "initWithPage:atPoint:", - "contextWithCGLSContext:pixelFormat:options:", - "setWindowsNeedUpdate:", - "sharedBuddyStatus", - "initWithKeychainItem:", - "initWithCGImage:", - "setSubject:", - "_editNode:", - "_drawGrid:", - NULL, - "shouldAlwaysUpdateDisplayValue", - "nts_PopulateWithDictionary:withRecordMapping:generateIds:includeCoreProperties:addressBook:", - NULL, - "_didDeleteFile", - "_flattenMenu:", - "_setLayerBackedOpenGLContext:", - "requiresProxyAuthCredentials", - "nicestImageForSize:forGLRendering:cacheIt:", - "setFirstWeekday:", - "minimalFormInContext:ofPredicate:", - NULL, - "interruptExecution", - "addConflictingRecord:", - "_sendDirectoryDidChange", - "sendReleasedProxies", - "_liveResizeCachedImage", - "structureValue", - "isAbsolutePath", - "resetRecordsWithUniqueIds:", - "_deactivate", - NULL, - "superclass", - "xmlNode", - "samplerWithImage:options:", - "_startLiveResize", - "alignOnPixelValue", - "_scriptingIndexOfObjectForSpecifier:", - "sharedSystemTypesetterForBehavior:", - "_recalcRectsForCell:", - "groupIndexForGridIndex:", - "sharedColorPanelExists", - "handleNotification:", - "setPageScroll:", - "_doPath", - "_setShowPlayButton:showPageButtons:", - "regularImageForState:", - "toggleTraditionalCharacterShape:", - "threadedExecScript:", - "attachedViewFrameDidChange:", - "_focusRingFrameForFrame:cellFrame:", - "_briefDescription", - "parentGroupsIncludingSubscriptions", - "initWithIndexSet:", - NULL, - "_inputController", - "scaleBy:", - "isThreadRunning", - "createCGColor", - NULL, - "cacheRect:", - "_SMPTETime", - "getArgumentTypeAtIndex:", - "positionOfGlyph:struckOverGlyph:metricsExist:", - "_tempHideHODWindow", - "initWithImageManager:openGLContext:options:", - NULL, - "_displayID", - "principal", - "_getRowRange:columnRange:inRect:", - "fixParagraphStyleAttributeInRange:", - "_outlineIsOn", - "_sendActionAndNotification", - "download:willResumeWithResponse:fromByte:", - "characterSetWithContentsOfFile:", - "releaseCGLPixelFormat:", - "_leftmostViewFixedHorizontalPadding", - "allowEditing", - "resourceForData:preferredFilename:", - "autoresizingMask", - "frameOfDocumentAtIndex:", - "_invertCurrentEffect", - "xAtColumn:", - "_updateFirstItemIfNecessary", - "cellClass", - "doCommandBySelector:", - "_closedHandCursor", - "multiStatusRequestWithURL:method:", - "initTitleButton:", - "isStateKey:", - NULL, - "initializeCell:", - "dataWithContentsOfURL:options:error:", - "_draggingUpdatedForFilenameDrop:inProposedItem:", - "contextWithBitmap:rowBytes:bounds:format:options:", - "loadItemAtIndexWithTransition:", - "nts_GroupsAtRemoteLocation:withAddressBook:", - "previewPanel:frameForURL:", - "downloadDidFinish:", - "setIsInInterfaceBuilderSimulator:", - "safeURLFromString:", - "dragImageForSelectionWithEvent:origin:", - NULL, - NULL, - "_moveParent:andOpenSheet:", - "_rightMouseDownOnSlice:withEvent:", - "_worksWhenModalOrChildOfModalWindow", - "_makeCellForMenuItemAtIndex:", - "noteFileSystemChanged", - "firstComponent:", - "outlookWebAccessPathFromUserString:withUserName:", - "colorAtX:y:", - "setSelectedFont:isMultiple:", - "result", - "initWithPasteboard:error:", - "releaseDisplayList", - NULL, - "redBayerReconstructionProcessedROI:destRect:", - "_updateUnprocessedOwnDestinations:", - "_changeSortDescriptorsForClickOnColumn:", - "_setVersionNumber:", - "moveWordRight:", - "knobProportion", - "_propagateBackgroundStyle", - "tooltipStringForPoint:tooltipBounds:", - NULL, - "defaultNamespaceForURI:", - "indexLabelAtIndex:", - "attributesAtIndex:effectiveRange:inRange:", - "_setLengthOfStatusItem:to:", - "object:withObservance:willChangeValueForKeyOrKeys:forwardingValues:", - "initWithNSImage:", - "beginParagraph", - "updateDragProgress", - "_surfaceBackedOpenGLContext", - "CA_stringByDeletingLastPathComponent:", - "keyForPort:", - "setPrefersColorMatch:", - "selectedImageForControlTint:", - "_enableItems", - "_releaseCapture:", - "__frameChanged:", - "pairWithKey:value:", - "_delegateRespondsToShouldShowCellExpansion", - "_isInCustomizationMode", - "_commonAwake", - "_ipAddress", - NULL, - "_writeRTFInRanges:toPasteboard:", - "setPackage:", - "autoconfigureFromProtocol:", - "_documentIndexWithDelta:", - NULL, - "sobelEdgesROI:destRect:", - "nonSelectedTabTextColor", - "initWithDefaultAttributes:", - "_endOfLastNonHiddenColumn", - NULL, - NULL, - "nicestRenderingPriority", - "prepareForPrimaryKeyGeneration", - "_setNoVerticalAutosizing:", - "_drawWindowsGaugeRects:", - "undoHack:", - "groupSelectionChangedInPeabody:", - "ISS_URLWithoutPassword", - "setShouldResolveExternalEntities:", - NULL, - "_setKeyWindow:", - "maxSize", - NULL, - "autoDistinct", - NULL, - "_createPBuffer", - "selectRowsWithStatement:", - "lineFragmentUsedRectForGlyphAtIndex:effectiveRange:allowLayout:", - "isSelectionByRect", - "errorProc", - "defaultStringDrawingTypesetterBehavior", - "fileIsImmutable", - "isMobileHomeUser", - "_containerObservesTextViewFrameChanges", - NULL, - "previewPanel:didLoadPreviewForURL:", - "_menuDidEndTracking:", - NULL, - "getRequestWithSession:URI:ifModifiedSince:includeRangeHeader:rangeStart:rangeEnd:localDestination:", - "_rename:as:", - "_updateOkButtonEnabledState", - "setScanLocation:", - "_setTrustWithPolicies:", - "insertObject:atIndex:forKey:", - "cleanupChallenges", - "_createFloatStorage", - "_objectClassName", - "_printForCurrentOperation", - "_compareSingleArrayWithRecordValue:", - NULL, - NULL, - "elementsForName:", - "canDecodeDownloadHeaderData:", - "setPathSeparator:", - "subtype", - "dataRepresentationFromCGRepresentationWithCompressionFactor:", - "_storeDeallocated", - "horizontalScroller", - "eventClass", - "quickTimeChapterTrack", - NULL, - "domainName", - "appendData:length:", - "sampleSize", - "drawKnob", - "doSendAppleEventOfKind:", - "addSublayer:", - "_integrateReferenceInstance:", - "expressionValueWithObject:context:", - "initWithCatalogName:colorName:genericColor:", - "fetchRowForObjectID:", - "imageWithTexture:size:options:", - "takeStringValueFrom:", - "gotoNextItem", - "setNeedsExecution", - "isAddressBook", - "speechSynthesizer:didEncounterSyncMessage:", - "delayedProcessLogonButtonClick:", - NULL, - "tableView:didDragTableColumn:", - NULL, - NULL, - "_newSelectStatementWithFetchRequest:ignoreInheritance:", - "completes", - "setSession:", - "extendedAttributeForKey:atPath:error:", - "_undoStack", - "fileNameExtensionsAndHFSFileTypes", - "countForFetchRequest:inContext:", - NULL, - NULL, - "transformedImage", - "validateValue:forKey:error:", - "_setHideWithoutResizingWindowHint:", - "_cleanUpConnectionWithSynchronizePeerBinders:", - "uniqueNameWithBase:", - "_revealoverInfoForCell:cellRect:", - "PDFOperationWithView:insideRect:toData:", - "attributesForExtraLineFragment", - "controlAlternatingRowBackgroundColors", - "documentViewResized:", - "invalidate", - "_invalidateTabsCache", - "keyPathsForValuesAffectingValueForKey:", - "_currentModifierFlags", - "_volumeSupportsLongFilenamesForRefNum:", - "setInsertsNullPlaceholder:", - "directoriesPane", - "_web_stringRepresentationForBytes:", - "_runArrayHoldingAttributes", - NULL, - "getNumberOfInputImagePorts", - "accessibilityFocusedUIElement", - NULL, - "rotationMode", - NULL, - "timeLinesCount", - "_noteFirstTextViewVisibleCharacterRangeIfAfterIndex:", - "isSessionOnly", - "indexOfObject:inRange:", - "ISS_hasKey:", - "_shouldDispatch:invocation:sequence:coder:", - "_completionsFromDocumentForPartialWordRange:", - "setSynchronized:", - "setSelectionMode:", - "isDirectoriesPaneVisible", - "_RTFWithSelector:range:documentAttributes:", - "_endCustomizationMode", - NULL, - "mipmapDataInfoWithUID:", - "_drawDropHighlightBetweenUpperRow:andLowerRow:atOffset:", - "dataWithContentsOfURL:", - "_globalIDForObject:", - "replaceChildAtIndex:withNode:", - "pathWithComponents:", - "_hasDefaultButtonIndicator", - "initWithGroup:addressBook:", - "_stopGotoWithCode:", - "offsetByX:Y:", - NULL, - "bitmapRepresentation", - "trackAtIndex:", - NULL, - "stopExecution:", - "colorSpaceName", - "_contextMenuImpl", - "removeFileWrapper:", - "titleComponentAtIndex:", - "_uploadLocalFileAtPath:toPath:", - NULL, - "isEqualToOrderedSet:", - "accessibilityMinimizedAttribute", - "columnsToFetch", - "nameValueForConjoinedSearchElement:comparison:", - NULL, - "preventWindowOrdering", - "_sizeHasBeenSet", - "containsDisplayValue:", - "imageRepWithPasteboard:", - "addPerson:", - "getLocalizedLabels:andLocalizedValues:", - "hasBleedBox", - "setContentWidth:type:", - NULL, - "_setIsContextualMenu:", - "CA_interpolateValue:byFraction:", - "drawBulletAtPoint:shape:inContext:", - "_cellContentForNode:columnIdentifier:", - "_refreshFormatDescriptionsAttributeFromCallback", - "_setIntegerValue:", - "databaseOperationForObject:", - "processEntityReference:", - NULL, - "setCurrentContext:", - "setMoviePort:", - "_commonSecureTextFieldInit:", - "findFontLike:forString:withRange:inLanguage:", - "setFrameLoadDelegate:", - "_allowsActiveInputContextDuringMenuTracking", - "selectedAttributes", - "_hasImage", - "slideshowPrev:", - "objCType", - "accessibilityIsMainWindowAttributeSettable", - "_setOrganization:", - "_previewCurrentPageForPrintOperation:", - "_guess:", - "setRetainsRegisteredObjects:", - "stopCurrentPlayerIfAny", - "slideWindow:withNewContentView:direction:duration:delegate:", - "_engravedDisabledForegroundTextColor", - "openFile:ok:", - "_shouldUseAlternateImageForSegment:", - "recentRepositoryWithDomainName:", - "addStatistics:", - "keyViewSelectionDirection", - "_goToHistoryState:", - "_handleFileListModeChanged:", - "moveToFront", - "userInfo", - "_postItemDidCollapseNotification:", - "searchFieldCell:shouldChangeCancelButtonVisibility:", - "getAttribute:", - "initWithDataSource:ascending:", - NULL, - "beginEdits", - "fireDidSelectComposition", - "_postInvalidCursorRects", - "_arrayByTranslatingAEList:toType:inSuite:", - "_initParsingInformation", - "toolbarSelectableItemIdentifiers:", - "fileExistsAtPath:isDirectory:", - "placeHolderFrame", - "displaysMarkupAnnotations", - "_setBlobForCurrentObject:", - "_containsTrackingRect:", - "editSmartGroupSheetDidEnd:returnCode:contextInfo:", - "_threadedGenieFXFromWindow:toWindow:", - "numberWithUnsignedInt:", - "mergeInVariations:", - "canInitWithDataReference:fileTypes:", - "fireDidLoadComposition:", - "_minLinesWidthWithSpace", - "layoutTab", - "setVisible:", - "originalTemplate", - "setReadTimeOut:", - "_validateAsCommonItem:", - "_fastDrawString:attributes:length:inRect:graphicsContext:baselineRendering:usesFontLeading:usesScreenFont:typesetterBehavior:paragraphStyle:lineBreakMode:boundingRect:padding:scrollable:", - "_setUpDefaultTopLevelObject", - "_releaseLiveResizeCachedImage", - "_fullPathForService:", - "_genericUpdateFromSnapshot:", - "shouldPersist", - "_writeRulerInRange:toPasteboard:", - "_setNumVisibleColumns:", - "createInfoDictionary", - NULL, - "saveFavoritesToDefaults", - "setStandardUserDefaults:", - "postNotificationName:object:userInfo:options:", - "_editorCommittingFailedForSaveToURL:ofType:forSaveOperation:delegate:didSaveSelector:contextInfo:", - "setMouseUpAction:", - "invokeServiceIn:msg:pb:userData:error:", - "__oldnf_containsColorForTextAttributesOfNegativeValues", - "setNeedsSizing:", - "_setBackingStore", - "emailAddresses", - "IKIPImageWithMaxSize:withLeftPad:", - "_showFilesForBrowserType:", - "dissolveToPoint:fraction:", - "cacheKeyFrames", - "_dirtyRegion", - "userFontOfSize:", - "arrowCursor", - "_selectedScopeButton", - "setAnnotations:", - NULL, - "_initWithImpl:uniquedFileName:docInfo:imageData:parentWrapper:", - "scriptingValueForSpecifier:", - NULL, - "endHeaderComments", - "_changeShadowAngle:", - NULL, - "setupDisplay", - NULL, - "_validateVisibleToolbarItems", - "setEnabled:forSegment:", - NULL, - "setLoops:", - "_centerScanPoint:", - NULL, - "_addGrammarAttributesForRange:details:", - "italicAngle", - "allowsMultipleSubrowSelection", - "cellEnabled:", - "initWithPatch:", - "irisOpened:", - "_keyForNode:", - "removeResource:", - "setCanCreateDirectories:", - "_searchFieldCancel:", - NULL, - "_processRecentlyForgottenObjects:", - "_positionAndResizeSearchParts", - "addAppSmartFolderForNode:", - "tableView:selectionIndexesForProposedSelection:", - "_prepareGizmoPositionUndo:", - "startUsingDevice:", - NULL, - "parser:foundComment:", - "setTakesTitleFromPreviousColumn:", - "_insertionIndexForGroup:", - "setCustomInterpolation:", - "sharedAEDescriptorTranslator", - "_removeFontDescriptor:fromCollection:save:", - "rangeOfComposedCharacterSequencesForRange:", - "_postInitialization", - "vectorWithX:", - "allPeopleForRemoteLocation:", - "childArray", - "_insertObject:atArrangedObjectIndexPath:objectHandler:", - "currentSearch", - "_saveCredential:forProtectionSpace:isDefault:", - "_recursiveDisplayAllDirtyWithLockFocus:visRect:", - "_scriptingSetValue:forKey:", - "removeObjectFromSubNodesAtIndex:", - "_UTIextensionForMIMEType:", - "layerForThumbnail:", - "createImageFromNSFileWrapper:", - "stopRunning", - "insertItemWithTitle:atIndex:", - "_sizeTableColumnsToFitWithStyle:", - "draggedDistance", - "disposeTrack:", - "_setColorPanelColor:force:", - NULL, - "noDepthBuffer", - "setRoundingBehavior:", - "currentSearchCol", - "resizeIndicatorRect", - "_editorCommittingFailedForPrintDocumentWithSettings:showPrintPanel:delegate:didPrintSelector:contextInfo:", - "setGroupingSeparator:", - "importPromisedFiles:intoGroup:", - NULL, - "checkNetworkDiagnosticError", - NULL, - "customInputPorts", - "addDestinationToDictionaryRef:", - "_resetToolTipIfNecessary", - "_toolbarLabelFontSize", - "moveForwardAndModifySelection:", - "instanceMethodSignatureForSelector:", - "accessibilitySetSelectedRange:", - "localizationDictionary", - "writeToFile:options:error:", - "appliesImmediately", - "resetMetaData", - "resolveConflicts:", - "SCTExtractTitle", - "_registerForCompletion:", - "boundsForButtonCell:", - "clickCount", - "ciContext", - "displayedProperties", - "writeSuperscript:", - "setIntendedLanguage:", - "longForKey:", - "CA_stringByAppendingPathExtension::", - "requestBodyData", - "_dictionaryFromUser:", - "vertBlur32ROI:destRect:", - "_setShouldPostEventNotifications:", - "_updateKeychainItem:", - "builtInLabels", - "setAttributes:range:", - "_removed", - "selectNextRangeForward:", - "_defaultFontSet", - NULL, - "_fixKeyViewForView:", - "addDelta:forManyToManyKey:", - "dataValueOfProperty:", - "_iconSize", - "controlFillColor", - "_updateSoundShouldLoopByStoredLoopFlag", - "newObjectIDForToOne:", - "_sizeTableColumnsToFitForAutoresizingWithStyle:", - "governingAliasForKeypathExpression:", - "addKeyToBeUpdated:", - "_fastDrawGlyphs:advances:length:font:color:containerSize:usedRect:startingLocation:inRect:onView:context:pinToTop:", - "scheduleTrickleSyncRetry:allowingLock:", - "maxCharacterSetSize", - "defaultSortDescriptors", - "pathVector", - "setInputColor0:", - "initUnlockWithSession:URI:lockToken:", - "timerWithTimeInterval:invocation:repeats:", - "rootEntity", - "setFilename:", - "privateFrameworksPath", - NULL, - "_reactToFontSetChange", - "windowControllerWillLoadNib:", - "prebindMipmapItem:withUID:", - "removeEventHandlerForEventClass:andEventID:", - NULL, - "findPPDFileName:", - "setQuality:", - NULL, - "menuItem", - NULL, - "_setSubviewsAreAdjusted:", - "nts_PeopleAtRemoteLocation:withAddressBook:", - "testPart:", - "setAutomaticallyManageVisibility:", - "_scriptingFileDescriptor", - "_deselectAllExcept::andDraw:", - "parseADD", - "listMembersRequestWithSession:URI:showHidden:", - "EPSOperationWithView:insideRect:toData:printInfo:", - "quickTimeMovie", - "doCalcDrawInfo:", - "setByAddingObject:", - "_parseSummaryInfo:", - "_scrollArrowHeight", - "_configurePlusButtonByRowType:", - "_sortedAETEPropertyDescriptions:", - "_setJavaClassesLoaded", - "copyWithZoneDeep:", - "prepare", - "initWithBundleIdentifier:", - "initWithOpenGLID:size:offset:premultiplied:deleteWhenDone:", - NULL, - "_buffersForRegisteredFunctions", - "_typeSelectStringForColumn:row:", - "intersectsHashTable:", - "abbreviationForTimeInterval:", - "setPrimitiveLastName:", - "_mediaNodeTitle", - "allocWithZone_10_4:", - "setAllowsNonContiguousLayout:", - "initWithSlideshowEngine:", - "_hasImageCache", - "_layoutSublayersOfLayer:", - NULL, - "setScriptErrorExpectedTypeDescriptor:", - "applyFunctionOnInputPorts:context:", - "scanLongLong:", - "isSubscribed", - "speechFeedbackServicesRef", - "_restore", - "grayColor", - NULL, - "_realMaximumRecents", - "criteriaSliceForCriteria:values:", - "initWithRole:index:parent:", - "composer", - "_executeSelectPrevious:didCommitSuccessfully:actionSender:", - "_createViews", - "packedBytesPerRowForWidth:", - "setTitleWidth:", - NULL, - NULL, - "initRegularFileWithContents:", - "setCellAttribute:to:", - "isContinuous", - NULL, - "setFormatWidth:", - "_lightweightHandleChildChanged:parents:property:", - "readerInitialized", - "loadAndReturnError:", - "sortedArrayUsingFunction:context:hint:", - "_initWithSet:", - "_printSessionForSetting", - "_handleRootNodeChanged:", - "dateWithTimeInterval:sinceDate:", - "setNavNodeClass:", - NULL, - "initWithRenderer:userData:renderSize:renderContext:", - "_discloseCertificates:", - "_setLineBorderColor:", - "writeLockFile", - "thickness", - "sourcePort", - NULL, - "parentPatch", - "transformRect:", - "writeSafelyToURL:ofType:forSaveOperation:error:", - NULL, - "setNextKeyView:", - "canBeDisabled", - "addSubIndex:", - "customDisplayName", - "propertyDescriptionFromKey:implDeclaration:presoDeclaration:suiteName:className:", - "setExponentSymbol:", - "contentRectForFrameRect:styleMask:", - "tableViewColumnDidMove:", - "sortUsingDescriptors:", - "cachedCustomPropertiesByNameForRecordType:", - "translateXBy:yBy:", - "_colorSpacesForColorPanelPaneUsingModel:", - "encodeBytes:length:forKey:", - "deserializeNewKeyString", - "fetchMaxPrimaryKeyForEntity:", - "recordDeleteForObject:", - "indexPath", - "_doUserSetAttributes:removeAttributes:", - "isGroupsPaneVisible", - "destinationInstancesForEntityMapping:sourceInstance:", - "operatingSystem", - "endLoadInBackground", - "highlighted", - "_areIPAddressesValid:", - "allGroupForRemoteLocation:", - NULL, - "setFileName:", - "_addVersionIdentifiers:", - "loadKernel", - "colorWithCatalogName:colorName:", - "isReadOnlyIgnoresInert:", - "allocIndexesBuffers:", - "mkcolRequestWithSession:URI:token:", - "selectedFont", - "_finalizeDirectTakePicture", - "highlightedBranchImage", - "_maxForKeyPath:", - "_doModifySelectionWithEvent:onColumn:", - "boundingBox", - "sharedHTTPCookieStorage", - "_effectiveJobTitle", - "directoryContentsAtPath:matchingExtension:options:keepExtension:error:", - "setSortDescriptors:", - "_initDefaultNamespaces", - "start:", - "useFont:", - NULL, - "imageSize", - "_compatibility_takeValue:forKey:", - "makePreviousSegmentKey", - "_moveRightWithEvent:", - "setOptLock:", - "pathForEmbeddedTool:", - "setPopupExtension:saveType:saveCreator:", - "removeWindowController:", - "createPixelBufferFromPixelBuffer:bounds:flip:options:", - "currentNode", - "_descriptorByTranslatingDate:ofType:inSuite:", - "processInfo", - NULL, - "_menuImpl", - "cacheNodeForObjectID:", - "_scrollToPosition:", - "_copyAcquiredViewHierarchyLock", - "prepareOpenGL", - "normalizeRect:", - "updateFilterNotification:", - "setDisableFlash:", - NULL, - "showFindIndicatorForRange:", - "copyFont:", - "tableView:sortDescriptorsDidChange:", - "_constrainAndSetDateValue:timeInterval:sendActionIfChanged:beepIfNoChange:returnCalendarToHomeMonth:preserveFractionalSeconds:", - NULL, - "setAutosavedContentsFileURL:", - "beginPictureTakerSheetForWindow:withDelegate:didEndSelector:contextInfo:", - "isAnimatedGifs", - NULL, - NULL, - NULL, - NULL, - NULL, - "_synchronizeExpandedNodesWithOutlineExpandedItems", - "_getInputImage", - "editorDidEndEditing:", - "characters", - "drawTitleWithFrame:inView:", - "buildString", - "_valueTransformerNameForBinding:", - "setFlipCellsHorizontally:", - "isInputWhiteParams", - "_setSuppressAutoenabling:", - "activeConversationChanged:toNewConversation:", - "_delayedEnableRevealoverComputationAfterScrollWheel:", - "removeToolbar", - "addCacheNodes:", - "filteredIndexForActualIndex:", - "setAllowsColumnSelection:", - "_hasScaledBackground", - "_hasHiddenParts", - "_setTrackingRect:inside:owner:userData:", - "originalImage", - "_clockAndCalendarFillDayCell:withColor:inFrame:inView:", - "remoteURL", - "setEventKind:", - "writeToDataReference:withAttributes:error:", - "_fetchUserSetHideExtensionButtonState", - "_performConnectionEstablishedRefresh", - "tabView:didSelectTabViewItem:", - "sourceModel", - "_selectObjectsAtIndexPaths:avoidsEmptySelection:sendObserverNotifications:", - "activateSliderTimer", - "setQueryNode:", - "itemType", - "_forceUpdateFocusRing", - NULL, - "tableColumns", - "accessibilityPositionAttribute", - "_adjustFontOfObject:mode:triggerRedisplay:compareDirectly:toFont:", - "_indexForNode:inGraph:", - "backgroundIsLight", - "setBookID:", - "drawSortIndicatorWithFrame:inView:ascending:priority:", - "_setWantsKeyboardLoop:", - "meta", - "initialFieldsForProperty:", - "_appProperties", - "_dateFormatterForDetailLevel:", - "drawImage:inRect:fromRect:", - "printWithInfo:autoRotate:pageScaling:", - "_savedSearcheNodeTitle", - "setAltIncrementValue:", - "_uniqueProxyPortKeyFromPort:", - "_forceUpdateLayerTreeRenderer", - "_mouseUpWithEvent:forView:", - NULL, - "_mainThread", - "selectRecord:byExtendingSelection:", - "_clearRowHeightCache", - "postNicestDraw", - "outtype", - "resumeWritingOperationWithScheduledTime:", - "tokenField:hasMenuForRepresentedObject:", - "movePages:", - "stringWithCapacity:", - "defaultLabelFontAttribute", - "setNextText:", - "_addCollection:options:sender:", - "_createMungledDictionary:", - "decompressionAccuracy", - "iconImageForIconRef:", - "_calendarFirstWeekday", - "setInPalette:", - "realCount", - "accessibilityAttributeValue:forParameter:", - "setExcludedFromWindowsMenu:", - "_notePendingRecentDocumentURLsIfNecessary", - "canZoomOut", - "mixedStateImage", - "_cancelWithErrorCode:", - "switchToFullScreen:", - NULL, - "_didChangeArrangementCriteriaWithOperationsMask:useBasis:", - "_backgroundTransparent", - "nts_SharedDBCache", - "stringWithUTF8String:", - "__ikSetupGLContext:", - "initWithController:", - "_old_drawKnob", - "propFindWithSession:withDepth:URI:lookingForProps:includingParent:", - "_fileExtensions", - "setRawValue:", - "beginUpdate", - "thumbnailWithSize:antialiased:qualityRequested:qualityProduced:", - "callbackObserver:", - "persistentStoreForURL:", - "_customToolbarLabelAttributeTable", - "draggedImage:beganAt:", - "getHyphenLocations:inString:", - NULL, - "_menuDelayTimeForSegment:", - "initWithVoice:", - "initWithCocoaName:", - "_decrementPage:", - "superscriptRange:", - "selectRow:subrow:byExtendingSelection:", - "_publish:", - "_defaultSecondaryColor", - "setResultList:", - "metalBackgroundUsingTexture:andWidth:", - "_sendDelegateWillDisplayOutlineCell:inOutlineTableColumnAtRow:", - "sqliteVersion", - NULL, - "pageLayout", - "loadCell:", - NULL, - "hasHorizontalRuler", - "timeZoneForSecondsFromGMT:", - "minValue", - "setSelectedGroups:", - "drawLoadingFrame", - "_validateMultipleValue:forKeyPath:atIndexPath:error:", - "_updateTableColumn:withWidth:", - "flushBufferedKeyEvents", - "_contextDidDealloc", - "removeExtendedAttributeForKey:atPath:error:", - "setSuckEffect:", - "localNameForName:", - "_rangeByTrimmingWhitespaceFromRange:", - "createTransition:forView:", - "_textFieldWithStepperKeyDown:inRect:ofView:", - "dictionaryWithValuesForKeys:", - "delayedBackground:", - "preferredEdge", - "classForPlugInIdentifier:", - "_drawLiveResizeCachedImage", - "_unarchiving", - "_hasItemTooltips", - "_extendItem:withRow:", - "parse", - "ignoreModifierKeysWhileDragging", - "_updateForTracking", - "nicestRenderingFinalizeExpendStepWithCell:withMipmap:withMipmapCopy:", - "setSearchElement:", - NULL, - "showsRollover", - "persistentStore", - "setSwitchedToToFullScreen:", - "PDFViewOpenPDFInNativeApplication:", - "showRenderedTextWithInfo:renderMode:textColor:alpha:", - "performSelectorDelayed:withObject:soon:", - "_setKeyboardFocusRingNeedsDisplay", - "copyStandardSidebarNodes", - "performSelector:target:argument:order:modes:", - "textView:clickedOnLink:", - NULL, - "_forceUseDelegate", - "defaultLineHeightForFont", - "canCompleteForforPartialWordRange:", - "renderPatch:time:arguments:", - "valueForBinding:atIndexPath:resolveMarkersToPlaceholders:", - "hasChapters", - "_resizeToolbarImageRepViewToFit:", - "removeColor:", - "_computeOriginForRow:cacheHint:", - "_initShared", - "_setResultingCertificate:", - "_changeFirstResponder", - NULL, - "createCroppedImageWithRect:", - "_titleAttributes", - "closeDownContentView", - "attributesForCharacterIndex:", - "_clearAnimationInfo", - "_localizationPolicy", - "rulerView:shouldRemoveMarker:", - "_getBracketedStringFromBuffer:string:", - "launchPreview:", - NULL, - "setLeftMargin:", - "addToolTip:inRect:", - "window:shouldDragDocumentWithEvent:from:withPasteboard:", - NULL, - "_setFirst:", - "clickedPathComponentCell", - "initWithExpression:usingIteratorVariable:predicate:", - "_usesQuickdraw", - "willSave", - "columnContentWidthForColumnWidth:", - "CI_initWithAffineTransform:", - "_doUserRemoveMarkerFormatInRange:", - "stopObservingModelObject:", - "printFormat:", - "_saveTrustValues", - "bitsPerSample", - "setIcon:", - "setImage:orientation:duration:", - "decodeAllIntoBuffer:size:useZeroBytesForCRC:", - "_invalidate", - "_treeHasDragTypes", - NULL, - "url", - "hasEffect", - "_toolbarButtonOrigin", - NULL, - "_parseCommand", - "_lightBlueColor", - "setShowsShadowedText:", - "layerForName:", - "superscript:", - "_columnAtLocation:", - "setShouldLoadAttributes:", - NULL, - "initWithOrderedSet:copyItems:", - "sharedManager", - "splitView:constrainMinCoordinate:maxCoordinate:ofSubviewAt:", - "CGLPixelFormatObj", - "_userEmailAddressOfRequestor", - "_documentForURL:", - "lockWithPath:", - "_selectInTabView:itemWithLabel:", - "setAutovalidates:", - "setViewMovingToWindow:", - "editCellTitleAtIndex:withEvent:select:", - "_setPressedTabViewItem:", - "_storesDidChange:", - "removeFromSuperviewWithoutNeedingDisplay", - NULL, - "reallyRemoveAllObjects", - "hasPassword", - "fontNameFromAppearanceTokens:", - "_removeGrammarAttributeForRange:includeAccessibility:", - "prepareForReloadChildrenForNode:", - "displayedMembers", - "prefersAllColumnUserResizing", - "canResumeDownloadDecodedWithEncodingMIMEType:", - "compositeToPoint:operation:", - "updateWindows", - NULL, - "sendBeforeTime:streamData:components:to:from:msgid:reserved:", - "appendString:", - "updateGroupMembership", - "_cell_setRefusesFirstResponder:", - "insertionRectFromPoint:", - "drawWindowBackgroundRegion:", - "_old_drawKnobSlotInRect:highlight:", - "startObservingNode", - "_whiteRGBColor", - "previousValidKeyView", - "_recreateQuery", - "startThumbnailRefreshTimer", - "recoverArrowScrolling", - "_preloadDocumentAtIndex:", - "canCreateConnectionFromPort:toPort:", - "showNodeInDirectory:withDisplayNamePrefix:selectIfEnabled:caseSensitiveCompare:", - "endUploadTexture", - "setModality:withParentWindow:", - "_glyphDescriptionForGlyphRange:", - "_descriptorByTranslatingNull:ofType:inSuite:", - "_bottomLeftResizeCursor", - "intersectsSet:", - "_controlFileWritingForConnection:busNumber:fileControlToken:", - "moveSelectionLeft", - NULL, - "accessibilityIsSingleCelled", - "setNumStacks:", - "lastComponent", - "decimalNumberByRaisingToPower:withBehavior:", - "popup", - "pasteboardWithName:", - "drawText:inRect:attributes:alpha:deferred:", - "willRefresh:", - "_setInputImage:", - "hyphenGlyphForLocale:", - "defaultValueForInputKey:", - "_deselectPart:", - "_displayProfileChanged", - "croppingRect", - "_encounteredCloseError", - "leafKeyPath", - "drawWithExpansionFrame:inView:", - "toggleOrientation:", - "_orientationInPageFormat:", - "_prepareToMinimize", - "canRemove", - "_contentToFrameMinYHeight:", - "_selectItemsInRange:selected:", - "forceTransactionClosed", - "allocateGState", - "smallerButton", - "idle", - "dataUsingEncoding:allowLossyConversion:", - "_writableTypeForFileNameExtension:saveOperation:", - "_branchImageEnabled", - "setInspector:", - "authorizationViewDidAuthorize:", - "_setObject:", - "_lineGlyphRange:type:lineFragmentRect:lineFragmentGlyphRange:containerOrigin:isStrikethrough:", - "_failedTransactionWithRequest:error:", - "initWithHTML:baseURL:documentAttributes:", - "_getAttributes:includeValues:", - NULL, - "convertRect:toView:", - "_animatorTimerProc:", - "memberOfInputRampParams:", - "setAssociatedInputManager:", - "removeFontDescriptor:fromCollection:", - "_setTrackingHandlerRef:", - "_fileModificationDateForURL:", - NULL, - "_readImageIntoRange:fromPasteboard:", - "_prepareForDispatch", - "_defaultButtonCycleValue", - "removeObjectForCacheKey:", - "boundingRectForFont", - NULL, - "drawRowsInRange:clipRect:", - "registerNotificationsForMovie:", - "displayRectIgnoringOpacity:", - "_vCardRepresentationAsStringUsingImageCache:", - "_initBlock", - "_configureForDirectory:name:", - "_alignSize:force:", - NULL, - NULL, - NULL, - "buildElementsFromSmartGroup:", - "setAutoresizingMask:", - "removeColumnFilter:", - "_writeMultipleTextSelectionRanges:toPasteboard:", - "setFile:", - "initWithURL:cached:", - "testImage:", - "setBackgroundCheckerboardSize:", - "_setPreviousSizeAndDisplayMode", - "itemCount", - "initAddressWithLocalFromSocket:", - "fullPathForApplication:", - "_isShowingKeyboardFocus", - "changeWillBeUndone:", - "_calcVisibleColumnAreaAvailable", - "_resetGrid:", - "_windowDidLoad", - "_getImageAndHotSpotFromCoreCursor", - "blur:radius:kind:", - "_userVisibilityPriorityValues", - "startEditing:", - "_compareMultiLabelDictionaryNoKeyWithRecordValue:", - "_ikCommonInit", - "showsAlpha", - NULL, - "columnName", - "getPixel:atX:y:", - "fixFontAttributeInRange:", - "_isCachedSeparately", - "_setNextKeyViewFor:toNextKeyView:", - "copiesOnScroll", - "setNewValue:", - NULL, - "sharedInstanceForAddressBook:", - "setTitled:", - "setIsABMeImage:", - "isRunning", - "canRedo", - "removeAllActions", - "_updateImage", - "stop:", - "isFinishedDecoding", - NULL, - "_setGuesses:", - "previousItemDelta", - "accessibilityAttributedStringForRangeAttributeForParameter:", - "removeItems:", - "nts_SearchElement", - "_computeDragImageFromItemViewer:", - "_setRowHeaderTableColumn:", - "_invertedSkipSet", - "ISS_URLWithoutUsername", - "_loadImageKit", - "containerClassDescription", - "setLayoutFlags:", - "initListMembersWithSession:path:showHidden:", - "tokenField:readFromPasteboard:", - "distantFuture", - "loadFromDirectory:withBrowser:", - "fileTypeFromLastRunSavePanel", - "baseURL", - "textureUnits", - "setIconsForAnimationFilenames:", - "_reallyRemoveOldestSubthumbnail", - "_executeAllPragmaSettings", - "patternRepeat2ROI:forRect:userInfo:", - "setImageWithData:imageProperties:options:", - "nextData", - NULL, - "setImage:forControlTint:", - "boundOutlineView:isItemExpandable:", - "_unlock", - "initWithInteger:", - "setRoundDeterminateColor:", - "proxyFor:fauxParent:", - NULL, - NULL, - "decrementButtonWithParent:", - "imageRepWithCocoaName:", - "_advancedQueryStringPortion", - "colorPanelDidSelectColorPicker:", - "_visibleAndCanBecomeKeyLimitedOK:", - "removeIndexesFromIndexSet:", - "_setDefaultToolbarItemSetFromMenuItem:", - "_setWantsToActivate:", - "setReservedThicknessForAccessoryView:", - "CA_stringByExpandingTildeInPath:", - "toOneRelationshipKeys", - "subviewFrameAtIndex:", - "setExtensionHidden:", - "firstResponderView", - "_reconfigureSubviewsAnimate:", - "_setCGImageRef:", - "startIdleTimer", - "_setSizeHasBeenSet:", - "preferredFontNames", - "_updateSource:", - "setAlwaysShowsDecimalSeparator:", - "removeAllBindVariables", - "baselineForImage:renderSize:", - "setSearchBase:", - "numberOfCharacters", - "setInitialLocation:", - "runConfigurationPalette:", - NULL, - "_compareMultiNoLabelDictionaryNoKeyWithRecordValue:", - "releaseTexture:", - NULL, - NULL, - NULL, - "layoutOptions", - "_convertRect:fromAncestor:", - NULL, - "exposedBindings", - "addStringDefaultValueToDictionaryRef:", - "updateMultiThreaded", - "fileExistsAtURL:andReturnResultCode:", - "_setNeedsSizeUpdate", - "_sizeWithRect:", - "showContextHelp:", - "_setUsesToolTipsWhenTruncated:", - "saveRecipeChanges", - "textSizeMultiplier", - "insertObjects:atIndexes:", - "_toolbarBackgroundColor", - "initWithGraphNode:ofGraph:", - "initWithExpression:usingIteratorExpression:predicate:", - "_setSharedUserDefaultsControllerProxy:", - "__shiftLeft:", - "_drawIndicatorWithFrame:inView:", - "enableMultipleThreads", - "_protocolClassForRequest:", - "sampleCount", - "copyImageBuffer", - "initWithConjunctionOperator:children:", - "setMutableAttributedString:", - "setName:forIndex:", - "databaseIsEmpty", - "sizeForKey:inTable:", - "_mainThreadSetNeedsDisplay", - "speechChannel", - NULL, - "setComparison:", - "_reloadComboBoxWithTag:", - "mergeROI2:destRect:", - "password", - "secondaryGroupingSize", - "imageWithObject:", - "vramManager", - "_rectOfColumn:ignoringTile:", - "numberWithChar:", - "releaseSQLStatement", - "cellSpacing", - "addIndexesFromIndexSet:", - "initWithPoint:", - "_getPoints:", - "setShowRemainingTime:", - "resignFirstResponderDelegate", - "drawBevel:", - "didChangeArrangementCriteria", - "setCanHide:", - "_drawFrame", - "animator", - "accessibilityDefaultButtonAttribute", - "remoteLocations", - "_insetRect:", - "serializeInts:count:atIndex:", - "invalidateHashMarks", - "_mergeTableCellsVertically", - "_tableView:willAddTableColumn:", - "_endListeningForPowerStatusChanges", - "optionsDictionary", - "defaultPlaceholderLookupClassForBinding:object:", - NULL, - "_selectRootNode", - "drawViewBackgroundInRect:", - "threadDictionary", - "_previousDisplayMode", - NULL, - "rangeForUserCharacterAttributeChange", - NULL, - "_NSView_isWebClipView", - "_updateNewFolderButtonEnabledState", - "initEmptyFormatDescriptionWithMediaType:", - "_addTrackingRect:owner:userData:assumeInside:useTrackingNum:", - "availableStringEncodings", - "resizeDownCursor", - "containsIndex:", - "setAllowsDocumentBackgroundColorChange:", - "setHeaderHeight:", - "showButton:", - "accessibilityIsVerticalScrollBarAttributeSettable", - "findSoundFor:", - "undoManager", - "_performRedoCommand:withName:", - "invalidateDictionaryRef", - "redisplayUpdateDate", - "setDefaultType:", - "_windowDidOrderOffScreen:", - "selectedFXName", - NULL, - "drawDragBackground", - "_initWithData:fileType:hfsType:", - "_selectAllForMatrix:sender:", - "setIgnoresMouseEvents:", - "_postNotification:", - "authorization", - "initWithQTMedia:", - "setCoreUIWidgetType:", - "_oldUserCanSelectColumn:", - "setSourceModel:", - NULL, - "_removeCursorRect:cursor:forView:", - "URLProtocol:didLoadData:lengthReceived:", - "startTheater", - "_sizeDocumentViewToColumnsAndAlignIfNecessary:", - "updateColumns", - "_old_initWithCoder_NSTabView:", - "indexGreaterThanIndex:", - "revertBrightness", - "_configSheetDidEnd:returnCode:contextInfo:", - "subrowObjectsAtIndex:", - "initWithBitmapRepresentation:", - "collectionNames", - "_enableInput", - "currentSuiteAppleEventCode", - "defaultPreferencesClass", - "hiddenStateAtIndex:", - "keyForFileWrapper:", - "_setRowArrayCache:", - "_animateLastAddedColumnToVisible", - "_mouseDownSimpleTrackingMode:", - "unlockInfo", - "_idleMovies", - "setExpandMode:", - "restoreAttributes:", - "markNumRowsToToggleVisible", - "nts_RemoveMember:fromGroup:", - "_setMouseDownFlags:", - "textView:shouldHandleEvent:", - "archiveData", - "enclosedSubscriptionGroups", - NULL, - "propertyMappings", - "setCredential:forProtectionSpace:", - "setPeoplePickerView:", - "_isAutoCreated", - "_deallocAuxiliary", - "_lockRequestPostHandler:", - "updateDragTypeRegistration", - "addAttributes:range:", - "compare:options:range:locale:", - "containsKeys:values:count:", - "setSharedPreviewView:", - "_undoRedoTextOperation:", - "dispatchValueSelection:", - "layoutManager", - "_initWithDescriptorType:bytes:byteCount:", - "_maintainInverseRelationship:forProperty:forChange:onSet:", - "_cfTrim:", - "_helpKeyForObject:", - NULL, - "mutablePlaceholder", - "_loadAppSmartFolders", - "bumpSession", - "handleKeyDown:", - "_distanceForVerticalArrowKeyMovement", - "makeCollectionAtPath:", - "goToDestination:", - "imageWithNSBitmapImageRep:", - "_delayCancelStartEditing", - "arrayWithContentsOfURL:", - "personFromDictionary:addressBook:skipUnknownProperties:generateMultiValueIDs:", - "iconForAnimationAtIndex:", - "_buildSupportUnitsForAudioInputConnection:error:", - "currentProgress", - "_shouldDrawFocus", - "_initWithCFURLCredential:", - "_oldStyleOneWordName", - "initWithString:error:", - "_isSheet", - "_booleanValueForCocoaAttributeKey:fromElement:", - "setCorrespondingDisclosureGroup:", - "_performExhaustiveConflictDetectionForObjects:withChannel:", - "_isToManyRelationshipOrderedForKey:", - "_drawOutlineCell:withFrame:inView:", - "previewContentFrameIgnoringIndexSheet:", - NULL, - "initWithWindow:delegate:animation:", - "isSimpleSearch", - "_aeteElementClassDescriptions", - "groupsChanged:", - "setSelected:forKeyFrame:extendSelection:", - "deepCopiesValues", - "trustValuesForDomain:", - "_addDescriptorCheckingForDuplicates:toCollection:", - "setCurrentSearchIndex:", - "setMasterObjectRelationship:refreshDetailContent:", - "mappingGenerator", - "_setSerialNumberToIssuerMappedToCAConfigFile", - "availableFontFamilies", - "fetchObjectForClass:withUniqueId:managedObjectContext:", - NULL, - "getNodeAsResolvedNode:withError:", - "_renderLayerDefinesProperty:", - "locationOfControlType:keyFrame:inTimeLine:", - "setInfo:", - "_flattenMipmap:withCopy:forCell:", - "independentConversationQueueing", - "dataForType:", - "initWithEntity:alias:inScope:", - NULL, - "maxIndexValue", - "documentDidEndDocumentFind:", - "setAddress:", - "vertBlur4ROI:destRect:", - "_customTitleCell", - "initWithPredicateOperator:leftKeyPath:rightValue:", - "_updatesDisabled", - "_initWithName:type:withClassName:", - "_currentFont", - "viewDidHide", - "_appendValue:withLabel:andIdentifier:", - "_propertyAccessFromElement:", - "nextState", - "_acceptableRowBelowRow:maxRow:", - NULL, - "vmSchedulerEnabled", - "_preparePredicateExpression:", - "setTag:", - "_forSRSpeechObject:objectForProperty:usingDataSize:withRequestedObjectClass:", - "_invalidateFont", - "_setLockToken:forURI:withDuration:", - NULL, - "initWithData:options:error:", - "releaseSpaceAtPos:withLen:", - "theaterVideoOptimizationOptions", - "_adjustSelectionForItemEntry:numberOfRows:adjustFieldEditorIfNecessary:", - "pathComponentCells", - "createOutputWithPortClass:forKey:attributes:", - NULL, - "logonButtonCell", - "certIssuerIndex", - "_compositeToPoint:fromRect:operation:fraction:", - "finishEncoding:", - "addLayer:linkedTo:", - "installShortcutMenuHandlers:", - "colorPanel", - "initWithKey:type:isReadOnly:appleEventCode:presentableDescription:nameOrNames:", - "_setCurrentDocumentIndex:withTransition:blocking:", - "_loadKeywords", - "_infoToSaveInRepository:", - "defaultComparisonForProperty:", - "_requiredMinSize", - "setDatePickerStyle:", - "_sortOptionDictionariesByLayoutOrder:", - "_drawingInRevealover", - "timeInterval", - "intValue", - "tokenField:writeRepresentedObjects:toPasteboard:", - NULL, - "actionForLayer:forKey:", - "_updateToManyRelationship:from:to:with:", - "_glyphRangeForBoundingRect:inTextContainer:fast:okToFillHoles:", - "_handleSendControlSize:toView:", - NULL, - "_positionSheetRect:onRect:andDisplay:", - "setKerningShift:", - "isEqualToDate:", - "_initRemoteWithSignature:", - "shouldTakeFocus", - "isExcludedFromWindowsMenu", - "_usesScreenFonts", - NULL, - "setKeyPrompt:", - "_dragImageForRowsWithIndexes:tableColumns:event:offset:", - "setCurrencySymbol:", - "_updateWindowsUsingCache", - "columnDefinitions", - "play", - "saveCacheIfNeeded", - "nearestControlPointAtTime:andValue:withTolerance:", - "writeIndexToStorage", - "drawKnobs:", - "transfer:X:Y:", - "drawInContext:", - "pathStoreWithCharacters:length:", - "setNSImage:imageProperties:", - "implicitParameterAnimations", - "removeLockFile", - "relationshipCaches", - "_filteredPreviewType", - "willShow", - NULL, - "_getUndoManager:", - "_unregisterForClipBoundsDidChangeNotificationIfNecessaryForSuperview:force:", - "_selectorToGetValueWithUniqueIDForKey:", - "credentialWithUser:password:persistence:", - "selectRowIndexes:inColumn:", - "posterImage", - "writeToFile:atomically:", - "_queryHitResultsFilterUTIs", - "nts_ACL", - "_layoutIsSameAsCachedLayoutWithFrame:", - "_setDefaultKeyViewLoop", - "setManagedObjectContext:", - "initWithPersistentStoreCoordinator:configurationName:URL:options:", - "_updateNumberOfTitleCellsIfNecessary", - "methodSignatureForSelector:", - "getBitmapForControl:active:", - "_lastOnScreenContext", - "opacity", - "defaultDoubleClickAction:", - "documentClassNames", - "_setDefaultKeyViewLoopAndInitialFirstResponder", - "graph", - "registerDisplayBundle:withBundleIdentifier:", - "_isSharedUserDefaultsControllerProxy", - "discardCachedImage", - "initWithMaximumSize:maximumResourceAge:options:", - NULL, - "_insertObjectInSortOrder:", - "initWithKeyPath:", - "doRemoveFromGroup", - "pasteboardByFilteringFile:", - "localizedPropertyNameForProperty:", - "_clippedItemViewers", - "setLoadsImagesAutomatically:", - "calculateResolutionData:maskUnderTransform:withOutset:needsLofting:", - "initWithURL:documentAttributes:", - "stringWithFormat:locale:", - "initWithFileWrapper:", - "_rangeOfPrefixFittingWidth:withFont:", - "_preferredFileNameExtension", - "initMoveWithSession:sourceURI:destinationURI:sourceToken:destinationToken:", - "panel:userEnteredFilename:confirmed:", - "_deleteOption:", - NULL, - "_updateAttributesFromAudioChannelMap", - "colorListChanged:", - "predicateWithFormat:", - "convertWeight:ofFont:", - "getRealName", - "_orderedWindowsWithPanels:", - "placeButtons:firstWidth:secondWidth:thirdWidth:", - "initInNode:type:name:", - "_suspendIfTopHandling:", - NULL, - "_areUISoundEffectsEnabled", - "setFairEntropyRange:", - "_isAllowedFileNameExtension:", - "handleMouseDownAtPoint:", - "_migrationPolicy", - "setDefaultButtonCell:", - "_pushNamespaces:", - "rendererID", - "_setMiniImageInDock", - "showWindow:", - "createImageWithSource:options:", - "_remainingString", - "setDirectImportMode:", - "_resizeMetalBackground", - "_textureImage", - "parseN", - "_realHeartBeatThreadContext", - "setBottomCornerRounded:", - "scrollBarColor", - "constrainedScrollToPoint:", - "orderOutOnlyExpansionToolTip", - "initRemoveActionWithItem:", - "unregisterDraggedTypes", - "cells", - "isUsedInFilter:", - "replaceCustomLabel:", - "_observePeer:ofChild:", - NULL, - NULL, - "xmlAttributesForNodeIdentifier:", - "unhideApplication", - "typeAhead:", - "streams", - "_autoresizeToFit", - "windowFrameColor", - "parseABReleatedNames", - "initialFirstResponder", - "_getNextKeyAndDataToken:forPosition:", - "startAnimations", - "mipmapCacheDidLoad:", - "glyphPacking", - "setStatusBar:", - "addDocumentWithURLToIPhoto:", - "setOriginalPasswordField:", - "removeAllGRLs", - "setTokenStyle:", - "presentationLayer", - "scaleAndCenter:", - "_firstPassGlyphRangeForBoundingRect:inTextContainer:hintGlyphRange:okToFillHoles:", - "_mouseLoop::::::", - "restoreMovieEditState:", - "colorWithCIColor:", - "_writeSafelyToURL:ofType:forSaveOperation:error:", - "dispatchRawAppleEvent:withRawReply:handlerRefCon:", - NULL, - "_startSQL:", - "_viewAspectRatio", - "localizationsToSearch", - "paletteImageRep", - "layerFrom:inRed:green:blue:", - "saveDocument:", - "_initWithSize:depth:separate:alpha:allowDeep:", - "_debugDrawRowNumberInCell:withFrame:forRow:", - "alignJustified:", - "_doesOwnRealWindow", - "_setObject:ifNoAttributeForKey:", - "objectIDFactoryForEntity:", - NULL, - "sharedSlideshowExporter", - "startInlineSlideshow", - "removedMembers:fromGroup:", - "_scaleFrameFromFrame:", - "initWithURL:andDelegate:", - "imageDidNotDraw:inRect:", - "imageWithColor:", - "resolveForwardingConflictWithPreviousMetadata:forKey:", - "dragImage:at:offset:event:pasteboard:source:slideBack:", - "colorListNamed:", - "_initInfoDictionary", - "transformContextForBox:", - "abDatabaseImpl", - "_endelement:", - "nts_Subgroups", - "_stopWatchingWindowKeyness", - "initWithColors:atLocations:colorSpace:", - "_changeSelectionWithEvent:", - NULL, - "tokenTextView:shouldUseWritablePasteboardTypes:", - "_writeDocumentAttributes", - "versionHashInfo", - "showCMYKView:", - "sharedSpellCheckerExists", - "setReadLimit:", - "commonCreateDictionaryRef", - "_mapForRadius:strokeColor:fillColor:mode:lineWidth:", - "encodePropertyList:", - "dashPatternRaw", - "setFilterProc:", - "editName:inView:", - "_removeSpellingAttributeForRange:includeAccessibility:", - NULL, - "acceptVisitor:flags:", - "_needsDisplayForEntireRect:", - "_generateCombinedVCards", - "readToEndOfFileInBackgroundAndNotify", - "_scriptCommandTerminologyForName:", - "_setEndsTopLevelGroupingsAfterRunLoopIterations:", - "pathForAuxiliaryExecutable:", - "_renderCurrentPageForPrintOperation:", - "_toolbarLabelFontOfSize:", - "outlineView:draggingEndedAt:operation:", - "_getTitle", - "updateBounds", - NULL, - "setOption:value:", - "setMetadata:", - "dotMacUserAgent", - "zoomFactorX", - "attributeRuns", - "_needsToolTipRecalc", - "offsetControlType:byTime:byValue:keyFrame:", - "_underlineIsOn", - "_updateQuarantinePropertiesIfNecessary", - "_compatibility_initWithUnkeyedCoder:", - "_incrementInserted", - "_enablesOnWindowChangedKeyState", - "_removeAppSmartFolderNode:", - "_autosavingContentsURLWithFileNameExtension:", - "asDestination", - "interiorColor", - "createNotification:callback:", - "accessibilityDescriptionAttribute", - "createRealObjectIfNeeded", - "initPutFromWithSession:sourceURI:destinationURI:sourceToken:destinationToken:", - "slideshowSwitchToIndexMode:", - "_hasOverlayControls", - "initWithProperty:", - "_requestAnyEnabledState", - "_toolbarRegisterForNotifications", - "moveLeft:", - "createDocumentFragment", - "maxStringLength", - "_newPrintItem", - "_beginUpdate", - "conformsToProtocol:", - "weightOfFont:", - "rangeOfString:options:range:locale:", - "_findCursorForView:", - "grow", - "classDescriptionWithAppleEventCode:", - "initWithWindow:delegate:parameters:duration:", - "userDataOfType:atIndex:", - "_characterIndexForMoveWordLeftFromCharacterIndex:", - "setDirectParameter:", - "previewMode", - NULL, - "_URLWithDataAsString:relativeToURL:", - NULL, - "appendWhereClause:", - "removeIndexes:", - "_titlebarTitleRect", - "removeObjectsFromMasterArrayRelationshipAtIndexes:selectionMode:", - "_updateVolume", - "nts_DoInitWithRemoteLocation:displayName:readWriteACL:isAll:", - "initWithAnnotation:", - "_purgeImageManagerResourcesIfNeeded", - "addressFormats", - "appendFormat:", - "updateTextLayer:", - "doDelete:", - "closeGenieFX:", - "_findIndicatorPathsForGlyphRange:", - NULL, - "tokenField:styleForRepresentedObject:", - "_testedObjectTypeDescription", - "_valueCountByEnumeratingWithState:objects:count:", - "_minimumViewSize", - "_clearUndoRegistrations", - "_selectorToGetValueWithNameForKey:", - "setWasGeneratedWithIconServices:", - "disabledImageForControlTint:", - "forwardInvocation:", - "_notifyOfAnyContentChange", - "_updateUIToMatchCachedValues", - "setRulerMarker:", - "hiddenStateAtIndexPath:", - "_decodeWithoutNameWithCoder:newStyle:", - "displayedGroups", - "isUnauthenticatedMountPoint", - "__addStats:", - "twoPage:", - "entityForFetchRequest:", - "setFlags:", - "_imageByCroppingToRect:", - "inlinePreview:didHidePreview:", - "drawTitle", - "_maxXBorderRect", - "abEntityName", - "_setDoCheckPreAuth:", - NULL, - "defaultInstance", - "_dataSourceChild:ofItem:", - NULL, - "_createValueSetterWithContainerClassID:key:", - "_textColorBasedOnEnabledState", - "orderBack:", - "_shouldShowFocusRing", - "importCount", - "setInitialFrame:", - NULL, - "_discardEditingForAllBinders", - "registerToMany:forSourceObjectID:relationshipName:andTimestamp:", - "selectSegmentWithTag:", - "isSubsetOfSet:", - NULL, - "_temporaryDirectoryPathForWritingToPath:forSaveOperation:error:", - "setFileListOrderedByFileProperty:ascending:", - "toolTipForSegment:", - "trustValues", - "nts_RemoveValueForProperty:", - "_regularCommitEditingFailureInvocationWithDelegate:didWhateverSelector:contextInfo:", - "sama", - "setStatus:", - "removeAllToolTips", - "setupGLState", - "enclosingScrollView", - "recache", - "previewPanel:didLoadPreviewForDocumentURL:", - "_tearDownObserving", - "gotoNextSelectionPoint:", - "helperForView:layoutManager:characterIndex:", - "_perDialogPrefString:", - "_removeHeartBeartClientView:", - "imageFlow:removeItemsAtIndexes:", - "windowWillResize:toSize:", - "evaluationErrorSpecifier", - "tableView:typeSelectStringForTableColumn:row:", - "_reorderAppSmartFolderNode:toIndex:", - "hasUnautosavedChanges", - NULL, - "clearControlTintColor", - NULL, - "recipe", - "drawSynchronously", - "isReadableFileAtPath:", - "_stripForMigration", - "member:", - "setPrimitiveSortingLastName:", - "hideSearchWindow", - "initWithTextBlock:charRange:text:layoutManager:containerWidth:collapseBorders:", - "applyFunction:context:", - "_textDidEndEditing:", - "TIFFRepresentation", - "setContentResizingMask:", - "_setSelectorDictionary:", - NULL, - NULL, - "setBundlePath:", - NULL, - "timeForControlPoint:", - "_optimalThumbnailSize", - "_segmentsDeselectedBySegment:", - NULL, - "setUsesStrongWriteBarrier:", - "canInitWithRequest:", - "_addPlugIn:allowNonExecutable:", - "setReturnsObjectsAsFaults:", - "_radioHit:row:col:", - "drawRepresentation:inRect:", - "whiteColor", - "_gatherFocusStateInto:upTo:withContext:", - "_addObserver:notificationNamesAndSelectorNames:object:onlyIfSelectorIsImplemented:", - "_stopObservingModelObject:", - "indicesType", - "outlineView:shouldShowCellExpansionForTableColumn:item:", - "setCellMargin:", - "deleteRequestWithSession:URI:token:", - "sizeLastColumnToFit", - "pixelFormatI8", - "dequeueNotificationsMatching:coalesceMask:", - "_web_filenameByFixingIllegalCharacters", - "imageAvailable:", - "accessiblityChildCells", - "showcaseSelectedResult:", - "isDirectoryGroupSelected", - "_openFile:", - "layerForTool:", - "setMatrix:", - "_performDragOperationForReorder:toIndex:", - "isReloading", - "XMLString", - "matchesWithoutOperatorComponentsKeyPath:", - "_cachedObjectForKey:value:", - "moveWordBackwardAndModifySelection:", - NULL, - "deletesObjectsOnRemove", - "colorMatrixBiasKernel", - "valueForOptionalAttributeKey:", - "setRenameGroupUndoable:", - "_calculateResponses", - "_scanDecimal:into:", - "_commonInit", - "attributedAlternateTitle", - "_deselectUpstream:", - "setFontName:size:", - "_updateHideExtensionButtonStateFromNameFieldContents", - "createWithPublicKey:privateKey:keychain:authenticator:signer:inputParms:error:", - "addGroupFromDictionary:", - "customCall:sendData:withAuthorization:", - "_filesCompleted:", - "_drawDropHighlightBackgroundAroundRect:", - "persistentDomainNames", - "_setNeedToFlushGlyph:", - "_compareSingleScalarWithRecordValue:", - "_graphEditor", - "accessibilitySortDirectionAttribute", - "unregisterModalWindow:", - "imageWithImageProvider:userInfo:size:format:flipped:colorSpace:", - "attributedCertificateName:showsStatus:showsIssuer:selected:prefix:", - "_transientProperties", - "_registerOrUnregister:observerNotificationsForKeyPath:", - "initWithAnnotationDictionary:forFlavor:", - "_previewPanelFrameDidChange:", - "nts_ParentGroupsOfRecord:", - NULL, - "taskLoop", - "activeProcessorCount", - "initDeleteWithSession:URI:token:", - "presentableDescription", - NULL, - "_invalidateGlyphsForExtendedCharacterRange:changeInLength:includeBlocks:", - "setValue:forTag:client:", - NULL, - "_updateDragging:", - "cacheImageInRect:", - "selectionDictionary", - NULL, - "initAll:actions:owner:index:", - "blurRegionOf:destRect:userInfo:", - NULL, - "_initMainThread", - "setCost:", - "menuWillOpen:", - "localizedCompare:", - "indexOfItemWithTitle:", - NULL, - "_releaseOneLevelPreWillChangeExpandedNodes", - "setCompositions:", - "setFileURL:", - "beginSheetForDirectory:file:types:modalForWindow:modalDelegate:didEndSelector:contextInfo:", - "highlightedTableColumn", - "tabViewDidChangeNumberOfTabViewItems:", - "_stripDotEntries", - "_runFullDialog", - "_reallocColors:", - "_committedSnapshotForObject:", - "removeAllSubviews", - "magnifyer", - "selectFile:inFileViewerRootedAtPath:", - "_getReceiversSpecifierOrUnnamedArgument:fromEvent:usingDescription:", - "initWithMemorySize:", - "initWithRenderer:renderSize:renderContext:userData:", - "findNodeNames:matchType:", - "setFrameUsingName:", - "setVirtualScreen:", - "initWithSourceAttributeName:destinationAttributeName:", - "tabViewRemoved", - NULL, - "_dockIsAlive:", - "setLineJoinStyle:", - "indexSetWithIndexesInRange:", - "movieWithQuickTimeMovie:disposeWhenDone:error:", - "_multipleValuesObjectsAtIndexes:", - "_wrapsDateComponentArithmetic", - "_updateProtectedCurrentDocumentURL", - "count", - "processRealDocument:", - "getNodeAsDeepResolvedNode:", - "updatePasswordField:", - NULL, - "pathCell:willDisplayOpenPanel:", - "_notifyDelegate_DidRemoveItems:", - "distributionIndexForProperty:person:", - NULL, - "editedMode:forEditingOrAction:", - "layoutGlyphsInHorizontalLineFragment:baseline:", - "tokenField:editingStringForRepresentedObject:", - "isRunLoopBased", - "insertItemWithObjectValue:atIndex:", - NULL, - "initWithUniqueID:connectionID:", - "setUseDistinct:", - "appendCountClause:forToManyKeyPath:", - "_rectForSegment:inFrame:", - NULL, - "bezelStyle", - "draggingSourceOperationMaskForLocal:", - "_recycleResource:", - NULL, - "initWithData:encoding:", - "_readDocumentFragment:fromRange:documentAttributes:subresources:", - "_isFilteringEvents", - "endEditing", - "performanceCountersForVirtualScreen:purgeable:", - "ivar", - "_topCornerSize", - "childContext:didRememberObjectsWithObjectIDs:", - "_setPrintInfo:", - "initWithName:element:", - "initWithResponse:data:userInfo:storagePolicy:", - "customPropertyValueKeyNameForPropertyType:isSerializedPropertyList:", - "_configureFileListModeControlForMode:", - NULL, - "_totalMinimumTabsLengthWithOverlap:", - NULL, - "_drawerDepthOffset", - "inputNeutralChromaticityX", - "createIdentityImages", - "outlineView:isItemExpandable:", - "mergeSingleValue:forProperty:", - NULL, - "loadFindStringFromPasteboard", - NULL, - "canGoToFirstPage", - "leftBorder", - "_traverseToSubmenu", - "_countWithMergedChangesForRequest:possibleChanges:possibleDeletes:error:", - "readAlignedDataSize", - "_dispose:", - "tearOffTitlebarShadowColor", - "cachedImageNamed:", - "comboBoxCell:indexOfItemWithStringValue:", - "_listClassForList:", - NULL, - "_accessibilityNextSplitterMinCoordinate", - "setOrderingIndex:", - "hasAlpha", - "tileAndSetWindowShape:", - "miniaturize:", - "keyUp:", - "canCloseDocumentWithDelegate:shouldCloseSelector:contextInfo:", - "_setPersistentStore:", - "_executeInsert:didCommitSuccessfully:actionSender:", - "initByReferencingFile:", - "willTurnIntoFault", - "__close", - "_loadDefaultSetImageRep", - "_parseFonts2", - "updatePDFPage", - "getCFRunLoop", - "width", - "secondsFromGMT", - NULL, - NULL, - "xAccel", - NULL, - "closeDown", - "_sourceListBackgroundColor", - "setTighteningFactorForTruncation:", - NULL, - "stackSize", - NULL, - "externalPrecision", - "setDefaultPlaceholder:forMarker:withBinding:", - "addCollection:options:", - NULL, - "_userResetToDefaultConfiguration", - "createPatternColor", - "vectorWithString:", - "_NSNibShortcutNameForUIItemIdentifier:", - "_needsPopulate", - "tableViewColumnDidResize:", - "_updateTrackingValueForPoint:", - "keyEquivalentModifierMask", - "_flushCache:", - "deserializeDataAt:ofObjCType:atCursor:context:", - "_setNeedsDisplayInColumn:", - "_regionForOpaqueDescendants:forMove:", - "decrementRefCount", - "initNotTestWithTest:", - "vectorWithRect:", - "deserializePropertyListFromData:mutableContainers:", - "_appActive:", - "verifyPath:", - "setTimeScale:", - "tabSelectionChanged:", - "schedule", - "createCleanCopyOfPropertiesDictionary:", - "_hintedGetBucketIndex:bucketFirstRowIndex:containingRowIndex:", - "imageWithBaseName:state:backgroundStyle:", - "deviceRGBColorSpace", - "cardPane", - "createSchema", - "parseAuthorityInfoAccess:", - "_autounbinder", - "highlightsBy", - "setValue:forBinding:atIndexPath:error:", - "_keyViewPrecedingModalButtons", - "textUnfilteredPasteboardTypes", - "_setRealTitle:", - "_bottomBarHeight", - NULL, - "loadInBackground", - NULL, - "methodSignature", - "mergeFontVariationsInto:", - "contentMinSize", - "_replaceCharactersInRange:withPastedAttributedString:", - "updateClientFreeFormLayoutWithIndexes:", - "_temporaryAttributesAtCharacterIndex:longestEffectiveRange:inRange:", - "invocationWithMethodSignature:", - "setDelegate:withNotifyingTextView:", - "supportGLRenderer", - "_readFilenameStringsIntoRange:fromPasteboard:", - "referenceFile", - "__000:", - "_selectRowRange::", - "initWithController:keyPath:", - NULL, - "endPrologue", - NULL, - "initWithFullPath:", - "addFilterNotification:", - "setParentInDictionary:", - "initWithFrame:andController:", - "_hasPendingChanges", - "decodeValueOfObjCType:at:", - "_setCommand:", - NULL, - "eventWithEventRef:", - "_showLanguagePopUp", - "mainWindowFrameHighlightColor", - NULL, - NULL, - "_setLabel:", - "chooseButton", - "toOneRelationship", - "_stoleVisibleSharedPreviewView", - "initWithString:calendarFormat:locale:", - "_setBoundDataSource:withKeyPath:options:", - "comparisonPredicateModifier", - "_updateMouseTracking", - "generatorClass", - "applyFunctionOnNodes:context:", - "recordsForClass:matchingPredicate:prefetchingKeyPaths:takeLock:", - "fontWithFamily:traits:weight:size:", - "dictionaryByAddingObjectsFromArray:forKeys:", - "_doSynchronizationOfEditedFieldForColumnWidthChange", - "updateOptionsWithCopyright:", - NULL, - "deselect", - "transformSize:", - "_delegate_isGroupRow:", - "valueForProperty:", - "abBackupPeopleCount", - NULL, - "_recursiveLostLayerTreeHostAncestor", - "frameOfInsideOfColumn:", - "scaleSpeed", - "pushBundleForImageSearch:", - "focusView:inWindow:", - "trackPagingArea:", - "findComponentByID:", - NULL, - "_searchMenuTemplate", - "setCountLabel:", - "canChooseDirectories", - "isTemporary", - NULL, - "cameraOffText", - "numberOfArguments", - "setIsMiniaturized:", - "setImageZoomFactor:centerPoint:", - "isVerticallyCentered", - "_conditionallySetsStates", - NULL, - "setIndentationPerLevel:", - "lastPageIndex", - "_resizeTopView:", - "getKeys:", - "moveSelection::", - "tableView:acceptDrop:row:dropOperation:", - "_isKeyWindow", - "singleFieldVideo", - "stringsByAppendingPathComponent:", - "_colorSyncProfileSpace", - "propertiesOfSearchElements:", - "sqlStatement", - "fileSystemNumber", - "_setValidityPeriod:", - "setIsModified:", - NULL, - "_setCellsOutlineColorRed:green:blue:", - "setDefaultStringValue:", - NULL, - "timeValue", - "parseABPhoto", - "setItemSize:", - NULL, - "maxCount", - "_specifiesMultipleObjectsPerContainer", - "keychainName:", - "avoidsEmptySelection", - "_setKeyEnciphermentUsage:", - NULL, - "drawCenteredIcon:inRect:reflection:", - "keyPointerFunctions", - "accessibilityRangeForPositionAttributeForParameter:", - NULL, - "_whenDrawn:fills:", - "getPrimitiveAppleUseCoreUI", - "showsPrintPanel", - "_validateNodePosition:", - "setFilePathFromObject:", - "resizeWithEvent:", - "_opacity", - "setConnected:", - "_setupToolbar", - "imageRectWithoutRotations", - "_performUndoCommand:withName:", - "addFontDescriptorToRecents:", - "_adjustMovieToView", - "_takeColorFromDoAction:", - "setDisplayModeState:", - "sizeForString", - "scrollPoint:", - "_setPasswordStrengthString:", - NULL, - "_setNeedsDisplayForItemViewerSelection:", - "_adjustDatePickerElement:by:returnCalendarToHomeMonth:", - "_documentEditor:didCommit:contextInfo:", - "setSelectionIndexes:byExtendingSelection:", - "nts_MembersRecursive", - "evaluationErrorNumber", - "propertiesByName", - "nts_AddRecord:", - "setQuadrilateralPoints:", - "_maxTitlebarTitleRect", - "initWithOriginalString:range:", - "saveImageInCache:forEmail:", - "setPreservesAspectRatio:", - "_registerUndoForOperation:withObjects:withExtraArguments:", - "startAnimation:", - "pathlessURL", - "_hide", - "_setHelpCursor:", - "_sendSelectionDidChange", - "_mouseInPopupRect:", - "removeFilterSheetDidEnd:returnCode:contextInfo:", - "_finishDownloadDecoding", - NULL, - "document", - "setDeletedObjects:", - "_handlePhonemeCallbackWithOpcode:", - "initWithOriginalImage:cropSize:cropInfo:smallIcon:", - "newCreateIndexStatementsForManyToMany:", - "tabViewType", - NULL, - "saveInDirectory:saveIndexes:", - "initialize:", - "underlinePosition", - "_setNeedsModeConfiguration:", - "propagateConnections", - "configureAndLoadLayout", - "pushRoundedRectPath:inContext:withCornerRadius:topLeftCorner:topRightCorner:bottomRightCorner:bottomLeftCorner:alignOnPixelCenter:", - "initWithXMLData:", - "characterIdentifier", - "restore", - "rotationTransform", - "writeAttachment:", - "reconcileToSuiteRegistry:suiteName:", - NULL, - "_credentialInfo", - NULL, - "__setUndoableValue:forKeyPath:updatesState:", - "requiresDomain", - "CGColorSpace", - NULL, - "_organization", - NULL, - "annotationEditing", - NULL, - "setCurrentToolMode:", - "_iconViewDoubleAction:", - NULL, - "_imageRectForDrawing:inFrame:inView:", - "URLHandle:resourceDataDidBecomeAvailable:", - "origin", - "startSchedule", - "setStyleFromDictionary:", - "paragraphSpacingBeforeGlyphAtIndex:withProposedLineFragmentRect:", - "submenu", - "minute", - "setDisplaysAsBook:", - "readInBackgroundAndNotifyForModes:", - "_backingPlistIsNewer", - "isExpandable:", - "_setNumberOfRowsCacheIsValid:", - "_informationField", - "fileURLWithPath:isDirectory:", - "_updateDefaultState:forCredential:protectionSpace:", - NULL, - "deferSync", - "_updateScrollWithAnimation:", - "setLineSpacing:", - "defaultPlaceholderForMarker:withBinding:", - NULL, - "cancelDownload", - "_accessibilityIsRadioGroup", - "_initializeArchiverMappings", - "_getNodeForKey:inTable:", - NULL, - "animationDidEnd:", - "_newParagraphForLibXML2ElementNode:tag:allowEmpty:suppressTrailingSpace:", - "updateNib", - "_focusRingRect", - "setGeneratesDecimalNumbers:", - "_isVertical", - "getNewRequestMessage:andStream:forRequest:", - "_isSelectableItemIdentifier:", - "isSpecialGroup", - "parser:parseErrorOccurred:", - "_releaseWireCount:", - "isEnteringProximity", - "accountWithName:password:applicationID:", - NULL, - "_insertPopup", - "greenVotingROI:destRect:", - "smallSystemFontSize", - "accessibilityVisibleRowsAttribute", - "getAttribute:index:allowBinary:", - "_setLastGuess:", - "colorWithDeviceCyan:magenta:yellow:black:alpha:", - "_characterRangeForPoint:inRect:ofView:", - "_setInputBottomLineParams:", - "setPeriodicDelay:interval:", - "_allowSmallIcons", - "_invokeSelector:withArguments:onKeyPath:", - "loadComposition:", - "doFileCompletion:isAutoComplete:reverseCycle:", - "removeGRLPerformCallbacks", - "_handleRecognitionBeginningWithRecognitionResult:", - NULL, - "doRegexForString:pattern:patternLength:flags:", - "translationRatioAtRow:", - NULL, - "filenameExtension:", - "nts_RecordForUniqueId:", - "endEditingFor:", - "originForPageDisplay:", - NULL, - "parser:foundElementDeclarationWithName:model:", - NULL, - "_setInvitation:", - "_attributedString:madeToFitInSize:", - "_minimizeSucceeded:", - NULL, - "clearView", - "view", - "center:didRemoveObserver:name:object:", - "subItemAtIndex:", - "topPool", - NULL, - "migratePersistentStore:toURL:options:withType:error:", - "setStringValue:resolvingEntities:", - "moveGlyphsTo:from:", - "maxLabelStringWidth", - "hidePalettes", - "attachedListDictionary", - "applyFunctionOnOutputPorts:context:", - "localizedScannerWithString:", - "_updateSortDescriptors:", - "fieldNamed:", - NULL, - "cameraDisabledIcon", - "bytesPerRow", - "isTornOff", - "initWithImageManager:options:", - "drawKnobSlotInRect:highlight:", - "_imageForCell:keyWindow:", - NULL, - "setMergePolicy:", - "isColor", - "initWithNamespaces:", - "CIImage", - "writeStringDocumentAttribute:withRTFKeyword:", - "initWithIdentifier:forColorPanel:", - "insertItemWithItemIdentifier:atIndex:", - "enqueueInvocation:", - "addObserver:forKeyPath:options:context:", - "_engravedActiveForegroundTextColor", - "setObject:forKey:", - "_distinctUnionOfArraysForKeyPath:", - "_filePathValue", - NULL, - "openFile:fromImage:at:inView:", - "_validateNodePositions", - NULL, - "_web_createDirectoryAtPathWithIntermediateDirectories:attributes:", - "_collapseItem:collapseChildren:clearExpandState:", - "initWithCustomSelector:modifier:", - "_setClipRect:", - "_setImage:", - "isReadOnly", - "setBorderType:", - "_findScrollerToAutoLiveScrollInWindow:", - "_drawSliceBackgroundsWithClipRect:", - "fileHandleForUpdatingAtPath:", - "setPositionX:Y:Z:", - "setUserStyleSheetEnabled:", - "previewView:timedOutPreviewLoadForURL:", - NULL, - "registerNodeWithClass:", - "moveParagraphBackwardAndModifySelection:", - "_registerObjectClass:placeholder:binding:", - NULL, - "valueAtTime:", - "setSharingPreviewPanel:", - "imageRotation", - "beginCertLookupForEmail:cell:", - "addCoachMarkWithContentRect:contentImage:forView:selfDestruct:", - "setOneShot:", - "shortVersion", - "didAddSubview:", - "error:", - "setVerifyPasswordField:", - "publicID", - "dateFromHTTPStyleString:", - NULL, - "saveOptions", - "mirrorMode", - "grlIndex", - "_setHelpBooks:", - "setRequestError:", - NULL, - "cleanupAppNotifications:", - "graphView", - "levelForRow:", - "_setCurrentPreview:documentPreview:displayedView:canDelayDisplay:transition:stealing:", - "addAddOperationWithIndex:", - "propertyPath", - "initWithRealClient:", - "_copyAuthorizationRights:toRights:", - "pluginForType:", - "_willDeleteNodeInputPort:", - "alphaValue", - "imageWithoutEffectsRect", - "setResizingMask:", - "setSize:", - "selectedColumnEnumerator", - "defaultType", - NULL, - "controlHighlightColor", - "findApplications", - NULL, - "combineStructures:withCustom:", - "addRepresentationForElementWithProperty:value:comparison:order:", - "abIsUTF16EntourageVCard", - "setWindingRule:", - "removeFreedWindow:", - "crop:to:", - "__patchStarted:", - "_activePort", - "_enableTrackingRect:", - "createPlistFromFile:", - "_setOneShotIsDelayed:", - "movePopupToFrontForAnnotation:", - "hasPrefix:", - "openInSeparateWindow:", - "addFavoriteInWindow:", - "_recursiveBreakKeyViewLoop", - "_screenFromPoint:", - "indexOfNode:inCachedChildrenForNode:", - "_objectForProperty:usingDataSize:withRequestedObjectClass:", - "_setAutoscrollDate:", - "_specifiesValueContainedByObjectBeingTested", - "initWithRef:", - "initWithGraphicsContext:", - "parser:foundProcessingInstructionWithTarget:data:", - NULL, - "indexLabelsCount", - "useStandardLigatures:", - "nullImage", - NULL, - "paragraphSpacing", - NULL, - NULL, - "_plotCurve:offset:scale:sample:min:max:stride:count:", - "initGetInfosWithURL:", - NULL, - "_setSQLType:", - "updateChangeCount:", - "addObject:forKey:", - "setRulerVisible:", - "setCompositionAspectRatio:", - "_orderedDrawerAndWindowKeyLoopGroupingViews", - "setRoundingMode:", - "_startSheet", - "buttonPressed:", - "selectionFromPage:atPoint:toPage:atPoint:", - "_accessibilityTitleRect", - "quotedStringRepresentation", - "_queryValueForItem:inRow:", - "_shouldAbortMouseDownAfterDragAttempt:", - "hasElasticRange", - "_removeAllColumns", - "IKIPSliderMouseDown:", - "_readRTFDIntoRange:fromPasteboard:", - "isEqualToSet:", - "highlightedItemIndex", - "city", - "_setCurrentDirectoryNode:pathToNode:", - "revertInvalidXMLEscapedString:", - "updateOptionsWithCredits:", - "_actOnKeyDown:", - "removeGroup:", - "_initWithImage:", - "classDescriptionForClass:", - "_displayAllDrawersIfNeeded", - "invert:", - "controlDarkShadowColor", - "removeRecordsFromGroup", - NULL, - "unlockTextureRepresentation", - "runPromptToSaveQueryWithName:modalForWindow:", - "setLastNavigationDirection:", - NULL, - "setSuperentity:", - "applyMultiValue:withCustomProperty:toRecord:managedObject:", - "appendRows:", - "addIndexButton", - NULL, - "appendPropertyDeclarationToAETEData:", - NULL, - "ikMouseDragged:", - "_imageFromItemTitle:", - "_trackRect", - "_pinDocRect", - "popupViewEntered:", - "updateRoot", - "_nameAsRegisteredWithImageClass", - "usesGroupInDefinition:", - "removeCredential:forProtectionSpace:", - "setEstimatedFileSize:", - "standardCrop:original:", - "addSelectionRange:page:normalize:", - "optionFlags", - "indexesToRemove", - "startSpeakingString:", - "minificationFilterBias", - "nibInstantiateWithOwner:", - "setPredicateString:", - "convertIndex:toResults:andOffset:", - "_loadViews:", - "concludeDragOperation:", - NULL, - NULL, - "getResourceLocator", - NULL, - "_indicatorFrameForCellFrame:isFlipped:", - "initWithRecord:managedObject:property:", - "_setHiddenViewsTint:", - "_setDefaultUserInfoFromURL:", - "externalDataForObjectID:timestamp:", - "setHashFunction:", - "find:", - "redReconstruction:green:phase:image:", - "machPort", - "saveRoot", - NULL, - "_resetFragHandlerWithSize:", - "download:shouldDecodeSourceDataOfMIMEType:", - "numRowsToToggleVisible", - "_usesCustomTrackImage", - "setSelectedRanges:", - "_saveIconViewSize:", - "roundingBehavior", - "addNormalAppearanceToDictionaryRef:", - "attachmentSizeForGlyphAtIndex:", - NULL, - "mouseTracker:constrainPoint:withEvent:", - "valueForOutputKey:", - "_makeLinkFromMenu:", - "fullscreenFrame", - "setThumbnailCount:", - "moveToBeginningOfDocumentAndModifySelection:", - "addPopupToDictionaryRef:", - "commonPrefixWithString:options:", - "_managedAttributeKeys", - "_specifiedValueInContainer:", - NULL, - "leftMargin", - "serviceName", - "setColor:atX:y:", - NULL, - "intersectsRect:", - "controlTextColor", - "_doesCAConfigFileExistWithFileName:", - "_moveDownWithEvent:", - "pageFooter", - "sharedTextFinder", - "startEditingSmartGroup:", - "defaultLineHeightForFont:", - "oscPortsConfiguration", - "acceptsMarker:binding:overrideWithPlaceholderIfDefined:", - "defaultTabInterval", - "_readRTFIntoRanges:fromPasteboard:", - "abAppendString:", - "fixAttachmentAttributeInRange:", - "_originalSnapshot", - "netServiceDidStop:", - "_allowKillRing", - NULL, - "predicateWithFormat:arguments:", - "PDFViewWillClickOnLink:withURL:", - "accessibilityIsHorizontalScrollBarAttributeSettable", - "knobColor", - "addAppleUseCoreUI:", - "dataForKey:", - NULL, - "enableSearchField:", - "_getBytesAsData:maxLength:usedLength:encoding:options:range:remainingRange:", - "_proxyNonGCPoolPointer", - "drawStateImageWithFrame:inView:", - "otherEventWithType:location:modifierFlags:timestamp:windowNumber:context:subtype:data1:data2:", - "nts_GroupsThatUseGroup:", - "_makeKeyNode:inKeyNode:", - "drawerShouldClose:", - "noResponderFor:", - "_subclassManagesData", - "_selectDocumentFromLayer:", - "stringsFromRows:expanding:", - "filterRemoved:filterChain:", - NULL, - "_propagateDelete", - NULL, - "addTooltip", - "renderingFlags", - "lockFocusOnRepresentation:", - "nonRetainedCachedRecordForKey:", - "moveUp:", - "_commonBeginModalSessionForWindow:relativeToWindow:modalDelegate:didEndSelector:contextInfo:", - "sourceURL", - NULL, - "allMetadata", - "isReachable", - "nodeNameWithClassName:identifier:", - "setPersistentDomain:forName:", - "setDictionaryRepresentation:", - "createAttributesForFont:color:", - "propertyForKeyIfAvailable:", - NULL, - "_alternateButton", - NULL, - "lowercaseLetterCharacterSet", - "invokesSeparatelyWithArrayObjectsWithBinding:", - "_enableResizedPosting", - "_checkTrashiness", - "canSelectPrevious", - "moveToEndOfParagraphAndModifySelection:", - "_SFCertificateTrustPanel_disclosureStateChanged:", - "initWithCallbacks:andEngineRef:", - NULL, - "scriptingBeginsWith:", - NULL, - "compressionOptionsForConnection:", - "mapTableWithWeakToStrongObjects", - "addTrackingArea:", - "insertTabViewItem:atIndex:", - "createTextureBufferForManager:withFormat:target:bounds:colorSpace:options:", - "rootProxy", - "addACE:append:", - "_lengthForSize:", - "_baseTransform", - "hasMetadataTable", - "_setEnableDelegateNotifications:", - "_writeFileListMode", - "createChildNodeForRepresentedObject:", - "compositionsAtPage:", - "setToolTip:forView:cell:", - "parserDidEndDocument:", - "_popUpMenuCurrentlyInvokingAction", - "targetObject", - "ab_queryPieces", - "toolbarAllowedItemIdentifiers:", - "_pageChanged:direction:", - "initWithAuthentication:forUser:andPass:", - "_postSelectionDidChangeNotification", - "controlDidResignFirstResponder:", - "setClearsColorBuffer:", - "_sendChangeNotification", - "_removeObjectsAtArrangedObjectIndexPaths:objectHandler:", - "_coreUIDrawBezelWithFrame:inView:", - "_stopFadeTimer", - "_setNeedsToResetDragMargins:", - "dirty", - "_getActiveUndoManager", - "friction", - "setSizeRequisition:", - "_setContentInBackground:", - "baselineLocation", - "countryName", - NULL, - "initWithDateFormat:allowNaturalLanguage:", - "windowWillStartLiveResize:", - NULL, - "_loadState:", - "setUserInfo:", - "_addColor:", - "filter", - "setErrorLine:", - "_validateIsSymbolicLink", - "resolveWithCallback:target:", - "drawSelectionFrame:", - "doValidateMetaData", - "_toolbarItemViewerClass", - "devicesWithIOType:", - "suspend", - "_endOfParagraphAtIndex:", - "pointForPort:inNode:bounds:", - "valueExpression", - NULL, - "setJoins:", - "centerAfterViewResize:", - "runModalForTrust:message:", - "imagePasteboardTypes", - "operatingSystemName", - "_showAs", - "localContextWithOptions:", - "_glyphAdvancementCache:renderingMode:", - "setScaleFrame:", - "contentViewMargins", - "nts_SetImageData:", - "initWithViewAnimations:", - "setFloat:forKey:", - "_miniaturizedOrCanBecomeMain", - "setColor:forKey:", - "accessibilityHitTest:", - "delayedSaveCacheIfNeeded", - "mappingsForConfigurationWithName:inModel:", - "hookUpContext:", - "setEditing:", - "_cfUppercase:", - "onResize:", - "_connectGraphUnitsForGenericOutputConnection:error:", - "addRowWithCells:", - "arrayByAddingObject:", - "deleteBackward:", - "filterWithImageURL:options:", - "senderDidBecomeActive:", - NULL, - "redReconstruction:green:phase:", - "_addHeartBeatClientView:", - NULL, - "finalizeRenderer", - NULL, - "shouldDrawInsertionPoint", - "updateStrengthBar:", - NULL, - "_uniqueOutputPortKey", - "stringWithFormat:", - "_selfBoundsChanged", - "setStartingIconSize:", - "setAlignmentMode:", - "_setNonactivatingPanel:", - "stopSpeakingAtBoundary:", - "_addRootSeperatorIfNeeded", - "_reloadChildrenForNode:", - "metadataForPersistentStoreWithURL:error:", - "workLoop", - "_highlightTextColor", - "itemPrototype", - "recalcPointersForResolutionData:mask:firstRes:", - "_metaProperties", - "_itemViewerForDraggingInfo:draggingSource:", - "cancelFindString", - "_resetTitleWidths", - "isAncestorOfObject:", - "captureSession", - NULL, - NULL, - NULL, - "_accessibilityPanel", - NULL, - "initWithContent:", - "_insertionKeyForDictionary:minimumIndex:", - "primitiveModificationDateYear", - "_pageForIndex:", - "_displayForLayerTime:displayTime:", - "_createOverlay", - "_defaultScriptingComponent", - "initWithPath:options:error:", - "_updateSizeAndLocation", - "_computeMinimumDisplayedLabelForWidth:", - "earlierDate:", - "_listener", - "setJobDisposition:", - "_processEvents", - "fileGroupOwnerAccountNumber", - "_setDotMacEmailEncryptionUsage:", - "textView:shouldDrawInsertionPointInRect:color:turnedOn:", - "textView", - "setQueryHitResultsFilterUTIs:", - "_selectHighlightedSegment", - "encodedDataForValue:charsetName:", - NULL, - "removeObserverTextField:", - "convertPointFromDocumentToView:", - "loadRulebook:", - "preparedImage", - "operatingSystemVersionString", - NULL, - "_resetUpdate", - "_columnPositionsTheSame", - "setFloatParameterValue:to:inResolutionData:", - "initWithDir:values:", - NULL, - "drawResolutionData:outlineToContext:withFill:", - "push", - "_convert:row:point:cacheHint:", - "getFullFieldNameFromDictionary:", - "thumbnailImageWithSize:", - "initWithBitmapImageRep:", - "_parsePredefinedAttributes", - "shouldBeVisibleOnlyOnCurrentSpace", - "currentOperation", - "generateWhereIntermediatesInContext:", - "initWithDataReferenceRecord:", - "containerClassID", - "rightChild", - "availableResourceData", - "_postRefreshedObjectsNotificationAndClearList", - "encodeRootObject:", - "_postNotification:sender:", - "_rowHeightStorageUpdateForDeletedRows:atIndex:", - "initWithOptions:createFilter:", - "_web_objectForMIMEType:", - "ciIdentifier", - "nts_AddMember:", - "isPrimaryKey", - "doVariancePass:means:sums:offset:count:factor:", - "generatePrimaryKeysForEntity:", - "transformVectorFromViewSpaceToCropSpace:", - "addInputUnitsForConnection:toGraph:ofCaptureSession:error:", - "defaultNeutralChromaticityX", - "sortConnections", - "writeRTF", - NULL, - "_applicableSegmentedCellStyle", - "annotationPreceding:wrapAround:", - "windowDidEndLiveResize:", - "invokeSelector:withArguments:forBinding:error:", - "initWithReceivePort:sendPort:components:", - "dragSelectionWithEvent:offset:slideBack:", - "_recomputeLocalizedKeys", - "setRenderTime:", - "thumbnailsDidFinishLoading", - "panelShouldHaveBackPlayNextButtons", - "play:", - "addDependentTexture:", - "joinIntermediates", - "_shouldSlideBackAfterDragFailed", - "alphaSpeed", - "_releaseKVCMaps", - "usesButtons", - "animationProgressed", - "autoresizesAllColumnsToFit", - "addFieldWithNoPopup:", - "_writeRecentDocumentDefaultsForKey:", - "setEndSpecifier:", - "_darkGrayRGBColor", - NULL, - NULL, - "lastChild", - "_invalidateTypeDescriptionCache", - "_minimumSizeNeedForTabItemLabel:", - "_beginSessionUpdates", - "_delegateWillDisplayCellIfNecessary:forColumn:row:", - "displayIfNeededInRectIgnoringOpacity:", - "setImageContents:", - "isEditing", - NULL, - "_refaultObject:globalID:boolean:", - "nextSlicePiece:", - "_setSession:", - "revertToInitialValues:", - "_web_rangeOfURLScheme_nowarn", - "directoryServicesNodes", - "_under", - "fullTypeName", - "_updateAttributes", - "removeMarker:", - "nodeForPath:", - "parser:foundExternalEntityDeclarationWithName:publicID:systemID:", - "_updateTooltipsForMouseLocation:", - NULL, - "toggleShown:", - "forwardEvent:to:", - "_dataSourceIsItemExpandable:", - "isEditingAtIndexPath:withObject:", - "detatchFromView", - "textureIsDestination:name:userInfo:", - "_notifyManagedContextEditorStateChanged:", - NULL, - "unbindTextureRepresentationFromCGLContext:textureUnit:", - "isDaylightSavingTimeForDate:", - NULL, - "_isAnyBindingInMaskBound:", - "rawDataFormat", - "writeSelectedGroupsAndPeopleToDefaults", - "searchIsInProgress", - "descriptionForProtocol:", - "_drawerDefaultBottomTrailingOffset", - NULL, - "instantiate::", - "disableFlush", - "setAddressBook:", - "_performActionOnNodes:context:selectedOnly:", - "setDefaultLockDuration:", - "selectedMembersSubrows", - "drawFeedbackMode", - "_setReorderResizeImageCache:", - "calculateFigureSize:", - "accessibilityCancelButtonAttribute", - "_readStreamEvent:", - "setEffectID:", - "_doDelayedValidateVisibleToolbarItems", - "filterWithName:compatibilityVersion:", - "initWithDestination:", - "redrawSelectedPagesDrawNow:", - "setMarkedText:selectionRange:replacementRange:", - "createPixelBufferFromImageBuffer:sourceBounds:options:", - "application:runTest:duration:", - "workaroundReorderResizeProblem", - "issueSetImageCommandWithData:", - "defaultController", - "application:delegateHandlesKey:", - "cellIndexAtColumn:andRow:", - "actionHasBegun:sender:", - NULL, - "setSessionUID:", - "startControlWithDelegate:duration:", - "_noteDefaultMenuAttributeChanged", - "fetchRequestWithSortDescriptors:limit:", - "changeInLength", - "useVisualContext", - NULL, - "editValueWithEvent:inView:atPoint:", - "_windowDidChangeScreenProfile:", - "_abortAndRestartTracking:", - NULL, - "setValue:forTag:", - NULL, - "fileManager:shouldProceedAfterError:copyingItemAtPath:toPath:", - "attributeType", - "_expandItemEntryChildren:atStartLevel:expandChildren:andInvalidate:", - "windowNibName", - "initWithRTF:", - "veryShortStandaloneWeekdaySymbols", - "_solveForInput:", - "graphicsContextWithBitmapImageRep:", - "timingFunctions", - "inLiveResize", - "computeRealDropIndexFromIndex:takingInAccountHiddenItemsIndexes:", - "fontWithDescriptor:size:", - "_overlapAmount", - "_sortCollections", - "isCoreImageAccelerated", - "unsignedLongValue", - "gotoPreviousPage:", - NULL, - "setSpecifiedRect:", - "matchTarget:selector:object:", - "dateWithString:calendarFormat:", - "_resetAllDrawersDisableCounts", - "_certificateData", - "_afterAutosavingDocument:closeAndContinue:context:", - "textView:willBeginEditingProperty:effectiveRange:", - "rotationGizmoRadius", - "lineWidth", - "stringByPaddingToLength:withString:startingAtIndex:", - "displayPattern", - "permitRequest:", - "setIgnoresViewTransformations:", - "usesUserKeyEquivalents", - "accessibilityIsMenuBarAttributeSettable", - "authenticationDataForComponents:", - "_forceSendDoubleActionForPreviewCell", - "initWithFileDescriptor:closeOnDealloc:", - "leaveSlideshowFullScreen", - "_isDrawingMultiClippedContentAtIndex:", - "setInitialValues:", - "_retrieveAVCDeviceOpcode:", - "setNextState", - NULL, - "_changeBaseWritingDirection:", - "_selectFirstKeyView", - "updateItemList", - "tableView:shouldEditTableColumn:row:", - NULL, - "_terminate", - "objectInTitleAtIndex:", - "_initWithCFURLResponse:", - "_timeGlyphTree", - "_setNeedsModeConfiguration:itemViewers:", - "_validateToOnes", - "updateWithFocusRingForWindowKeyChange", - "renderingMode", - "_typesForDocumentClass:includeEditors:includeViewers:includeExportable:", - "_labelCell", - "_scriptingBooleanWithDescriptor:", - "pressure", - "_entitysReferenceID", - "_startCacheTimeOutTimer", - "_setIsInUILayoutMode:", - "pumaLDAPServers", - "nonThreadedSave", - "drawRectShadow:withAlpha:", - "glyphAtIndex:isValidIndex:", - "_newSaveRequestForCurrentState", - "_registerForChildChangedNotifications", - "_isHiragino", - "_applyHTTPProxyCredentials:forProxyURL:", - "instantiateObject:", - "_widthOfLongestDateStringWithLevel:", - "grlCount", - "contentBorderThicknessForEdge:", - "_setTransaction:", - "_fetchRootDirectory", - "shouldShowWhiteLoadingView", - "setPoolCountHighWaterResolution:", - "_multipleValueForKeyPath:atIndex:", - "trackCloseHit", - "_newStandardItemWithItemIdentifier:", - "fileCreationDate", - "connectionWasBroken:", - "_itemChanged:", - NULL, - "displayedStringsArray", - "characterIndexForPoint:tracking:inMarkedRange:", - "canCalculateEstimatedSize", - "DTDString", - "isScrollable", - "_signatureUsage", - "_renderView", - "selectGroup:byExtendingSelection:", - "specifierWithPath:", - "_nestListAtIndex:", - "localizedKeyDictionary", - "_menuName", - "enumeratorOfTitle", - "defaultNameOrdering", - "ramBindedRange", - "scrollToEndOfDocument:", - "_suiteDescriptions", - "makeWindowsPerform:inOrder:", - "_minXTitlebarResizeRect", - "sourceAlias", - "captureOutput:willFinishRecordingToOutputFileAtURL:forConnections:dueToError:", - "_enableScreenUpdatesIfNeeded", - "_endEditingIfNecessaryWhenSelectingColumnRange:", - "setTest:", - "selectionModeDidChange", - "compositionsWithProtocols:andAttributes:", - "_writePersistentExpandItems", - "setData:forType:", - "_postNotificationForEvent:notificationName:parent:child:", - "hasOrderedToManyRelationshipForKey:", - "_web_noteFileChangedAtPath_nowarn:", - "_setMenuItemView:", - "_setImageInterpolation:", - "lastError", - "_sortSublayersToMatchSubviews", - NULL, - "_clockAndCalendarGetClockFrame:calendarFrame:retreatMonthButtonCellFrame:advanceMonthButtonCellFrame:returnToHomeMonthButtonCellFrame:forDatePickerCellFrame:", - "_accessibilityLoadBrowserCellsAtRow:count:", - "_showToolbar:animate:", - "addCrayon:", - "sourceInstancesForEntityMapping:destinationInstance:", - "helpMenuOpening", - "computeColumnCount", - "_applyCompressionOptionsForConnection:", - "_setKeyCellFromBottom", - "nts_SharedAddressBook", - "setAutoValidationDisabled:", - "amountOfMemoryOfCurrentDataSource:", - "_adjustFrame", - "updateReferenceIndexesToReflectRemovalAtIndexes:", - "_uncachedRectHeightOfRow:", - "initWith:::", - "_removeNumberOfIndexes:fromSelectionIndexesAtIndex:sendObserverNotifications:", - "_rectOfRowRange:", - "setHyphenationFactor:", - "_checkSpelling:", - "setPolicy:", - "objcDescriptorCreationMethodSelector2ForClass:", - "initWithRulerView:markerLocation:image:imageOrigin:", - "additionalHeightAtRow:", - "createDirectoryAtPath:attributes:", - "_colorForMetal:style:topHeight:bottomHeight:", - "_combineWithMultiValue:updating:", - "initWithItemIdentifier:", - "imageLayer", - "_firstTextViewChanged", - "_didEndSelector", - "removeWindowsItem:", - "foreignEntityKeyColumns", - "_handleSelectionChanged", - "openGLPixelType", - "_isNodeFileTypeEnabled:", - "laterDate:", - "setPreferredMuted:", - "convertPointFromViewToDocument:", - "_needsRedisplayWhenBeginningToolbarEditing", - "defaultClassNames", - "_accessibilityTitleForColumn:", - "hasReadablePropertyForKey:", - NULL, - "_sendManufacturedTrackingAreaEventsForMouseDraggedEvent:forceExit:", - "paragraphSpacingBefore", - "addEffectWithName:", - "changeDestinationToPoint:", - "binderClassesSuperseded", - "drawImage:inRect:fromRect:alpha:", - "distributionListConfigWithKey:person:inGroup:", - "policiesDisclosedClicked:", - "nts_PeopleWithAddressBook:", - "_clearCachedKey", - "needInitialDataForKey:", - "rangeOfComposedCharacterSequenceAtIndex:", - "_standardFrameForDrawersInRect:", - "_initFromTestRecord:", - "_predicateOperator", - "_recreateViews", - "initWithBytes:", - "_postEventHandling", - "setWeekdayOrdinal:", - "_resultingCertificate", - "positionRelativeToAttachedView", - "saveDefaults", - "_resizeOutlineColumn", - "boolForKey:", - "accessibilityIsInsertionPointLineNumberAttributeSettable", - NULL, - "_getAllAvailableItems:values:asChildrenOfItem:inRow:", - "environment", - "_scriptingValueOfComplexType:withDescriptor:", - "localizedDescriptionForVNodeAtPath:", - "_wantsMouseMoveEventsInBackground", - NULL, - "_removeItemAtIndex:notifyDelegate:notifyView:notifyFamilyAndUpdateDefaults:", - "_nearestKeyFrameAtX:andY:controlType:timeLineIndex:", - "addGRLToTree:", - NULL, - "_setJavaLastError:", - "renderWithRotationsInContext:rect:", - "_internalNetService", - "_configureProgressIndicator", - "saveComposition:", - "contentWidthValueType", - "_portIsConnected:view:", - "inputClientEnabled:", - "cancelSheet:", - "_storeMetadataForSaving", - "pullDownRectForBounds:", - "_getValue:forType:", - NULL, - "initWithKeyPointerFunctions:valuePointerFunctions:capacity:", - "tokenTextViewForWindow:", - "initWithObject:basicAnimation:", - NULL, - NULL, - "_notifyFamily_InsertedNewItem:atIndex:", - "mountedRemovableMedia", - "_wantsPastedFile:", - "_document:shouldClose:contextInfo:", - NULL, - "startNote", - "setLanguageModel:", - NULL, - "getItem:", - "indexOfItemWithTarget:andAction:", - NULL, - "drawSelection:forPage:", - NULL, - "_consistencyError:startAtZeroError:cacheError:inconsistentBlockError:", - "buildWhereClauseForRow:optLock:", - "ikConvertEventLocationInWindow:toLayer:", - "canAddBinding:toController:", - "formatAutosaveName", - "_populatePopup:withTableView:", - "contentRect", - "_downloadEnded", - "_zeroScreen", - NULL, - "_setAllowsTearOffs:", - "useCredential:forChallenge:", - "_unobstructedPortionOfRect:", - "_setConversionFromData:type:inPasteboard:generation:item:", - "isInInterfaceBuilder", - "totalSize", - "lockFocusIfCanDrawInFrame:flipped:clip:", - "sortIndicatorRectForBounds:", - "findSidebarNodeForNode:", - "clearProperties", - "commandDescriptions", - "initBeforeDispatch", - "endEdits", - NULL, - "initWithFrame:pixelFormat:", - "setInputData:", - "_trackMouseForHitCell:withEvent:", - "_insertNewRowAtIndex:ofType:withParentRow:", - "_selectionUpdated:", - NULL, - "updateGridContent", - "initWithAffectedRange:layoutManager:undoManager:replacementRange:", - "updateIndexPair:subIndex:count:", - "_caseInsensitiveNumericCompare:", - "useStoredAccessor", - "setDecision:forRecord:", - "refresh", - "removeFromSuperlayer", - "_mutableArrayValueForKeyPath:ofObject:atIndex:raisesForNotApplicableKeys:", - NULL, - "updateSearchViewWithWidth:", - "abGroupDatabaseImpl", - "stopTimerForSpeaking", - "addProperty:atRow:toRecord:withUniqueId:resultsView:tableName:", - "currentDirectoryPath", - "setProgrammablePatch:sourceType:", - "registerCommandDescription:", - "kernelsWithString:", - NULL, - "availableBindings", - "setDisplayDirty", - "redSpeed", - "whitespaceAndNewlineCharacterSet", - "_processObjectStoreChanges:", - "rightMouseDown:", - "fetchPublicRecordsForClass:withPredicate:prefetchingKeyPaths:addressBook:", - "parseBDAY", - "frameViewClassForStyleMask:", - "_doHide", - "substitutedValueForPredicate:", - "_fetchPreviewTypeTimedOutForDocumentPreview:", - "setContextHelp:forObject:", - "_handleSendControlSize:toCellOfView:", - "cacheZoomState", - "initWithContainerClassID:key:baseGetter:baseSetter:containerIsa:proxyClass:", - "_getCursorBitmapWidth:andHeight:", - "replacePointerAtIndex:withPointer:", - "point", - "reactToDockSizeChange", - "_sourceEntityVersionHashesByName", - "labelForPage:", - "currentGRLResolved:", - "_appendTypeDefinitionsSuiteDeclarationToAETEData:", - "_changeAllDrawersFirstResponder", - "setStartSpecifier:", - "_imp", - "arrayRepresentation", - NULL, - NULL, - "animation:didReachProgressMark:", - "calculatesAllSizes", - "elementTypeDescription", - "fastestMipmapItemForSize:forGLRendering:", - "_shouldProcessLongTasks", - "_configureDirectoryPopup", - NULL, - "_couldHaveBlinkTimer", - NULL, - "ignoresAlpha", - "revertAndCloseManagedObjectContext:", - "_cleanUpOpenGLContext", - "endLocalContext", - "localizedModelStringForKey:", - "initWithSetHeader:", - "_dictionaryRepresentationForPropertyTypes:andProperties:", - "superclassDescription", - "operatorType", - NULL, - "showNodeInCurrentDirectoryWithFilename:selectIfEnabled:", - "mergeNote:", - "generateTableAlias", - "_writeMetadataData:andMapDataData:toFile:error:", - "removeTabStop:", - "initWithCalendarIdentifier:", - NULL, - "isShown", - "attributesForParameterPortWithInfo:name:index:", - "initWithType:arguments:inHelpBooks:", - "setArrowPosition:", - "sortingGroup", - "findNode:matchType:useFirst:", - "setFrameFromString:", - "_recacheButtonColors", - "scrollDown", - "_changed:", - "_highlightAllLinesWithColor:", - "_getValue:forObj:", - NULL, - "isSecure", - "boundingRectWithSize:options:attributes:", - "monthOfYear", - "accessibilityRowsAttribute", - "_generateMetalBackground", - "visibleFrame", - "_pageFormatAttributeKeys", - NULL, - "imageToDrawAtIndex:", - "ruleEditor:child:forCriterion:withRowType:", - NULL, - "curveHullsEnabled", - "popupDictionary", - "nonmutatingMethods", - "_windowDidClose", - "_unpackEventRef:", - "_menuItemViewerHIViewClassName", - NULL, - "_setupCallbacks", - "indexItemsArray:", - "_handleError:delta:fromRect:toPoint:", - "localContext", - "_result", - "drawInRect:withAttributes:", - "graphicsPort", - "allowPictureEditing", - "_drawerDepthInset", - "_moveCursor", - "_setEncounteredCloseError:", - "moveRequestWithSession:sourceURI:destinationURI:sourceToken:destinationToken:", - "paperSize", - "recycle", - "startTrackingWithEvent:inView:withDelegate:", - "fullPath", - "replaceCharactersInRange:withString:", - "_setMultipleValue:forKey:atIndexPath:", - "_bottomMargin", - "setMaximumSignificantDigits:", - "createImageFromImageSourceRef:", - "onSliderMouseUp:event:", - "_allowAnimated_setShadow:", - "_initializeSAX2Callbacks", - "abDictionaryForBackupAtPath:", - "startProxy", - "filesystemItemRemoveOperation:shouldRemoveItemAtPath:", - "setDrawsContainmentIndicator:", - "totalCount", - "initPopUpWindow", - "_unprotectEvilCharacter:", - "methods", - NULL, - "_dataRepresentationFromBitmapRepresentation:", - "recordToManyUpdatesForObject:withOperation:", - "_prefetchWithFetchRequest:withObjectIDs:inContext:", - "_renderingInfo", - "provideNewSubview:", - "setQuotingWithSingleQuote:double:", - "countKeyPathForNode:", - "_registerOrUnregister:observerNotificationsForKeyPath:ofModelObject:", - "initWithAppleEventCode:", - "setItemsPerRow:", - "_animatedScrollToPoint:", - "_doAutoselectEdge", - "customProperty", - "initGetWithSession:URI:ifModifiedSince:includeRangeHeader:rangeStart:rangeEnd:localDestination:", - "_convertRectFromSuperview:test:", - "computeAlphaMask", - "setMinimumIntegerDigits:", - "_updateLayerSize", - "sortedArrayUsingSelector:", - "confirmCloseSheetIsDone:returnCode:contextInfo:", - "shouldColorMatch", - "localTimeZone", - "indexGreaterThanOrEqualToIndex:", - "shouldIndex", - "_fetchRequestForPerformingFetch", - "_doAutoscroll:", - "defaultBoostShadowAmount", - "primitiveAppleUseCoreUI", - "setUsesDataSource:", - "valueWithSize:", - "pointingDeviceType", - "reflROI:forRect:userInfo:", - "_servicesMenuHasLoaded", - "_segmentedMenuDelayTime", - "_insertNodeIntoEntityCache:", - "setClearsFilterPredicateOnInsertion:", - "URLsFromRunningOpenPanel", - "_receivedSuccessResponse", - "_needsLiveUpdates", - "cacheMode", - "didStartRenderingPatch:", - "convertNeutralX:y:toTemperature:tint:", - "coveredCharacterSet", - NULL, - "_endCustomizationPanel", - "fastMipmapItemForSize:forGLRendering:", - "separatesColumns", - "sharingType", - "CIContext", - "operation:notify:", - "resolveDecompressionSessionOptions:pixelBufferAttributes:", - "mouseExitedDelegate:", - "destinationEntity", - "setInterpolateSizeAndColor:", - "viewOffsetForCurrentClipRect", - "selectRowsWithCachedStatement:", - "_addOutputPortWithClass:forKey:attributes:", - "_drawFocusRingWithFrame:", - "adjustView:frame:forView:characterIndex:layoutManager:", - "versionForClassNamed:", - "enableSecureInput:", - "allProperties", - NULL, - "setFileAttributes:", - NULL, - "setCanChooseFiles:", - "attributeTypeForXMLInfo:", - "registeredImageRepClasses", - "setScriptErrorOffendingObjectDescriptor:", - "_childrenChangedForNode:", - "errorWithDomain:code:userInfo:", - "containerNodeWithChildren:", - "setCurrentOperation:", - "initWithName:", - "filesystemItemCopyOperation:shouldCopyItemAtPath:toPath:", - "setRepresentedURL:", - "_doneEditing:", - "canZoomIn", - "_setForceOriginalFontBaseline:", - "pullDownImage", - "_clearTrackingRects", - "isZoomable", - "imageCropView:keyUp:", - "markBegin", - "vcHardwareCaps", - NULL, - "_noDataConnections", - "_clientDidEndSelector", - "initWithSetFunc:forImp:selector:", - "compositionsWithProtocols:andAttributes:sortedBy:", - NULL, - NULL, - NULL, - "_keyboardIsOldNeXT", - "_isAll", - "deviceWithUniqueID:", - "movieBeingSet", - NULL, - "nsImage:", - "showsSuppressionButton", - "_textBackgroundColor", - "nts_IsAll", - "_topmostChild", - "sharedPreviewView", - "bufferBytesPerRow", - "writablePasteboardTypes", - "setSendsWholeSearchString:", - "initWithName:url:filterData:actions:domains:comments:readOnly:owner:", - "_getPageHeaderRect:pageFooterRect:forBorderSize:", - NULL, - "bumpDatasourceVersion", - "setWhereIntermediate:", - "_windowWithRealWindowNumber:", - "_computeMinimumDisplayedLabelSize", - "resolveConflict:", - NULL, - NULL, - NULL, - "_noUiClearField:", - "switchVisualContexts", - "_reloadData", - "firstResponder", - "date", - "_acceptSubpredicates:flags:", - "screen", - "fidelityForEngineOfClass:forDisplayID:", - "_checkInName:onHost:andPid:forUser:", - "conditionalBehaviorOffByDefault:", - "didFinishLoading", - "accessibilityRangeForIndexAttributeForParameter:", - "usesIndexLabels", - "convertFontTraits:", - "_adaptPreviewFrameForStaticPreviewSizeHint:minSize:maxSize:", - "fieldDataForOid:", - "isDateComparison:forProperty:", - "_buttonToolTip", - "minimumRangeOfUnit:", - "initWithFrame:prototypeRulerMarker:", - "_isCollectionDecodingUnarchiver:", - "accountUpgradeURL", - "measureRequirementsOf:query::results:", - "ignoresViewTransformations", - "pathFromPartialURLOrHFSPath", - "roundDeterminateColor", - "keyForIndex:", - "newWithOwner:", - "importFinished:", - "closeWithEffect:", - "_pathLocationControlDoubleClick:", - "_requireMainThreadDefaultBezelCaching", - "_initEmptyHTMLNames", - "_arrayForPartialPinningFromArray:", - "totalLen", - "_delegateRespondsToCanSelectRow", - "_setResultingCertificateData:", - "minuteOfHour", - "language", - "clearAllFieldVisiblity", - NULL, - "tableColumn", - "bufferBaseAddress", - "registeredProtocols", - "mouseDown:", - "_didCloseFile:", - "setKeyBindingManager:", - "showGroupMembership", - "connection:didReceiveAuthenticationChallenge:", - "setCellPrototype:", - "filteredImage:keysAndValues:", - "lastRange", - NULL, - "_addProperty:", - NULL, - "setTreatsDirectoryAliasesAsDirectories:", - "_buildGraphUnitsForOutputConnection:error:", - "startDragNDropWithEvent:", - "setSelectionIndex:", - "_raiseNilValueExceptionWithSelector:", - "goToPage:", - "newNormalizedSearchString", - NULL, - "initWithFrame:options:", - "_doFindIndexesOfNodes:inDirectory:visitedNodes:", - "frameSizeForContentSize:hasHorizontalScroller:hasVerticalScroller:borderType:", - "_canUseKeyEquivalentForMenuItem:", - "freeExpendedRepresentationCaches", - NULL, - "canDragRowsWithIndexes:inColumn:withEvent:", - "_getProgressFrame", - "_removeSubview:", - "rectOfTickMarkAtIndex:", - NULL, - NULL, - "setFauxFilePackageTypes:", - "_closeAlertSheet:wasPresentedWithResult:inContext:", - "presentableNames", - "_keyViewRedirectionDisabled", - "modificationDate", - "didChangeValuesForArrangedKeys:objectKeys:indexKeys:", - "imageUID", - "_superitem", - "pointerArrayWithStrongObjects", - "_datasourceImageRepresentationType", - "_archivedData", - "isFloatSupported", - "initWithXMLString:options:error:", - "_setRemoved:", - "invokeSelector:withArguments:forBinding:atIndexPath:error:", - "_hasBezelBorder", - "nodeAtIndex:", - "_singleFilePathValue", - "handleEvent:characterIndex:edge:client:", - "_layoutOrderForItem:inRow:", - "_setLineBreakMode:", - "computeInlay", - "_updateMeasurements", - "_customFieldWindowSheetDidEnd:returnCode:contextInfo:", - "client", - "removeObserver:name:object:", - "outlineView:persistentObjectForItem:", - "_didSaveChanges", - "commitPendingChangesAndSave:", - "fileHandleForReading", - "highlightedMenuColor", - "runActionForKey:object:arguments:", - "_ensureMinAndMaxSizesConsistentWithBounds", - "rootProxyForConnectionWithRegisteredName:host:", - "scrollOriginForPageTopLeft:", - "acceptsRootNode", - "animationWithKeyPath:", - "_goUp:", - "_coreUILinearKnobCallbacksMap", - "menuBarVisible", - "_animationTimerCallback:", - "isHeartBeatThread", - NULL, - "defaultAttachmentScaling", - "_traverseLibXML2Node:depth:", - "afmDictionary", - "createArrayRef", - "_getBucketLocationForBucket:", - "addEntriesFromDictionary:", - "clearsColorBuffer", - NULL, - "_cachedObjectValue", - "_readURLStringsWithNamesIntoRange:fromPasteboard:", - "_setCertAuthorityIsEnabled:", - "_inQuickDisplayModeForWindow:", - "isErrorStatusCode:", - "_recursivelyUpdateKeyEquivalents", - "tableView:shouldTrackCell:forTableColumn:row:", - "indexOfItemWithObjectValue:", - "whitePoint", - "settingsView:clearSettingForKey:", - "_backingType", - "endEditing:", - NULL, - "_willPresentReopeningError:forURL:contentsURL:", - NULL, - "superRelease", - "clearProgressBarToolTip", - "isRotatedOrScaledFromBase", - "fadePopUpWindowImmediately", - "setOperationColor:", - "resetRectCaches", - "setTexturePackerIndex:", - "createAuxData", - "connect:", - "setHidesEmptyCells:", - "_generateInverseRelationshipsAndMore", - "forwardMetadataToObject:", - "setAttributedAlternateTitle:", - "documents", - "_eventRelativeToWindow:", - "backupInfoDictionariesSortedByDate", - NULL, - "changedMembers:", - "_distinctUnionOfObjectsForKeyPath:", - "getClasses", - "_setRowHeaderTableColumn:repositionTableColumnIfNecessary:", - "commonInit", - "decompressionRequirementsDidChangeForConnection:", - "setMeCard:", - NULL, - "selectionGranularity", - "deviceCMYKColorSpace", - "srRecognitionSystem", - "_maintainInverseRelationship:forProperty:oldDestination:newDestination:", - "applyToContext:", - "_stopObservingNodeIfNecessary:", - "childrenKeyPathForNode:", - "alwaysShowsDecimalSeparator", - "newUpdateStatementWithRow:", - "setHighlighted:", - "_errorExpectedTypeDescriptor", - "displayCompletions:indexOfSelectedItem:forPartialWordRange:originalString:atPoint:forTextView:", - "_subthreadComputePreviewThumbnailImages", - "_copyReplacingURLWithURL:", - "menu", - "_shouldDrawArrow", - "insertColor:key:atIndex:", - "imageScalingForSegment:", - "decodeValuesOfObjCTypes:", - "createThumbnailForIndex:subIndex:", - "insertObject:atArrangedObjectIndex:", - "updateInsertionPointStateAndRestartTimer:", - "ownsDestinationObjectsForRelationshipKey:", - "_minXTitlebarWidgetInset", - "_popUpMenuWithEvent:forView:", - "displaceROI:forRect:userInfo:", - "_updateMenuForClippedItems", - "setNamespaces:", - "maidenName", - "callbacks", - "_initInStatusBar:withLength:withPriority:", - "_ungrowFrameForDropGapStyle", - "tableColumnWithIdentifier:", - "quartzFilterManager:didAddFilter:", - "_endInsertionOptimization", - "_computeBounds", - "sharedCompositionRepository", - "_convertToText:", - "_promoteGlyphStoreToFormat:", - "invalidateCellsLayoutAtIndexes:", - "addSample:range:withDuration:sampleDescription:numberOfSamples:withFlags:", - "imageWithCGImageSource:", - "anyAttributeString", - "beginFindStrings:withOptions:", - NULL, - "lastColumn", - "centerScanRect:", - "redColor", - "setUpDataSourcesAndSelection", - "setFilterString:", - "_argumentsFromAttributesKey:originalArguments:", - "propertiesWithAddressBook:", - "_positionWindow", - "_coreUILinearBarCallbacksMap", - "_drawGapStyleDropHighlightBetweenUpperRow:andLowerRow:atOffset:inGapRect:", - "_saveIconViewTextSize:", - "displayNameAtPath:", - "initWithState:withParent:", - "entries", - NULL, - "_popUpContextMenu:withEvent:forView:withFont:", - "_requestAnyHiddenState", - "initWithError:", - "_printSettingsAttributeKeys", - "changeCurrentDirectoryPath:", - "sizeForMagnification:", - "initMakeCollectionWithSession:path:", - "_registerUndoForInsertedObjects:", - "stateImageWidth", - "_real_willChangeValueForKey:", - "removeAllPoints", - "_updateAppleMenu:", - "getNumberOfRows:columns:", - "loadPlugInAtPath:", - "postNotification:", - "createElementNS:qualifiedName:", - "_openDrawerOnEdge:", - "_handleSpeechDoneCallback", - "_updateVisibleCellIndexes", - "detachNewThreadSelector:toTarget:withObject:", - "_accessibilityButtonRect", - "setCurrencyDecimalSeparator:", - NULL, - "readFromURL:options:documentAttributes:error:", - "setEnableLiveAntialiasing:", - "convertCString:toUnsignedInt64:withBase:", - "_compositedBackground", - "backgrounQueriesRunning", - "useExifChanged:", - "goToNextPage:", - "setTailIndent:", - NULL, - "setWindowBackingLocation:", - "relationshipMappings", - "switchToSinglePage", - "localizedNameForFamily:face:", - "releaseCaches", - "_menuItemDictionaries", - "_usesLightBottomGradient", - "allThumbnails", - "_adjustButtons", - "initWithGroup:newName:addressBook:", - "setImageName:action:target:", - NULL, - NULL, - "accessibilityBoundsForRangeAttributeForParameter:", - "_generateSQLForExpressionCollection:allowToMany:inContext:", - "_isChecked", - "arrayWithRanges:count:", - "selectDraggedFileNode:", - "_ownedByPopUp", - "_createDefaultCollectionRep", - "removeAttribute:values:", - "_setDocumentDictionaryName:", - "__oldnf_addThousandSeparatorsToFormat:withBuffer:", - "setArray:", - "tooltipEntered:", - "validateImage", - "_setContentHasShadow:", - "initWithComposition:controller:", - "openGLStateDidChange", - "attributesForKey:", - "resultCode", - "_informParentStore:noLongerInterestedInObjects:", - "matchForPredicate:", - "_computeFolderContentsThumbnailsContinuously:requestIndex:", - "setMaximumCacheSize:", - "_visibleRowIndexesForObject:", - NULL, - "attributesAtIndex:longestEffectiveRange:inRange:", - "_setPrintNameWithName:item:", - "_setHeaderLocalizer:", - "sizeWhenSizedToFit", - "setDefaultCredential:forProtectionSpace:", - NULL, - "fillOval:color:context:", - "fontPanel:", - "sourceDidChangeNotification:", - "recalcInsideShadow:forResolutionData:", - "_postFrameChangeNotification", - "_enqueueEndOfEventNotification", - "smartDeleteRangeForProposedRange:", - "isGreaterThan:", - "setOptionsDictionary:", - "removeSubNodesAtIndexes:", - "conditionallySetsEnabled", - "_loadWordData", - "drawDividerInRect:", - "_initWithCFCachedURLResponse:", - "sizeValueForAccessibleChildAtIndex:", - "limitRect", - "imageForSegment:", - "selectResult:", - "flushAllCachedChildren", - "evaluateUTF8String:sourceURL:line:", - "_scrollToFinalPosition", - "CA_distanceToValue:", - "receivePort", - NULL, - "doPerformSCTViewGRL:", - "commands", - NULL, - "buttonResultForResolutionData:", - "_synchronizerThread:", - "enumeratorWithArray:", - NULL, - "getAllObjects:", - "mappingForEntity:forConfigurationWithName:", - "firstSubscribedGroup", - "splitView:resizeSubviewsWithOldSize:", - "_attributedStringValue:invalid:", - "setPrimitiveValue:forKey:", - "addMember:forKey:", - "initFromGrayValue:toGrayValue:colorSpace:", - "child:withModifier:referenceType:value:", - "stringWithString:", - "_isWhitespace:", - "pointInTitleRect:inNode:bounds:", - "annotationFollowing:wrapAround:", - "_changeDrawerMainState", - "_postNicestDraw", - "foldPolys:aboutCenterX:Y:atAngle:up:", - NULL, - NULL, - "_delegateRespondsTo_nextTypeSelectMatchFromIndex", - "_appendKeyFrame:", - "_lookUpDefiniteRangeInDictionaryFromMenu:", - "transformEnclosedArea:by:", - "_prefersTrackingWhenDisabled", - "writeEPSInsideRect:toPasteboard:", - "_insertObjects:atArrangedObjectIndexes:objectHandler:", - "mutableCopy", - "newSegmentOfSize:", - NULL, - "appendClause:forProperty:keypath:", - NULL, - "_resizedWidth", - "setRef:toObj:", - "liveAntialiasingEnabled", - "serializePListValueIn:key:value:", - "spinningArrows", - "_doInvokeServiceIn:msg:pb:userData:error:unhide:", - "inputDevicesWithMediaType:", - "runDotMacToolWithArguments:wait:", - "setDefaultLineJoinStyle:", - "_exitedFullscreen", - "_updateFormattedQueryString", - "startListeningForCameraEvents", - "viewAnimations", - "_setNeedsDisplayInRectWithFocus:", - NULL, - "pixelBlockWidth", - "_initWithRetainedCFSocket:protocolFamily:socketType:protocol:", - "_dragCanBeginFromHorizontalMouseMotion", - "_recomputeBucketIndex:bucketFirstRowIndex:", - "pixelFormatXRGB8", - "_binderForBinding:withBinders:createAutoreleasedInstanceIfNotFound:", - "ISS__ay_postNotificationName:object:userInfo:inThread:beforeDate:", - "cycleToNextInputScript:", - "tabView:shouldSelectTabViewItem:", - "_tabViewWillRemoveFromSuperview", - "_arrangeToHaveMetadata:", - "initWithResource:", - "removeMember:", - "sendAction:to:from:", - NULL, - NULL, - "_scrollRowToCenter:", - "rowAtY:", - "setPanelFont:isMultiple:", - "_computeDragImage", - "drawerDidClose:", - "accessibilityWindowAttributeValueHelper", - "objectIsForcedForKey:", - "_flushCachedChildrenForNode:", - "analyzeRevealedGRLs:withWindow:withWindowGRL:", - NULL, - "_loadColors", - "_didRender:", - NULL, - "inputNeutralTint", - "_frameDescriptor", - "copyGlobalRootContext", - "cancelDelayedPicture", - "initWithRow:column:outlineView:", - "_verifyDefaultButtonCell:", - NULL, - "sharedFileInfoCache", - "parseNICKNAME", - "decodeSizeForKey:", - "_QCView", - "pathControl:validateDrop:", - "isEncrypted", - NULL, - "_isExplicitlyNonEditable", - "_createElementContent:", - "isInfinite", - "_topLevelObjectClassDescription", - NULL, - "_unpackMouseEventRef:", - NULL, - "positiveFormat", - NULL, - "_createMenuMapLock", - "rootElement", - "visualContextRef", - "ql_commonInit", - "messageFontOfSize:", - "accessibilityIsSelectedTextAttributeSettable", - "stringForType:", - "_setMouseEnteredGroup:entered:", - "invokeSelector:withArguments:forBinding:atIndex:error:", - "setHasShadow:", - "visibleCellIndexesDidChange", - "_typesetterBehavior", - "canAllocateSize:", - "_readFilenamesIntoRange:fromPasteboard:", - "rectForItem:inBounds:", - NULL, - "perspectiveROI:forRect:userInfo:", - NULL, - "setLocation:forStartOfGlyphRange:", - "removeFilterNotification:", - "canIgnoreSettingMinAndMaxForObject:", - "_drawStandardPopUpBorderWithFrame:inView:", - "_setContextInfo:", - "initWithDataSource:", - "objectInInputTopLineAtIndex:", - "_registerForSessionNotifications", - NULL, - NULL, - "_web_guessedMIMETypeForExtension:", - "incrDBRetainCount", - "removeColumns:", - "showWindow", - "customMipmapIsValidAndMatchSize:andQuality:", - "_web_stringByExpandingTildeInPath", - "_getFSRefForPath:withOptions:", - "fxButton", - "recalculateKeyViewLoop", - "scanForPopupsUserOpened:", - "_setNeedsDisplayForDropCandidateItem:childIndex:mask:", - "fillSubrowList:forDisplayedRecords:withDelegate:", - "defaultLineWidth", - "setLeadingOffset:", - "_animatePanel", - "selectWord:", - "_copyNeedsDisplayRegionInRect:validateSubtractedRegion:", - NULL, - "topAutoreleasePoolCount", - "_presentModalAlertWithError:responder:relatedToBinding:", - "tableView:dataCellForTableColumn:row:", - "localizedCatalogNameComponent", - NULL, - NULL, - "classDescriptionForKey:", - "sortsChildrenEfficiently", - "_protocolClassForRequest:allowCF:", - NULL, - NULL, - "gradientWithParameters:inRect:", - "_descriptorByTranslatingColor:ofType:inSuite:", - "_setStdTextAttrs:select:font:color:", - "invokeWithTarget:", - "drawInsertIcon:inContext:", - "indexPathByRemovingLastIndex", - "valueForProperty:shouldTranslateToStrings:", - "isCurrListEditable", - NULL, - "recordsMatchingSearchElement:", - "_isClosable", - "setThumbnailQuality:", - NULL, - "wantsToInterpretAllKeystrokes", - "_shouldAttemptDroppingAsChildOfLeafItems", - "shortValue", - NULL, - "setUnquotedStringCharacters:lowerCaseLetters:upperCaseLetters:digits:", - "_trackMouse:forSegment:inRects:count:inCellFrame:ofView:untilMouseUp:", - "_removeMouseMovedListener:", - "outlineViewItemDidExpand:", - "willFireFault", - "screenRectForItem:", - "chapterTrack", - "resolveURL:withResponseTarget:", - "drawPlaceHolder:inRect:reflection:", - "setRunning:", - "directoryResultsPane", - "setReferenceOf:", - "isBusyForTaskManager", - "_willDisplayOpenPanel:", - "initWithOpenGLContext:options:", - "_knobRectFromPercentage:radius:", - "_convertValueToObjcValue:originRootObject:rootObject:", - "_createImageFromPasteboard:", - "_totalAdvancementForNativeGlyphs:count:", - "recordToMany:forSourceObjectID:relationshipName:", - "_automateLiveScroll", - "_batchExpandItemsWithItemEntries:expandChildren:", - "_contentToFrameMaxYHeight:", - "_launchOrWaitForDaemon", - "dividerThickness", - "genieFXLoop:", - "spaceItemIdentifier", - "_saveSheetDidEnd:returnCode:contextInfo:", - "_highlightColumn:clipRect:", - "sessionUsername", - "itemWithTitle:", - "_createSurface", - "setCommentColor:", - "abbreviationForDate:", - "unscheduleOnRunloop:mode:", - "_requestEnabledState:", - "analyzeAndIndexAppDidComplete:", - "setFormatAutosaveName:", - "shouldChangeTextInRange:replacementString:", - "_contextMenuTargetForEvent:", - "_undoRedoChangeProperties", - "_captureReorderResizeColumnImageCaches", - NULL, - "setHref:", - "setTrust:", - "getGlyphs:range:", - "savedQueryData", - "insertSublayer:below:", - "dismissTimeMachine", - "_preparePredicateOperator:", - "canFocusCell:atTableColumn:row:", - NULL, - "initWithUID:dataFile:", - "indexForUID:", - "from:subtract:", - "_destroyRealWindowIfNeeded", - "_simpleDeleteGlyphsInRange:", - NULL, - "_setNextKeyBindingManager:", - "_postFromSubthread:", - "_computeMinHeightForSimpleSavePanel:", - "setDirectory:", - "setPreviewFeatures:", - "_hasHorizontalOrientation", - "_computeAllRevealovers", - "scheduledTimerWithTimeInterval:invocation:repeats:", - "orPredicateWithSubpredicates:", - "_createWindowsMenuEntryWithTitle:enabled:", - "allowsSubpatchesWithIdentifier:", - "_isAXConnector", - "sendWillCacheResponse:", - "setWithObjects:count:", - "flushBuffer", - "_parseText2", - "_setDidWarnAboutSelfSignedCert:", - "trackStandardTextSelection:", - "idleAllMovies:", - "removeAppleUseCoreUI:", - "countOfInputBottomLineParams", - NULL, - NULL, - "orderedDocuments", - "updateWithinDateWidgetsWithInterval:", - "_accessibilityNumberOfChildren", - "typeForProperty:withComparison:", - "inspectorClassWithIdentifier:", - "nodeClassDescription", - "_cancelInPerforms:target:selector:", - NULL, - "switchedInputMode:", - "_updateCAConfigFileSerialNumberToInt:", - "setGhostCellCountOnTheRight:", - "_hasSelectedRow", - "initWithContentsOfMappedFile:error:", - "previewView:dragOperationForDrop:forURL:", - "_specifiedIndicesOfObjectOrObjectsInContainer:count:", - "invalidateGlyphsForCharacterRange:changeInLength:actualCharacterRange:", - "mouseDownStyle", - "showsToolbarButton", - "shortcutIsVisible", - "_editOnSingleClick", - "updateMovieBoxIsOpaque", - "mnemonicLocation", - "_buttonFrameSizeForSizeMode:", - "abGlobalMailRecentAPILockInFile:line:", - "_applicationStatusChange:", - "initQCContextWithSize:", - "_handleMouseEvent:", - "unhideAllApplications:", - "_carbonNotification", - "state", - "setAutoAddExtensionToNextInput:", - "tabStopType", - "_installPending", - "coerceArray:toColor:", - "initWithBitmap:rowBytes:bounds:format:options:", - "_unpinViews:resizeMasks:", - "overlayForType:", - "sortsSublayers", - "mouseLocationOutsideOfEventStream", - NULL, - "_minimizeToDock", - "enumeratorWithDictionary:", - NULL, - "initWithContentsOfURL:usedEncoding:error:", - "_setMinColumnLayoutMinRequiredVisibleWidth:", - "simpleQueryString", - "imageCropViewEditedImageDidChange:", - "drawRotationGizmo", - "_tryToSetCurrentPageNumber:", - "addMovieToIdleList", - "_checkExecutionMode", - NULL, - "insertObject:inAppleUseCoreUIAtIndex:", - "setCurrent:", - "_ruleAreaRect", - "_glyphIndexForCharacterIndex:startOfRange:okToFillHoles:", - "_allowAnimated_removeFromSuperviewWithoutNeedingDisplay", - NULL, - "reload", - "accessibilityContentsAttribute", - "setReplyTimeout:", - "rectWithoutShadow", - "scrollWheelMultiplier", - "beginSecureMode", - "_readRTFIntoRange:fromPasteboard:", - "verbForImportPanel", - NULL, - "_setColumnSpan:", - "exporterForImageManager:", - "allAssociatedMembersAndSubgroups:", - "pointerFunctions", - "hostname", - "writePlist:toURL:withMode:owner:group:format:", - "_minXWindowBorderWidth", - "startAddress", - "lastRangeOnPage:", - "serviceWithName:inManagedObjectContext:", - "indexOfRecord:", - "setCompareSelector:", - "encodeInteger:forKey:", - "tableView:updateVisibleRowInformation:", - "resizePathFrom:to:", - NULL, - NULL, - "setFidelity:", - "utiAsString", - "_canRunCustomizationPanel", - "importPeople:intoGroup:", - "fillRect", - "transformPoint:", - NULL, - "_putKeyFormAndDataInRecord:", - "_validateGroupsSelection", - "printJobTitle", - "externalType", - "_cachedCompositions:", - "_displayTemporaryToolTipForView:withDisplayDelegate:displayInfo:", - "readRTFDFromFile:", - "setMouseOnIcon:", - "handleEventDelegate:", - "accessibilityIsVisibleCharacterRangeAttributeSettable", - "createCGImageForManager:withOptions:", - "textContainerInset", - NULL, - NULL, - "day", - "setupItem", - "_removePopUpWithTag:", - "resizedColumn", - "_defaultLineHeight:", - "setAutosaveTableColumns:", - "scriptingIsLessThan:", - "_loadMediaBrowserNodeIfRequired", - "sizeOfTitlebarToolbarButton", - "_setAsSystemColor", - "pixelFormatIf", - "_isPixelAlignedInWindow", - "automaticallyHandleGutter", - "setNotificationCenterSerializeRemoves:", - "_characterIndexForMoveForwardFromSelectedRanges:", - "putLength", - "newIncrementedSearchString", - "accessibilityIsRoleDescriptionAttributeSettable", - "initialConditionsFromResolutionData:", - "isEditingGroupName", - "childWindows", - "_handleFileListModeChanged", - "setSelected:forKeyFrame:inTimeLine:extendSelection:", - "_imageRectWithRect:", - "cellNotification:cell:", - "_contentChanged:regenerate:", - "indexOfDirectoriesGroup", - NULL, - "enumeratorAtPath:", - "setDisplayedCard:", - "loadSidebar", - "visibleCellIndexes", - "_adjustTimerForAutosync", - "_distanceFromToolbarBaseToTitlebar", - "_canDrawOutsideLineHeight", - NULL, - "_setErrorNumber:", - "_userKeyEquivalentModifierMaskForTitle:", - "beginSheetForSavePanel:withFilepath:didEndSelector:contextInfo:", - "availableStateGRLs", - "_readStringIntoRanges:fromPasteboard:", - "_notifyObserversForKeyPath:change:", - "audioStreamBasicDescription", - "minSize", - NULL, - "indexValue", - "initWithAutoUpdate:", - "setCharacterIndex:layoutManager:", - "_dateForString:", - "modeButton", - "startUpDelay", - "commonKaleidoscopeROI:forRect:userInfo:", - "removeComponent:", - NULL, - "_referenceData", - "labelAtIndex:", - "fontNamed:hasTraits:", - "vertBlur1ROI:destRect:", - "_addConversionsFromTypes:", - NULL, - "loadCache", - "performActionFlashForItemAtIndex:", - "restoreDefaults", - "_lastSnapshot", - "allowableCharacters", - "_URLStringForString:", - "initialized", - "accessibilityTextLinkAtIndex:", - "releaseIndex:", - "insertKnownAbsentItem:", - "URLResourceDidFinishLoading:", - "languageModel", - "savesAppearanceStream", - "propertyIsComposite:", - "allowsColumnResizing", - "insertItemWithTitle:action:keyEquivalent:atIndex:", - "setCachedSeparately:", - "appearanceStyle", - "shouldCloseWindowController:", - "_validateShadowEffect:", - "imageWithCVImageBuffer:", - "preloadHint", - "setKeyEquivalentFont:", - "operationShouldBeLaunchedNow:", - "centerPointForZoomAndRotation", - "setMigrationDebugLevel:", - NULL, - "_drawKeyboardUIIndicationForView:debuggingIndex:", - "addNextButton", - "cancelUserAttentionRequest:", - "_animateSheet", - "_flattenProperties", - "fileSystemChanged", - "_setContextMenuEvent:", - "setTextMargins:", - "rasterize:", - NULL, - "setLabel:", - "fk", - "XMLStringWithOptions:", - "draw", - "directParameter", - NULL, - "_shouldHavePeriodicEventsForPoint:", - "timeLineActive:", - "unvalidatedPath", - NULL, - "_setChangedObjectIDs:", - "_releaseRowHeightStorageIfNecessary", - "putRequestWithSession:data:URI:includeRangeHeader:rangeStart:rangeEnd:token:", - "endUpdatePixels", - "_standardFrame", - "scaleMeasurements:byFactor:", - "dataTypeDoesNotExist:forKey:inCurrentStruct:inCustomStruct:", - NULL, - NULL, - "pixelFormatIh", - "allDirectoriesServer", - "_isInConfigurationMode", - NULL, - "locationInView:hitCellAtIndex:", - "__oldnf_addInternalRedToTextAttributesOfNegativeValues", - NULL, - "getColor:location:atIndex:", - "_autoLockValue", - "movieController", - "arrayByExcludingObjectsInArray:", - "registerNodeWithClass:identifier:isPrivate:", - "progressIndicator", - "card", - "URLProtocol:wasRedirectedToRequest:redirectResponse:", - "keyPathIfAffectedByValueForKey:exactMatch:", - "_applyValues:context:", - "useCredential:forAuthenticationChallenge:", - "isBycopy", - "addServiceProvider:", - "firstTextView", - "setMaxConcurrentOperationCount:", - "_presentableFileNameFromURL:", - "positionDidChange", - NULL, - "currentEntityMapping", - "_cachedValuesAreValid", - "setOriginalImageIsInvalid:", - "initWithData:", - "stopListeningForCameraEvents", - "controlMenu:", - "defaultPrinter", - "burn:into:opacity:", - "coversAllCharactersInString:", - "printInfo", - "pathControl:shouldDragPathComponentCell:withPasteboard:", - "attributes", - "decodeBytesForKey:returnedLength:", - "_barberImage:", - "_showsAllDrawing", - "compareWithRecordValue:", - NULL, - "_nextInputManagerInScript:", - "detachDrawingThread:toTarget:withObject:", - "isDeletableFileAtPath:", - "valueForUndefinedKey:", - "matchableResultsForString:inSingleProperty:", - "_deleteDigit", - "abManagedObjectContextDidSave:", - "isSetOnMouseEntered", - "drawImageWithFrame:inView:", - NULL, - "initOrTestWithTests:", - "initWithFrame:textContainer:", - "applicationShouldTerminateAfterLastWindowClosed:", - "topLevelNode", - "blend:over:blendKind:", - "_applyTargetConfiguration:", - "dynamicToolTipRectAtPoint:", - "setLastCheckDate:", - "_configureImage:", - "localizedRecoveryOptions", - "eventType", - "displayIfNeededIgnoringOpacity", - "mipmapCache:didImportMipmapItem:withUID:", - "_parentWindowForSheet", - "_performSanityCheckForMapping:fromSourceModel:toDestinationModel:", - "pictureDirPath", - "setPath:", - "appendJoinClauseToSQL", - "genericColorSpace", - "replaceObjectsAtIndexes:withObjects:", - "writeToURL:withOptions:", - "irisClosed", - "_noteNote4:", - "_failsafeAllocAuxiliaryStorage", - "_preparedPrintPanel", - "inputStreamWithFileAtPath:", - "_numberOfItems", - "prepareComparisonPredicate:", - "_cancelAnyScheduledAutoCollapse", - "_invalidateTitleCellWidth", - "removeObjectForDatabaseKey:", - "nodeListWithNodes:count:", - "allowsEditingTextAttributes", - "changeFontTrait:", - "setLayoutValid:", - NULL, - NULL, - "_shouldHaveResizeCursorAtPoint:", - "_minimumVerticalPopupPadding", - "initMultiStatusRequestWithSession:method:path:", - "nameProperties", - "_ensureLayoutCompleteToEndOfCharacterRange:", - "initAddressWithString:", - "_setRangeContainerClassDescription:", - "_changeShadowOpacity:", - "_inTSMPreProcess", - "canPopulateWithPlaceholders", - "screenFont", - "didTurnIntoFault", - NULL, - "validateAndCommitValueInEditor:editingIsEnding:errorUserInterfaceHandled:", - "_overflowHeaderCellPrototype", - "_isSelected", - "firstWeekday", - "dataFromPropertyList:format:errorDescription:", - NULL, - "_generateCompositedBackground", - "_forceDisplayToBeCorrectForViewsWithUnlaidGlyphs", - "doPerform", - NULL, - "ISOLanguageCodes", - "column", - NULL, - "_windowDidBecomeVisible:", - "modificationTime", - "inverseForRelationshipKey:", - "_isaForAutonotifying", - "imageTitle", - NULL, - "_resolveNamespaceForPrefix:", - "_classDescriptionsFromPropertyListDeclarations:suiteName:", - "operationWillAbort", - NULL, - "_applicableLabelIsEnabledAtIndex:forDisplayMode:isInPalette:", - NULL, - "unlockObjectStore", - "stroke", - "encodeReturnValue:", - "recordsMatchingSearchElement:takeLock:", - "_initWithBitmapImageRep:", - "_newParagraphForElement:tag:allowEmpty:suppressTrailingSpace:", - "getCString:", - "CGLContextObj", - "messagingAddresses", - "zoomOutX", - NULL, - "_modalSession:sendEvent:", - "createNewDatabaseImplForInstance:withUniqueId:addressBook:", - "_setBool:ifNoAttributeForKey:", - "_dismissMenuBecauseWindowBecameMain:", - "_scrollViewForColumnsDidTrackHorizontalScroller:", - "creationDateYearless", - "translateOriginToPoint:", - "isReady", - "_analogClockTrackMouse:inRect:ofView:untilMouseUp:", - "previewView:didShowPreviewForURL:", - "_loadXSLT", - "memberOfAppleUseCoreUI:", - "openInSeparateWindow:model:mainWindow:", - "printOperationWithView:printInfo:", - "_addEntityMapping:", - "imageWithBaseName:state:backgroundStyle:effects:", - "synchronizeBackBuffer", - "dayOfMonth", - "readLength", - "decimalNumberBySubtracting:withBehavior:", - "trustPopupSelected:", - NULL, - "doRemoveRecordsAndCreateLogsWithAddressBook:", - "loadMetadata:", - "resetOrderingWithCount:", - "setProxyAuthFromKeychainForRequest:proxyConfig:", - "_loadDataIfNotYetLoaded", - "addPlayButton", - "hyphenationFactorForGlyphAtIndex:", - "draggedImage", - "_servicesMenuIsVisible", - "launchABDForSyncing", - "objectsForKeys:notFoundMarker:", - "loadKnobImage", - "joinWithSourceAttributeName:destinationAttributeName:", - "_buttonBezelColors", - "initWithLocaleIdentifier:", - "updateNextPreviousState", - "setFilter:", - "_setEDotMacEmailSigningUsage:", - "loadPlugInsInLibrary:withExtensions:", - "hasCompatibility:", - "setCanBeVisibleOnAllSpaces:", - "textShadowForButtonState:", - "termPointersForResolutionData:", - "objectClass", - NULL, - "glyphGeneratorForEncoding:language:font:makeSharable:", - "_endEditingIfFirstResponderIsASubview", - "initWithRange:", - "decodeReleasedProxies:", - "_parentWindow", - "noteDirectoryResultsChanged", - "_dockItem", - "_deallocData", - "printOperationDidRun:success:contextInfo:", - "modelLayer", - "_argumentDescriptionsFromUnnamedImplDeclaration:presoDeclaration:namedImplDeclarations:presoDeclarations:suiteName:commandName:", - "viewTitle", - "_setScrollerNeedsDisplay:", - NULL, - "nestingLevel", - "setNeedsDisplayInRect:", - NULL, - "areAllContextsOutputTraced", - "_handleSelectionConfirmed", - "_filterNodeList:ofParentNode:", - "writeFilterXML:toURL:", - "byteSize", - "iconForSize:", - "removeExpandedNode:", - ".cxx_construct", - "_surfaceWillGoAway", - "tableView:objectValueForTableColumn:row:", - "willPushRenderState:", - "_display", - "type", - "_drawHeaderCell:withFrame:withStateFromColumn:", - "isPortableUser", - "setFontMenu:", - "outlineview", - "setSearchButtonCell:", - "prepareForDragOperation:", - "_basicAttributesRequestPostHandler:", - "_createAndShowProgressPanelIfAppropriate:", - "_columnWidthAutoSaveNameWithPrefix", - "_configureFormatEditor", - "_nextUnusedItems:andValues:forRow:forRowType:", - "_updateMatrix", - "setOutline:", - "_editableStateWithMode:", - "_sharedDocumentControllerNoCreate", - "saveAllDocuments:", - "setAlternateTitle:", - NULL, - "receiveStringWithTimeOut:", - "cleanAperture", - "addListenerIfAbsent:", - "convertPoint:toLayer:", - NULL, - NULL, - NULL, - "angledROI:forRect:userInfo:", - "_canChangeVisibilityTo:", - "_value", - "returnResult:exception:sequence:imports:", - "initAndTestWithTests:", - "indexOfLastImportGroup", - "imageRepClassForPasteboardType:", - NULL, - "_localizedPropertyNameForProperty:entity:", - "getAXUIElementRef", - "mouseTracker:didStopTrackingWithEvent:", - "initWithCFNetService:", - "managedObjectIDForURIRepresentation:", - "abViewDoubleClicked:", - "refrROI:forRect:", - "_prepareFindIndicatorForRange:", - "indexOfTabViewItemWithIdentifier:", - "_loadSuitesForAlreadyLoadedBundles", - "new", - "shouldShowPreviewColumn:", - "_isDeviceColorSpace", - "_disablePosting", - "keyEnumerator", - "_setupSearchParts", - "enableFlushWindow", - "similar:originalPassword:", - "_setRFC822Name:", - "setCurrentAppleEventAndReplyEventWithSuspensionID:", - "_predicateIsNoneAreTrue:", - "mapROI:forRect:userInfo:", - "_nextResponderForEvent:", - "recipeDiffers:from:", - "setContentAspectRatio:", - "accessibilityIsSplittersAttributeSettable", - "_coreProperties", - "EPSRepresentation", - "_pauseLayerTreeRenderingForUserSwitchOut:", - "_finishWritingWithOverwriteRetryingInfo:afterSuccess:", - "setColumnResizingType:", - "initWithBitmapData:bytesPerRow:size:format:colorSpace:", - "inputBias", - "decodePropertyList", - "_updateFocusRing", - NULL, - "updateFreeFormLayout", - "actionForControlCharacterAtIndex:", - NULL, - "updateDateRelatedSmartGroups", - "lightweightHandleChildChanged:parent:property:", - "_parseFile", - "_hiliteWindow:fromWindow:", - "_focusFromView:withContext:", - NULL, - "uri", - "toggleAutomaticQuoteSubstitution:", - "lastComponentOfFileName", - "builtInLabelsForProperty:", - "_chooseIssuer", - "apply:to:options:", - "_setPassword:", - "defaultParagraphStyle", - "_setSuppressingChangeNotifications:", - "setAllowSubrowSelection:", - "_toolbarIsInTransition", - "trust", - "setContentMaxSize:", - "highlightColorWithFrame:inView:", - "needLoading", - "sendPort", - "updateChomaticityXAndY", - "representativeIcon", - "initWithFileProperty:dataSource:ascending:", - "_drawRepresentation:inRect:withScaling:", - "selectedMenuItemTextColor", - "setLeaf:", - "_originPointInRuler", - "attributesFromComposition:", - "newGroup", - NULL, - "showFeaturesPanel:", - "sharedImageEditPanel", - "resetProfilingData", - "_buildAndAssignNewContentDictionary", - "setActivated:sender:", - "_recursiveLostHiddenAncestor", - "ignorableStatusCode:", - "suiteDescriptions", - "createCopy:filterArray:", - "trackMouse:", - "originalDontResolveDataRefsFlag", - "bestMipmapIndexToValidateForSize:", - "didChange", - "_commonInitWithColorArray:colorSpace:padStart:padEnd:", - "hasCredentials", - "_showOpenHandCursor:", - "accessibilityEnabledAttribute", - "_knobFrame", - "createMDQueryNodeRefIfNecessary", - "writeFont:", - "pixelFormatCMYKf", - "_bodyStreamRead:bufferLength:error:atEOF:", - "saveDocumentToPath:", - "_selectIssuerBasedOnPublicKeyHash", - "setObjectValuePreservingEntitiesForNode:string:", - "setVerticallyResizable:", - "updateProgressBar:", - "_shouldShowDocumentIcon", - "_web_errorWithDomain:code:URL:", - "propertiesWithStatusCode:", - "minusSet:", - "CGRect", - "reloadGroupsMaintainingSelection:", - "bindThumbnail:toLocation:", - "setAttributeValue:", - "deleteMeansRemoveSubscription:", - "_concealBinding:", - "PMPrintSession", - "_toolbarContentsChanged:", - "layerDidBecomeVisible:", - "sourceNode", - "copySerializationInto:", - "cancelTracking", - "dataWithBytesNoCopy:length:freeWhenDone:", - "expectSeparatorEqualTo:", - "accessibilityIsChildFocusable:", - "truncatesLastVisibleLine", - "currentThread", - "enclosingClipView", - "lineBreakBeforeIndex:withinRange:", - "initWithDelegate:", - "triggerSearchAndSelectBestMatch:", - "_setURL:forPersistentStore:withCoordinator:", - "editedColumn", - NULL, - "_deletePBUffer", - "isGrabbing", - "clearAnnotation", - "_dataCellForTableColumn:row:", - "tokenField:tooltipStringForRepresentedObject:", - "reviewUnsavedDocumentsWithAlertTitle:cancellable:delegate:didReviewAllSelector:contextInfo:", - "mergeROI:destRect:", - "timeMachineDelegate", - "setUsesWeakReadAndWriteBarriers:", - "inSafeMode", - "itemAdded:", - "setVerticalAlignment:", - "application:willPresentError:", - "_setWindowWantsSquareToolbarSelectionHighlight:", - "migrationDebugLevel", - "_web_stringForKey:", - "_highlightColor", - "setCacheFragHandler:", - "completionWindow", - "setLocalURL:", - "initWithPrintInfo:", - "_rangeByEstimatingAttributeFixingForRange:", - "initWithPerson:propertyPath:oldValue:inputController:", - "_updateText:", - "_removeObjects:objectHandler:", - "setImageScaling:forSegment:", - "_locality", - NULL, - "_mergeLayoutHoles", - "typeOfProperty:forRecord:", - "setMemoryCapacity:", - "importVCards", - "initWithTarget:invocation:", - "_enumeratedEnabledBindings:", - "_activateTimeLineFromLegend:", - NULL, - "allocateNewCell", - "_observeIconOfChild:", - "initWithSuiteName:commandName:dictionary:", - "groupsController:outlineView:willDisplayCell:forTableColumn:item:", - "zoomOut:", - "nts_ImportAddressBookFromMetaKitIfNeeded", - "_setState:ofCell:", - "setCachedSQLiteStatement:", - "pickerView", - "removeAllResources", - "_AppleUseCoreUI", - "ISS_stringByXMLQuoting", - "_copyDetailsFromBinder:", - "_commonInitFrame:styleMask:backing:defer:", - "accessibilityPopUpMenuParent:", - "_setDirectoryPath:", - NULL, - "setSourcePosition:", - NULL, - NULL, - "flushClassKeyBindings", - "_createWindowOpaqueShape", - "findParentOfWindowGRL:", - "ownerCard", - "operationNotAllowedCursor", - "customOutputPorts", - "setEntities:", - "itemAtRow:", - "areEventsTraced", - "initialLoadItemAtIndex:", - "canApplyValueTransformer:toBinding:", - NULL, - "_eventWithEventRefInternal:", - "countOfVisibleCellsOnEachSide", - "forceClipViewUpdate", - "insertText:replacementRange:validFlags:", - "appendLimitClauseToSQL:", - "activeColumnIdentifier", - "measurements:fromResolutionData:", - "initGetPropsWithSession:URI:properties:", - "CIColorWithColorSpace:", - "_dragShouldBeginFromMouseDown:", - "_doSetParentWindow:", - "pictureTakerSessionDidEndWithCode:", - "doSpecialSelectionStuffForRow:extendingSelection:", - "insertObject:atArrangedObjectIndexPath:", - "backupDirectory", - "setCenterControls:", - NULL, - "_theMap", - "getLineFragmentRect:usedRect:forParagraphSeparatorGlyphRange:atProposedOrigin:", - "_doCallback", - "drawGizmo", - NULL, - "_highlightedLayer", - "allowsDuplicatesInToolbar", - "_nonAutomaticObservingKeys", - "gradientBorderWidth", - "initWithEvent:replyEvent:", - "initHeadWithSession:URI:", - "_allocImageForRepresentationInstance:forCell:", - "_requiredCarbonCatalogInfoMask", - "_web_carbonPathForPath_nowarn:", - "_canMoveItemAsSource:", - "openPersonInSeparateWindow:", - "initWithParent:child:", - "tokenFieldCell:styleForRepresentedObject:", - "maxAnimationFrameRate", - "_createUserKeyPair:privKey:keychain:algorithm:size:userName:accessRef:inputParms:", - "altModifySelection:", - "drawParts", - "enclosingMenuItem", - "_buttonImageSource", - "__createProxyPortWithNode:portKey:forKey:withUserInfo:", - "loadedCellAtRow:column:", - "initWithUID:", - "_addHeaders:toRequest:", - "directoryAtIndex:", - "hasSelectedColor", - "releaseAllResources", - "_setOriginalSnapshot:", - "finalizeOperation", - "transformation", - "capsuleRectForDirection", - "mainDocumentURL", - "addEntries:fromSession:", - "canBeVisibleOnAllSpaces", - "representedFilename", - "bottomMargin", - "_scriptingCanInsertBeforeOrReplaceObjectsAtIndexes:inValueForKey:", - "updateCellSize", - "initWithParent:index:", - "partWithCode:parent:", - "willPerformMigrationWithManager:", - "_bottomContentBox", - "nextObject", - "mutableChildNodes", - "loadPlugIn", - "conformsTo:", - "_unhideHODWindow", - "_indexInAppliedGridForPoint:", - "_setShowControls:", - "_connectGraphUnitsForVideoOutputConnection:error:", - "_cfPad:length:padIndex:", - "format", - "_setSheet:", - "setIsResizable:", - "_createCachedImage:", - "setAccessoryView:", - "_processLibXML2ElementNode:tag:", - "__clearPreLiveColumnWidths", - "setReadOnly", - "maximumLength", - "drawWithRect:options:attributes:", - "selectedPagesContainsPage:", - "accessoryViewContainerContentFrameDidChange:", - "_scriptStringWithPropertyAccess:", - "_isContainedInMenu", - "_setTextFieldStringValue:", - "_textListsForListNumber:level:", - "hideItem:", - "_setHighlighted:pieces:forItemAtIndex:displayNow:", - "revealWithFinder:", - "setShowControls:", - "_deltaForResizingTextField:", - NULL, - "_shouldShowParentNode:", - "loadCGImageNamed:fromBundle:into:", - "_coveredCharSet", - "portNumber", - "_heartBeatBufferWindow", - "glyphRangeForCharacterRange:actualCharacterRange:", - "_setEndSubelementFromDescriptor:", - "marker", - NULL, - "startEditingWithEvent:text:", - "findString:selectedRange:options:", - "toolTip", - "indexOfAllGroup", - "_listClass", - "specifiedRect", - "fetchTableNames", - "commitComposition", - "computeGroupIndexTransformations", - "nameForIndex:", - "replaceTextContainer:", - "cellSelectionStateWillChange", - "_drawInsertionPointInRect:color:", - "postNotificationName:object:", - "relativeString", - "_objectIndexForSubelementIdentifier:subelementIndex:fromIndexes:", - "_makePreviousCellKey", - NULL, - "_drawLiveResizeHighlightWithFrame:inView:", - NULL, - "_createImage:::", - "preloadMipmapsWithQuality:", - NULL, - "moveLeftAndModifySelection:", - "_adjustNeedsDisplayRegionForNewFrame:", - "hotspotCount", - "allFrameworks", - "outlineView:shouldTrackCell:forTableColumn:item:", - NULL, - "adjustDocumentSize", - "small:", - "chatWithPerson:", - "draggingEnded:", - "loadDictionaries:", - "numberOfVisibleRows", - "_undoRedoAttributedSubstringFromRange:", - NULL, - "_computeHeaders", - "focusedImageIndex", - "simpleACLBodyForReadPrincipals:writePrincipals:", - "nameFromPath:extra:", - "toolbar:newItemForItemIdentifier:", - "valueForProperty:atRow:tableName:recordUniqueId:", - "initWithX:", - "abStandardizedPhoneNumber", - "blur:pass:", - "_selectFirstSubfield", - NULL, - "_accessibilityShowMenu:withProxy:", - "_taskRedisplay", - "unbindTextureFromContext:textureUnit:savedState:", - "_doOrderWindow:relativeTo:findKey:forCounter:force:isModal:", - "nearestPageToPoint:", - "_searchInGoogle:", - "getNodeAsInfoNode:", - "_setCurrentBrowsingNodePath:makeHistory:notify:", - "_maxXTitlebarDecorationMinWidth", - "optionsAttributes", - "moveFirst:", - "_lockQuickDrawPort", - "stopAnimation:", - "initWithQuickTimeMovie:disposeWhenDone:error:", - "readPrintInfo", - NULL, - "tokenField:displayStringForRepresentedObject:", - "setAnimationBlockingMode:", - "iconView:typeSelectStringForIndex:", - "drawInsertionPointInRect:color:turnedOn:", - "_setAlternateImage:", - "_selectPreviousSubfield", - "enumeratorWithMapTable:", - NULL, - "fileExistsAtURL:", - "setRaisesForNotApplicableKeys:", - "cssValueType", - "_animatedScrollingPreferencesChanged:", - "accessibilityHelperForToolbarItemViewer:", - "initWithElement:withParent:", - "bottomBorderColor", - "moveIndex:toIndex:", - "_startingWindowForSendAction:", - "setLong:forKey:", - "initializeDataFileInfo:", - "replaceSublayer:with:", - "drawRoundedRect:radius:lineWidth:cacheIt:", - "_hiddenViewsTint", - "mapMember:originalKey:value:", - "attribute:atIndex:effectiveRange:", - "accessibilityZoomButtonAttribute", - "vendor2", - "_openURLs:withAppPath:options:additionalEventParamDescriptor:launchIdentifiers:", - "methodReturnType", - "_parsePantoneLikeList:fileName:", - "_spanClassForAttributes:inParagraphClass:spanClass:", - "render:toBitmap:rowBytes:bounds:format:colorSpace:", - "_accessibilityWindowPointForShowMenuWithProxy:", - "_htmlFromTidyNode:tidyDoc:appendingToString:", - "prepareInsertStatementWithCorrelation:", - "_compareMultiNoLabelArrayWithRecordValue:", - "imageWithPNGFile:", - "_writeSelectionToPasteboard:fromPoint:", - "_zoomToFitRect:", - "_extraWidthForCellHeight:", - "isGrammarCheckingEnabled", - "accessibilityIsSelectedColumnsAttributeSettable", - "valueForKeyPath:", - "_setNeedsDisplayInPrimarySortColumnsIfNecessary", - "doDrawInContext:", - "_noVerticalAutosizing", - "_markViewedForPeople:", - "willChangeValueForKey:withSetMutation:usingObjects:", - "_fileURLValue", - "goToLastPage:", - "setPredicateOperator:", - "setCopyright:", - "newChildWithKey:", - "viewWillBecomeInActive", - "selectedMediaObjects", - "registeredDraggedTypes", - "cacheForSize:", - "invert", - "initWithInt64:sqlType:", - "setupTooltipViewForPoint:tooltipBounds:", - "_scriptingNullDescriptor", - "_setRefreshesAllModelKeys:", - "nextKey", - "_setDeclaredKeys:", - "glImageInfoInContext:owner:createIfNeeded:", - "filterEvents:", - "resetDirectoryResultsSubrows", - "_doAttachDrawer", - "configureForTreatsDirectoryAliasesAsDirectories:", - "initWithTexture:size:options:", - "normalizedRect:", - "_changeIconViewIconSize:", - "_scriptingValueForKey:", - "_getFSRefForServiceName:", - NULL, - "setTarget:", - "inlinePreview:frameForURL:", - "isCompatibleWithSource:sourceMD5:", - "_setDrawerEdge:", - "moveToEndOfLine:", - "initializeWidgetStructureAtX:y:forResolutionData:", - "updateFilterInfo", - "minFrameSizeForMinContentSize:styleMask:", - "_graphiteAlternatingRowColor", - "colorForControlTint:", - "doEditOperation:", - "addPopupView:", - "calculateFigure:center:", - "showcaseMenuItem:itemIndex:", - "performMiniaturize:", - "_highlightLine:withColor:", - "_resizeSegmentsForCellFrame:", - "lineSpacing", - "_initWithGraphicsPort:flipped:", - "_pasteboardDictionaryForPeople:", - "shouldShopShowcaseForTransitionToGRL:", - "lastComponent:", - "_initSaveMode", - "_buildAndRunGraph", - "textView:completions:forPartialWordRange:indexOfSelectedItem:", - "XMLData", - "_normalizedMouseLocationWithOptionalEvent:", - "associatePopup:withProperty:", - "convolutionInitROI:destRect:userInfo:", - "_cancelCurrentToolTipWindowImmediately:", - "_web_scriptIfJavaScriptURL", - NULL, - "_rotationForGlyphAtIndex:effectiveRange:", - "drawBack:", - "setTearOffMenuRepresentation:", - "sharedFontPanel", - "_setAttributesNoCopy:pageFormat:orFlattenedData:printSettings:orFlattenedData:", - "imageFlow:itemAtIndex:", - "detailsDisplayed", - "_runBlocking", - "revert:", - "baselineOffsetInLayoutManager:glyphIndex:", - "visibleStringRange", - "titlebarRectForBounds:", - NULL, - NULL, - "editingWasAborted:", - "initWithURL:error:", - "valueInParagraphsAtIndex:", - "setPendingAttributes:", - "errorInSetImageFromPath", - "_updateContainerReferenceCounterForItems:direction:", - "_errorDuplicateColor:", - NULL, - "initWithData:options:", - "setRuleThickness:", - "LDAPConfigChanged:", - "storeText:", - "expandFilter:", - "setSubentityID:", - "_clearFocusForView", - "updateFromPath:", - "_insertObject:atArrangedObjectIndex:objectHandler:", - "holeWithStart:len:", - "beginPictureTakerWithDelegate:didEndSelector:contextInfo:", - "_createSelectedRowEntriesArrayIncludingExpandable:includingUnexpandable:withCurrentExpandState:", - "widthForSegment:", - "tokenField:menuForRepresentedObject:", - "flatness", - "capitalizedLetterCharacterSet", - "removeItemViewerAtIndex:", - "rowSpan", - "leaveSlideshowFullScreenWithStartRect", - "addBinding:toController:withKeyPath:valueTransformer:options:", - "sqlTypeForExpressionConstantValue:", - "setFramesProvider:", - "_stopRearrangementObservingForSuppressedContentObjects", - NULL, - "instancesRespondTo:", - "elementWithName:stringValue:", - "selectionForWordAtPoint:", - "browser", - "_setDefaultTextAttributes", - "_determineDropIndexForDragInfo:", - "commandDescription", - "ctFontRef", - "pixelFormatRGBAh", - "_crosshairCursor", - "stopAutoscroll", - "setInertia:", - "_disposeObjects:count:notifyParent:", - "_isDocModal", - "isBezeled", - "_initWithCFURLRequest:", - "_findFirstValidKeyViewStartingFrom:inTabViewItem:", - "_typeString", - "_setFlags:", - "knownKeyValuesForObjectID:withContext:", - "readableTypes", - "initWithContentRect:styleMask:backing:defer:slideshowPanel:", - "authenticateName:withPassword:authOnly:", - "attributedStringValue", - "attributeName", - "newObjectIDForEntity:pk:", - "createImageDataForManager:withOptions:", - "_proxyNonGCFinalize", - "_drawTabViewItem:inRect:", - "subrows", - "initWithRegistryString:andObjectClass:", - "drawInView:", - "openRoot:", - "setAnnotationNeedsDisplay:padding:", - "isMPEG", - NULL, - "animationShouldStart:", - "_totalHeightOfTableView", - "_computeColorScaleIfNecessaryWithSize:", - "_processPendingUpdates:", - "applyToRequest:", - "_refreshOutputFileURL", - "replaceSubviewWith:", - "initWithFBENode:", - "dropOverCell", - "appendObjectClassDeclarationToAETEData:", - "_minWidth", - "_shouldHideSubtractButtonForSlice:", - NULL, - "saveCofigurationUsingName:", - "_buttonCellInitWithCoder:", - "_NSNibHelpStringForUIItem:binding:", - "executeRefreshRequest:withContext:", - "controlCharacterSet", - "_buildSlideShowIndexesArray", - "initWithResumeInformation:", - "_isLastMultiValue:", - "hidePalettes:", - "_wantsUserCancelledOperation", - "registerObject:withServicePath:", - "updateHelpResults:", - "_processNotifications:", - "_fileAttributesToWriteToURL:ofType:forSaveOperation:originalContentsURL:error:", - "timeForKeyFrame:controlType:", - "setResourceLocator:", - "_unaffixedMarkerForItemNumber:", - "zoomActualSize:", - "_changeMediaBrowserTypeTo:", - "lengthOfBytesUsingEncoding:", - "_updateTrackingLocation:", - "_childrenForNode:", - "_validateCachedVirtualScreen", - "_moveToNextBlock", - "_registerUndoForDeletedObjects:withDeletedChanges:", - "_neighbourhoodIndexesWithCacheSize:cellSize:", - "nts_Connect", - "sharedKeychainSavePanel", - NULL, - "drawHoverTarget", - "_setRemovalNeeded:", - "_viewDetaching:", - "setDefaultLineWidth:", - NULL, - "readToEndOfFileInBackgroundAndNotifyForModes:", - "internalSetScaleFactor:", - "buttonHeight", - "_setupIPAddresses:numIPAddresses:inCEGeneralNames:", - "nts_ClearTemporaryCache", - "setTimeZoneName:", - "backgroundColor", - "_replyToOpen:", - "_scriptingValueForSpecifier:", - "findNextOccuranceOfAttributeNamed:startingRange:", - "_usesATSTypesetter", - "_setIsEnabled:", - "addIndexLabel", - "setStatusMenu:", - "deadKeyState", - "wantsToDrawIconInDisplayMode:", - "authenticationList", - "HTMLFileWrapper", - "convertFont:toFace:", - "initWithObject:", - "canonicalLanguageIdentifierFromString:", - "addMaxLenToDictionaryRef:", - "observationCount", - "replaceCharactersInRange:withRTFD:", - "quality", - "_drawSourceListHighlightInRect:", - "_forgetObject:propagateToObjectStore:removeFromRegistry:", - "setSpellingState:range:", - "_synchronizeWindowTitles", - "setupTooltipView", - "_tryFileLock", - "resourceData", - NULL, - "accessibilityCharacterRangeForPosition:", - NULL, - "_drawThemeBezelBorder:inRect:", - "rectForBorderWidth", - "instancesRespondToSelector:", - "_setDrawingBackground:", - "actionHasEnded:sender:", - "addressBookDataFile", - "registerSnapshots:", - "keyEquivalent", - "_clockAndCalendarTakeDisplayedMonthFromTodaysDate", - "classDescription", - "exportedText:forFile:", - "sharedDragManager", - "_shiftRight:", - NULL, - "didPopRenderState:", - "_configureHistoryControl", - "_inBackgroundLayout", - "propertyTypesForRecordOfClass:", - "lockBeforeDate:", - "configurationPaletteIsRunning", - "portForPoint:inNode:bounds:", - NULL, - "_doImageDragUsingRows:event:pasteboard:source:slideBack:", - "rangesForUserTextChange", - "accessibilityFilenameAttribute", - "_beforeDrawRow:clipRect:", - "_displayLDAPServerSheetOrPanel", - "_initWithGraphicsPort:flipped:carbonOffscreen:", - "_contentRectIncludingToolbarAtHome", - "handlePathname:", - NULL, - "addLineEndingStylesToDictionaryRef:", - "subrowGroup", - "_setPlaceHolder", - "_configureSynchronousMode", - "cellAtRow:column:loaded:", - "attributeDescription", - "makeThumbnailTopPriority:", - NULL, - "_setUsesFastJavaBundleSetup:", - "_allowAnimated_setHidden:", - "keyForParameter:", - "volume", - "_setRowTypeToAddFromPlusButton:", - "_errorWithErrno:atPath:", - "setNoImage:", - "selectItemAtIndex:", - "_parseFonts", - "getLocalizedFormattedDisplayLabels:andLocalizedFormattedDisplayValues:", - "nullNode", - "_depopulateOpenRecentMenu:", - "entityDescription", - "fontWithDescriptor:textTransform:", - "internalForDomains:Categories:Objects:Manager:", - "setMovieControllerView:", - "addSuiteNamed:", - "synchronizeTableViewSelectionWithStringValue:", - "_doPrintFiles:withSettings:showPrintPanels:", - "defaultColorSpace", - "_cachedDisplayValue", - "setNeedsDisplayForNode:", - "_vCard30RepresentationOfRecords:", - "terminateResolutionData", - "setBackgroundLayoutEnabled:", - "preservesContentDuringLiveResize", - "portsForMode:", - NULL, - "_itemCanBeDraggedInTemporaryEditingModeFromPoint:", - "setCountryName:", - "stateKeysForIdentifier:", - "sharedFilterPanel", - "mainScreen", - "addChildWindow:ordered:", - "cellAtIndex:", - "refreshObjects:", - "setForeignKeySlot:int64:", - "usesLocalContextForIdentifier:", - "initWithProperties:quartzFilter:", - "initWithAttributeName:", - "helpAnchor", - "_sortDescriptors", - "_drawSelectionRingWithColor:width:forNode:bounds:", - "setupDrawingState:page:", - NULL, - "fire", - "orderFront:", - "_removeWindowFromCache:", - "_hasTitle", - "addPort:forMode:", - "_shieldingWindowLevel", - "objectForServicePath:app:doLaunch:limitDate:", - "_pwaDidUpdateNewPasswordField:", - "_scriptingIntegerWithDescriptor:", - "isPreview", - "_dealloc", - "setParamDescriptor:forKeyword:", - "_viewFromCompoundTypes:", - "redComponent", - "abDecodedUTF7", - "_writeDataForkData:resourceForkData:", - "addPropertiesAndTypes:forClass:withAddressBook:acquireLock:save:", - "_setKeyCellNeedsDisplay", - "initAddressWithData:", - "parseAlternativeName:", - NULL, - "convertSize:fromView:", - "_selectionStateChanged:", - "checkSpellingOfString:startingAt:language:wrap:inSpellDocumentWithTag:wordCount:", - NULL, - "_userCanEditTableColumn:row:", - "pushDelayedPerformWithTarget:selector:object:soon:", - NULL, - "_prepareToRunForSavePanel:withFilepath:", - "_enableChangeNotifications", - "_loadSearchKinds", - "CGBitsPerComponent", - "_createStatusItemControlInWindow:", - "setSearchState:", - "region", - "clickedOnLink:atIndex:", - "_setPasswordStrengthTitleString:", - "_web_backgroundRemoveLeftoverFiles:", - "stopGrabbing", - "accessibilitySubroleAttribute", - "makeSelectedPrimary:", - "moveToX:andY:", - "widgetInView:withButtonID:action:", - "_postRuleOptionChangedNotification", - "floatValue", - "_updateQueryString:", - "_removeTargetAnimation:start:", - "getAppleUseCoreUI", - "propertyTypesWithAddressBook:", - "deserializeNewString", - "_nodeResignsFirstResponder:", - "_scriptingCanSetValue:forSpecifier:", - "setAllowAliasing:", - "superviewFrameChanged:", - "_doLookupAnchor:inBooks:", - "_web_splitAtNonDateCommas_nowarn", - "selectedItemIdentifier", - NULL, - "speechRecognizer:didRecognizeCommand:", - "greySliderFrameChangedNotification:", - "addChildren:", - "conditionallySetsHidden", - "_parseKey:value:errorDescription:", - "setBeginTime:", - "removeImmediately:", - "isDeadKeyProcessingEnabled", - "_chooseSizeFromSlider:", - "setNextActions:forDocument:", - "fractionOfDistanceThroughGlyphForPoint:", - "_setCertificates:", - "whiteComponent", - "nts_AddRecordsOfClass:fromDictionaryRepresentations:recordsByUniqueId:", - "accessibilityTextLinks", - "_widthForStringRange:", - "sharedIndex", - "searchFrameInScreenCoordinates", - NULL, - "runModalForDirectory:file:types:relativeToWindow:", - "initWithProperty:label:key:value:searchPeople:searchSubscribed:comparison:", - "_editQueryButtonClick:", - "startGrabbingForReceiver:", - "_generateFindIndicator", - "_objectValue:forString:errorDescription:", - "attributeMappings", - "setMipmapSizes:", - "_setZoomValue:", - "setOnOpenGLContext:unit:fromBounds:withTarget:mipmappingLevels:matrix:", - "selectedIndexes", - "download:didReceiveDataOfLength:", - "accessibilityIsSharedCharacterRangeAttributeSettable", - "buttonImageNamePrefixForButtonState:", - "updateQueue:", - "_handleRecognitionDoneWithRecognitionResult:", - "glyphInfoWithCharacterIdentifier:collection:baseString:", - "performRenderTimeLayoutModifiers:", - "rollbackChanges", - NULL, - "readOnly", - "_setCanUseReorderResizeImageCache:", - "setShownAboveComboBox:", - "_preferAlternateContent", - "nts_hasUnsavedChanges", - "_doInsertMember:inMemberList:", - NULL, - "visualMovieBoxIsOpaque", - "dispose", - "statistics", - "positionsForCompositeSequence:numberOfGlyphs:pointArray:", - "fileHandleForWriting", - "_endTableRow", - "_innerTrackRect", - "smemapROI:forRect:", - "close", - "addTypesToArray:ofType:useExtension:useNewFileImporters:useAggressive:", - "_readSelectionFromState:toPoint:", - "_startInsertionOptimizationWithDragSource:", - "setOriginalDontInteractFlag:", - "forcePromise:", - "_setShadowStyle:", - "minusSign", - "libxml2Content", - "_realDoModalLoopForCarbonWindow:peek:", - "itemsCount", - "_controlInterspace", - "entryForProperty:withComparison:", - "dragImageForIndexes:withEvent:offset:", - "_setupIndexSheet", - "_setEnabledAttributesOnCell:", - "_dontSaveButtonTitle", - "recordClassFromUniqueId:", - "heightFieldFrom:radius:initial:constraint:", - "_layoutUpdated:", - "image:withOpacity:", - "_setKeyViewLoopNeedsRecalc:", - "_swapContextForCarbonDrawing:", - "mailRecentsCoreDataDatabaseFile", - "initForManagedObjectContext:", - "accessibilityBoundsForCharacterRange:", - "_unsetFlags:", - "_firstMatchingProperty:", - "_characterCannotBeRendered:", - "setNSImage:", - "addConnection:toRunLoop:forMode:", - "autoscrollWithLocalPoint:andSensitiveMargin:", - NULL, - "keepReorderingItems", - "_placeHelpWindowNear:", - "boundsDidDidChange:", - NULL, - "_embossedActiveForegroundTextColor", - "_ADKeySet", - "setAttributedStringForNotANumber:", - "_pullsDown", - "IKIPMakeDirectoriesInPath:mode:", - "_testPredicatesMatchRecordInStore", - "searchPeople", - "takePicture", - "subgroups", - NULL, - "_validateValue:forKeyPath:ofObjectAtIndex:error:", - NULL, - "setAutoresizesSubviews:", - "valueInCharactersAtIndex:", - "maximumCacheSize", - "_autoCreateBinderForObject:withController:", - "_objectMatchesFetchPredicate:", - "initLockWithSession:path:", - "_keyForLocalizedKey:", - "windowShouldClose:", - "initTextCell:", - "abortOperation", - "_switchTabViewItem:oldView:withTabViewItem:newView:initialFirstResponder:lastKeyView:", - "_adjustWindowToScreen", - "row", - NULL, - "isProxy", - "containsAmbiguousPaths:inCategory:replacingNode:subtreeWith:", - "_enteredFullscreen", - "_inputWhiteParams", - "splitCells", - "_animationIdler:", - "accessibilityOrientationAttribute", - "_sendFileSystemChangedNotificationForSavePanelInfo:", - "toggleIsExpanded:", - "setSmartInsertDeleteEnabled:", - "_dateByTranslatingLongDateTimeDescriptor:toType:inSuite:", - "fontDescriptorWithFamily:", - "setRowsPerScreen:", - "serverName", - "initWithAffectedRange:layoutManager:undoManager:", - "_avgForKeyPath:", - "_finalize_QCCache", - "dealloc", - "CI_arrayWithAffineTransform:", - "setUsesSignificantDigits:", - "CA_attributes", - "editingStringForObjectValue:", - "getAppearancesFromDictionary:ofType:", - "thousandSeparator", - "_decreaseContainerReferenceCounter", - "spoolPath", - "imageWithRenderer:userData:renderSize:renderContext:options:", - "_specialPurposeType", - "autoupdatingCurrentCalendar", - "setHasHorizontalScroller:", - "_createSliceDropSeparator", - "_showCertButton", - "collapseItem:collapseChildren:", - "_setupOpenGLContext", - "_setKeychainName:", - NULL, - "_setZoomFactor:", - "_setQCView:", - "closeWidgetInView:withButtonID:action:", - "defaultNeutralTemperature", - "previousText", - "_handleCoreEvent:withReplyEvent:", - "_boundsForCellFrame:", - "removeOldestIcon", - "_addTypeParentsAndType:toSet:", - "dmCreateWithSession:data:props:URI:", - "_setupKernelStandardMode:", - "setObjectForCurrentRecognition:", - "occurrence", - "treatNilValuesLikeEmptyCollections", - "_getDVVideoInfo:fromFigSampleBuffer:", - "_setNeedsDisplayForDropCandidateRow:operation:mask:", - "filesystemItemMoveOperationWithSourcePath:destinationPath:", - "_changeDrawerFirstResponder", - "parseSingleValue", - "reconcileToSuiteRegistry:suiteName:className:", - "_glyphHoleDescription", - "_noteToolbarSizeModeChanged", - "_referenceArray", - "setPrimitiveSortingFirstName:", - "_previousNextTab:loop:", - NULL, - "_turnOffVerticalScroller", - "reloadContext", - "setItemType:", - "_message:", - "removeItemWithIdentifier:", - "segmentedBufferLength", - "doButtonHit:", - "_setTextColorInObject:mode:compareDirectly:toTextColor:", - "_fixUpDatePickerElementFlags", - "_setUserRFC822Name:", - NULL, - "_smallEncodingGlyphIndexForCharacterIndex:startOfRange:okToFillHoles:considerNulls:", - "setUsesGroupingSeparator:", - NULL, - "openCategoryFile:", - "_scriptingTextWithDescriptor:", - "compact", - "_setFrameAutosaveName:changeFrame:", - "loadDisplayBundle:", - "inputBottomLineParamsAtIndexes:", - "relationshipDescription", - "underline:", - "initWithTextureSize:textHeight:", - "_iChatSigningUsage", - NULL, - "convertRectFromDocumentToView:", - "set:containsEntity:", - "RTF", - "doConvolutionPass:weights:sums:", - "resumeRendering", - "previewHelperClass", - "_storeNewColorInColorWell:", - "_registerNotificationsForWindow:", - "_cellInitWithCoder:", - "CIFormat", - "_refreshesAllModelKeys", - "mutableCopyWithZone:", - "invertedSet", - NULL, - "mouseLocation", - "unbindActions", - "_isEventProcessingDisabled", - "_setColorToChange:", - "returnsObjectsAsFaults", - "setProperty:forKey:inRequest:", - "canonicalString", - NULL, - "setIsPrimary:", - "sharedServiceMaster", - NULL, - "hasApertureModeDimensions", - "_checkCardAndColumns", - "setCopiesOnScroll:", - NULL, - NULL, - NULL, - "lineSpacingAfterGlyphAtIndex:withProposedLineFragmentRect:", - "initJava2", - "_autoscrollDelay", - "tokenField:setUpTokenAttachmentCell:forRepresentedObject:", - NULL, - "_removeToolTip", - "_mergeTableCellsHorizontally", - "setHorizontalPageScroll:", - "_setHelpKey:forObject:", - "_needsDisplayfromColumn:", - "setAutoScales:", - "methodForSelector:", - "applicationDidUpdate:", - NULL, - "setBrightnessOnAllDisplays:", - NULL, - "dateWithTimeIntervalSinceNow:", - "_setImageAndNotifyTarget:", - "coerceColor:toString:", - "_logicalTestFromDescriptor:", - NULL, - "_unregisterForDocViewFrameAndBoundsChangeNotifications", - "buttonImageSourceWithName:", - NULL, - NULL, - "titleForAccessibleChildAtIndex:", - "sharedKeyBindingManager", - "didEndSheet:returnCode:contextInfo:", - "_alignColumnForStretchedWindowWithInfo:", - NULL, - "_setInactiveStateShowsRollovers:", - "_chooseCollection:", - "TIFFRepresentationOfImageRepsInArray:", - "initWithColor:", - "_cleanupHelpForQuit", - "initWithRulerMarker:parent:", - "_scrollingDirectionAndDeltas:", - "forInfoKey:addKey:fromDictionary:toArray:", - "setTrackMouseCoordinates:", - NULL, - "referenceURL", - "startObservingModelObject:", - "_allocExtraData", - "_registerWithDock", - "_frameForButtonOnTheRight:", - "removeValueAtIndex:fromPropertyWithKey:", - "dictionaryRep", - "unregisterWindowNotifications", - "tokenFieldCell:shouldAddObjects:atIndex:", - "notationName", - "_resizeToolbarViewToFit:", - "animationForKey:", - "_doClickAndQueueSendingOfAction:removeAndAddColumnsIfNecessary:", - NULL, - "setMarkedText:selectionRange:replacementRange:validFlags:", - "_minXTitleOffset", - "_manuallyDrawSourceListHighlightInRect:", - "actionForApparentlyAbandonedLock:onAttempt:", - "_downloadFile:toPath:", - "nts_AffectsSmartGroupsIsNew:record:", - "_hitTest:dragTypes:", - "selectAll:", - NULL, - "sortedArrayUsingDescriptors:", - "_clipIndicator", - NULL, - "shownValueInObject:", - "writeToFile:atomically:encoding:error:", - "nts_initWithDatabaseImpl:addressBook:", - "smallestEncoding", - "extent", - "_glyphLocationDescription", - "_setMultiValueIfNeeded:withLabel:inMultiValue:", - "didRefresh:", - "addPauseButton", - "_handleChildrenChanged:", - NULL, - "promotedImage:", - "initWithBadAuthResponse:username:password:", - NULL, - "_setCurrentWidth:", - "fontDescriptorWithFontAttributes:", - "setImplementor:atIndex:", - "_generateSQLType2InContext:", - "imageByCroppingToRect:", - "_title:", - "tooltipText", - "characterEncoding", - "headerCell", - "scheduleCameraPictureNotificationAfterDelay:", - "addItemWithObjectValue:", - "setDataRef:", - "lowercaseWord:", - "_setFileName:", - "openGLPixelFormat", - "clearStartAnimation", - "imageFrame", - "_unbind:existingNibConnectors:connectorsToRemove:connectorsToAdd:", - "_setInputExtent:", - "autoResizeToRect:clipView:", - NULL, - "_createLayerAndInitialize", - "reenableDisplayPosting", - "initWithView:withParent:", - NULL, - "waitUntilDate:", - "symbolicTraits", - NULL, - "setHeaderToolTip:", - "selectionForRange:", - "_allocateExtraFields", - "defaultLanguageContext", - "_updateFrameWidgets", - "isSimpleKeypath:", - "_initTextRenderer", - "_checkSpellingOfString:startingAt:language:wrap:inSpellDocumentWithTag:wordCount:reconnectOnError:", - "stripesAt:width:angle:softness:phase:red1:green1:blue1:alpha1:red2:green2:blue2:alpha2:", - "locationY", - "contentBinder", - "userServer:", - "initWithEntity:foreignKey:", - "imageWithBitmapData:bytesPerRow:size:format:colorSpace:", - "initWithMenu:item:", - "setString:forType:", - "_executeWithMode:andReturnError:", - "startSelectionProcess:", - "_stopAnimationCompletingOperations:", - "implementorAtIndex:", - "insertObject:inNamespacesAtIndex:", - "_rowArrayForBlock:atIndex:text:layoutManager:containerWidth:withRepetitions:collapseBorders:rowCharRange:indexInRow:startingRow:startingColumn:previousRowBlockHelper:", - "localizedStringForProperty:", - "valueForIdentifier:", - "convertToRGBA:", - "elementAtIndex:effectiveRange:", - NULL, - "drawTextContainer:withRect:graphicsContext:baselineMode:scrollable:padding:", - "alternateTitle", - "setupInspectorViewsForNode:", - "setWhitespace:", - "_setVisible:", - "_removeSpellingAttributeForRange:", - "valueForAttribute:", - "_setKeyCellFromTop", - "subscriptions", - "_appendArcSegmentWithCenter:radius:angle1:angle2:", - NULL, - NULL, - "_displaySelectedCard", - NULL, - NULL, - "_clearImageForLockFocusUse", - "setVisibilityPriority:", - "deleteWordForward:", - "colorForTimeLine:", - "_cleanupAndAuthenticate:sequence:conversation:invocation:raise:", - "_setFrameAfterMove:", - "buttonType", - "_parseContentsDictionary", - "serializedValueForKey:", - "drawAnnotationsWithBox:", - "accessibilityIsContentsAttributeSettable", - "_execute:arguments:", - "_removeObserver:notificationNamesAndSelectorNames:object:", - "_appkitViewBackingLayerUniqueMethod", - "_selectOrEdit:inView:target:editor:event:start:end:", - "redoIt", - "cropBounds", - "getFileSystemInfoForPath:isRemovable:isWritable:isUnmountable:description:type:", - "setDataRepresentation:", - "loadPlugInsInFolder:withExtensions:", - "stopPlayer:", - "_autosaveDefaultsKeyForName:", - "initWithCharacterSet:", - "_continueRunWithStartTime:duration:", - "makeUntitledDocumentOfType:error:", - "_calendarRangeOfAllDaysForDisplayedMonth", - "lowercaseString", - "takeValue:forKeyPath:", - "otherMouseDownDelegate:", - NULL, - "deserializeIntAtCursor:", - "__redrawBounds:", - "_cacheObjectValue:", - "handleAnimationProgress", - "setDomainName:", - "doRemoveAnnotaion:", - "shouldManageVisibilityForPreviewView:", - "adjustedRectForBox:", - "_old_encodeWithCoder_NSTableView:", - "getTransform", - "applyObjectValue:forBinding:operation:needToRunAlert:error:", - "doesContain:", - "succeeded", - "boundsForControlAtIndex:", - "beautifyMetaData", - "fromValue", - "_clearUnprocessedDeletions", - "getReturnValue:", - "_setHighlightedLayer:animate:update:", - "_unmarkEventFromString:", - "allMipmapItemsAreValid", - "coerceString:toTextStorage:", - "endIgnoreChanges", - "textColorAtIndex:", - "initWithContainer:key:mutableSet:", - "autoScales", - "setBrowserType:", - "pushGlyph:", - "CI_arrayWithRect:", - "_sortObjects:", - "_shouldShowInlinePreview", - "accessibilityIndexAttribute", - "_valueWithOperatorKeyPath:", - "setInternationalCurrencySymbol:", - NULL, - NULL, - "_shouldStealHitTestForCurrentEvent", - "collectionView", - "dictionaryWithObjects:forKeys:", - "helpRequested:", - "buttons", - "appendField:label:withText:", - "_parse", - "_currentFileModificationDate", - "removeRows:", - "_saveDocuments:", - "decodeNXColor", - "characterIsMember:", - "parseBasicConstraints:", - "launchedApplications", - "attributesByName", - "editableBinder", - "selectionType", - "dataToSave", - "sourceInfoForAddress:", - "fileNameFromRunningSavePanelForSaveOperation:", - "updateReferenceIndexesToReflectInsertionAtIndexes:", - "resultAtIndex:", - NULL, - "indexForKey:", - "_scrollViewForColumnsDocumentViewVisibilityChange:", - "_sendProgress:", - "_lineBorderColor", - "_allocateObserationStorage", - "initWithStore:", - "_containerAtIndex:traversingBackward:inContainerTree:ofDepth:", - NULL, - "thumbnailsFitOnScreen", - "_entryForPath:", - "lastDirectoriesSearchString", - "generateTexts:withAttributes:atIndex:renderMode:", - "_applicationDidActivate:", - NULL, - "_setChild:forUniqueName:", - "selectedItem", - "_setCursorForCurrentMouseLocation", - "hasNonContiguousLayout", - "punctuationCharacterSet", - "_setPendingInsertion:", - "pixelFormatRGBA8", - "_bytesAreVM", - "_menuRepresentationIsDefault", - "comboBox:completedString:", - NULL, - "nextWordInString:fromIndex:useBook:forward:", - "convertFont:toNotHaveTrait:", - "_noteAutosavedContentsOfDocument:", - "_createFileIfNecessary", - "setIMChineseName:", - NULL, - "optimizeCaches", - "frequency", - "nts_InitializeDatabase", - "adjustToUTType:", - NULL, - NULL, - "_temporaryAttribute:atCharacterIndex:effectiveRange:", - "URLWithAttributeString:", - "getOutputImage", - "_rankIndicatorSize", - "setAllowsUserCustomization:", - "_lockUnlockCachedImage:", - "scanFloat:", - "initMkcolWithSession:URI:token:", - NULL, - "_systemColorsChanged:", - NULL, - "saveCustomOutputPortStates:toState:", - "_invalidateLiveResizeCachedImage", - "buildWhereClauseWithSelectPredicate:", - "setMirrorMode:", - "_ciContext", - "adapterOperator", - NULL, - "ruleEditor:canSelectCriterion:andDisplayValue:inRow:", - "isStandalone", - "addNewPropertiesToRecipe:", - "willDie", - "outlineExpandCollapse:", - "_web_createFileAtPath:contents:attributes:", - "processMetaData:", - "_openRecentDocument:", - "retainBindingTargetAndUnbind", - "strokeLineFromPoint:toPoint:", - "userSelection", - "accessibilityIsCancelButtonAttributeSettable", - "comparisonPopUpFrame", - NULL, - "_ensureMetadataLoaded", - NULL, - "setRecentsPopUpHidden:", - "directoryContentsAtPath:", - "_addSource:", - "_doubleClickAtIndex:limitedRangeOK:", - "userFullName", - NULL, - "_uploadPath:toPath:", - "_cacheSelectedObjectsIfNecessary", - "setBinderSpecificFlag:atIndex:", - "setInputValuesWithPropertyList:", - "_enclosingBrowserForControlView:", - "setAutohidesScrollers:", - "_windowInitWithCoder:", - "migrateStoreFromURL:type:options:withMappingModel:toDestinationURL:destinationType:destinationOptions:error:", - "localizeOptionDictionaries:", - "_renameChild:toName:", - "annotationAtPoint:", - "_cycleWindows:", - "syncingEnabled", - "notifyListenersForUpdate:", - "imageSizeForCellSize:withAspectRatio:", - "initWithXMLString:", - NULL, - "rangeOfTextTable:atIndex:", - "audioChannelLayout", - "appleEventWithEventClass:eventID:targetDescriptor:returnID:transactionID:", - NULL, - "_setFrameNeedsDisplay:", - "setCellBackgroundColor:", - "pauseAnimation", - "reloadAll:", - "_saveConfigurationUsingName:domain:", - "setPaddingPosition:", - "menuForGraph", - "spellServer:didLearnWord:inLanguage:", - "setBoundsOrigin:", - "setMessage:", - "registerForFilenameDragTypes", - "currentInputContext", - "toolPath", - "insertNewButtonImage:in:", - "displayStringForLineHeightMultiple:min:max:lineSpacing:paragraphSpacingBefore:after:", - "qtUtilities", - "_updateCell", - "_realControlTint", - "cameraStatusDidChange:", - "_stringForNode:property:", - "_updateCellImage:", - "bindTextureRepresentationToCGLContext:textureUnit:normalizeCoordinates:", - "setUpPrintOperationDefaultValues", - "iSightRanOffWithItsListener:", - "dateValueYear", - "insertCompletion:forPartialWordRange:movement:isFinal:", - "maxResults", - "setClientView:", - "setOrientation:anchorPoint:", - "powerOffIn:andSave:", - "_inPreview", - "_calendarDayNamesStringForFirstWeekday:", - NULL, - "_wantsToolbarContextMenu", - "contents", - "optionDescriptionsForBinding:", - "_initParticle:atTime:", - "_forceSuccess", - "keysSortedByValueUsingSelector:", - "setIsEmpty:", - "registerServiceProvider:withName:", - "_calcTrackRect:andAdjustRect:", - NULL, - "windowDidChangeScreenProfile:", - "jobTitle", - "pixelColorModel", - "initWithIconRef:size:", - "_inputTopLine", - "_nonRepudiationUsage", - "setImagingModeAllowsVisualContext:", - "tableView:shouldShowCellExpansionForTableColumn:row:", - "drawArrow:highlightPart:", - "publicRecordClassFromUniqueId:inAddressBook:", - "moveToEndOfDocument:", - NULL, - "cachedSQLiteStatement", - "_lastLeftHit", - NULL, - "instantiateView", - "authenticateName:withPassword:", - "requestUserAttention:", - "_shouldShowFirstResponderAtRow:column:ignoringWindowKeyState:", - "initForView:", - "key:", - "validateAdditionalHeightToRow:", - "_memoryCacheAppendNodeToLRUList:", - "nts_hasUnsavedMailRecentsChanges", - "_editingIsPossibleForColumn:row:", - "_colorForMouseEvent:", - "predicateForRow:", - "_addKeychainItem:", - "cameraPictureNotification:", - "_isRuleStaticTextField:", - "hitTestForEvent:inRect:ofView:", - "_containerDescription", - "applicationDidResignActive:", - NULL, - NULL, - "_embossedOffsetTextColor", - "writeBody", - "nestingMode", - "_defaultGroupViewIfUsed", - "initWithIndexes:length:", - "_baselineRenderingMode", - "_attributeRunForCharacterAtIndex:", - "alphaComponent", - "setMode:", - "recentRepository", - "removeColorWithKey:", - "CA_stringByAppendingPathComponent::", - "_editNoteAtIndex:", - NULL, - "indexOfItemAtPoint:", - NULL, - "IKIPContainsObjectIdenticalTo:", - "stupidKitWorkaround", - "_invalidateTimeMode", - "setStopError:", - NULL, - "_getResolvedNavNodeForFilename:", - "_setupOverlayLayer", - "sharedEmptyIconViewCell", - "controlsFixedForKeyFrame:", - "_rowHeaderFixedContentRect", - "_labelAttributes", - NULL, - "setDefaultButtonTitle:", - "brightColor", - "initWithGroup:records:addressBook:", - "accessibilityArrayAttributeValues:index:maxCount:", - "cellFrameAtIndex:", - "setFrameTopLeftPoint:", - "setGenericView:", - "_executeAddChild:didCommitSuccessfully:actionSender:", - "documentForURL:", - NULL, - "_enumeratorDescriptionsFromImplDeclarations:presoDeclarations:", - "getValueForKey:", - "currentAppleEvent", - "_locationForPopUpMenuWithFrame:", - "initWithCyan:magenta:yellow:black:alpha:", - "_rectWithSingleThickness:", - "setRectSetBeingDrawn:forView:", - "setLocation:withAdvancements:forStartOfGlyphRange:", - "_topMenuView", - "rightMouseDragged:", - NULL, - "syncStateForKeychain:", - "_removeTrackingRect:", - NULL, - NULL, - "_accessibilityIndicatorRect", - "accessibilityIsEditedAttributeSettable", - "_deallocAuxiliaryStorage", - "updateInvalidatedObjectValue:forObject:", - "initWithQCImageKernelPatch:", - "rotateImageLeft:", - "_coreUILinearState:", - NULL, - "issueCommand", - "_minWidthForPass:forView:withProposedMinWidth:", - NULL, - NULL, - "getBagdeBackgroundForObjectCount:", - "isPartialStringValid:newEditingString:errorDescription:", - "hasImageWithAlpha", - "pixelFormatM_I8", - "runLoop", - "setNumberStyle:", - "setRootObject:", - "decodeColumns:", - "isEqualToDictionary:", - "newZoomButton", - "kaleidoscopeROI:forRect:userInfo:", - "saveSyncList", - "setImage:", - "populateWithDictionary:skipUnknownProperties:generateMultiValueIDs:recordIsNew:", - "_atEndOfTextTable:atIndex:", - "setDisplayedCard:withHistory:", - "processEndElement:", - "resource", - "convertScreenToBase:", - "negativeFormat", - "setSourceView:", - "scheduleTrickleSyncAndAllowLocking:", - "_adjustSheetEffect", - "realm", - "_registerMenuForKeyEquivalentUniquing:", - "_destroyRealWindow", - "_needsDisplayfromRow:", - "hyphenGlyphForFont:language:", - "me", - "startRendering:", - "writeLinkInfo:", - "writeToURL:options:error:", - "_localizedNameForColorWithName:", - "_maxXmaxYResizeRect", - "stateImageOffset", - "runInNewThread", - NULL, - "matchesRecord:", - "initWithOperation:", - "upToDateImageForEmail:", - "_doCommandBySelector:forInputManager:", - "selectionShouldUsePrimaryColor", - "_addToolTipRects", - "findMatchingWindowInWindowList", - "previewView:doubleClickedForURL:", - "endFetch", - "setMCDraggable:", - "connection:willSendRequest:redirectResponse:", - "setDatePickerElements:", - "_setOrientation:inPageFormat:", - "linkToURL:", - "columnIndexesInRect:", - NULL, - "disposeAudio", - "_shouldSendObserverNotificationForModelOrProxyKey:keyPath:ofObject:", - "_setInstallPending:", - "_setAttributes:isMultiple:", - NULL, - "imageInterpolation", - NULL, - "_isGeneratedClass", - "commonResetForm:inclusive:", - "contentLayer", - "dynamicToolTipRevealoverInfoAtPoint:trackingRect:", - "_hasSurface", - "defaultMenu", - "coalesceAffectedRange:replacementRange:selectedRange:text:", - "_drawDropHighlightAboveRect:", - "_scrollRowToVisible:animate:", - "_useMetalPattern", - "setDefaultAttachmentScaling:", - NULL, - "_currentApplication", - "_addSubfieldForElement:withDateFormat:stringValue:alternateStringValue:", - "exportRecords:", - "computeHostname", - "propertyLineForGenericABProperty:vCardProperty:is21:groupCount:", - "countOccurrences:", - NULL, - "segmentedRawBufferForResolution:", - "dateWithString:", - "_drawCenteredVerticallyInRect:", - "setDefaultPlaceholder:forBinding:onObjectClass:", - "initWithName:elementNames:", - "importPumaAddressBook:", - "updateOptionsWithApplicationIcon:", - "createUniqueKey:", - NULL, - "setHour:", - "loadPlugIn:allowNonExecutable:", - "_validItemViewerBoundsAssumingClipIndicatorShown", - "reenableFlush", - "_copyDisplayNameForKey:value:", - "setSQLString:", - NULL, - "setShowsPrintPanel:", - NULL, - "autoResizeToRect:clipView:allowZoomIn:", - "_validateEntryString:uiHandled:", - "_leftmostInsertionIndexForNode:inOrderedNodes:", - "_doDetachDrawer", - "_forgetObject:propagateToObjectStore:", - "transformedScaledImageSize", - "accessibilityChildrenAttribute", - "startAnimation", - "processInputKeyBindings:", - "mouseEntered:", - "setEditingCanceled:", - "initWithPanel:", - "windowLevel", - "renderLevel", - NULL, - "scrollSelectionToVisible:", - "getMagnificationFilter", - "accessibilityTopLevelUIElementAttribute", - "_replaceAccessoryView:with:topView:bottomView:previousKeyView:", - "attributesForResultPortWithInfo:name:index:", - "_indexesToPrefetch", - "application:openFiles:", - "httpStatusCode", - "controlHeight", - "hasNameData", - "contentWidth", - "_cancelAutoExpandTimer", - "morphologyInitROI:destRect:userInfo:", - "_removeHiddenWindow:", - NULL, - NULL, - "_rendererPropertyValue:", - "noteFontFavoritesChanged", - "updateWithinDateTense", - "_countPartsInFormat:", - "removeSubItem:", - "pathControl:acceptDrop:", - "setMaxValue:", - "_outlineView", - "_classNameForType:", - "setInactiveColor:", - "releaseFxPicker:", - "_setBox:enabled:", - "_viewIsEnabledAtIndex:", - "drawsBackground", - "isEditableByThisApp", - "initWithModel:entityDescription:", - "showsHelp", - NULL, - "isPreviewColumn", - "_unregisterForNotifications", - "ok:", - "initWithWindowNibPath:owner:", - "initWithSession:", - "_progressBarRect", - "_trackButton:forEvent:inRect:ofView:", - "openInSeparateWindowWithoutAsking", - "firstRange", - NULL, - "_setConsistencyCheckingEnabled:superCheckEnabled:", - "tagForNSTag:", - "_mainWindow", - "managerForNodeNamespace:", - "_removeSortDescriptorForTableColumn:", - "_preferedColumnWidth", - "selectCompositionIfNeeded", - "sqlTypeForPropertyAtEndOfKeyPath:", - "bundleIdentifier", - "_defaultMetadata", - "hashFunction", - "bind:toLayer:", - "shapeZ", - "partialObjectKey", - "descriptorWithEnumCode:", - "_switchInitialFirstResponder:lastKeyView:forTabViewItem:", - "_changeIntAttribute:by:range:", - "initPropPatchWithSession:path:patchProperties:deleteProperties:", - "willHaveItemsToDisplayForItemViewers:", - "setServiceType:", - "_emptyContents", - "fixAttributesInRange:", - "externalDataForSourceObjectID:key:timestamp:", - "leaveCropMode", - "characterIndexForInsertionAtPoint:", - "_draggedColumnImageInset", - "_QTMovieViewClass", - "_isGUIDUnique:", - "drawForPage:withBox:active:", - "scrollMode", - "setCellSize:", - "_syncFrameMetrics", - "_controlSizeForScrollers", - "showPanel:andNotify:with:", - "_drawBezelWithFrame:highlighted:inView:", - "contentValueKey", - "_indexOfDocumentAtRow:column:", - "_performChangesWithAdapterOps:", - "cacheNodes", - "initWithContainerClassID:key:containerIsa:ivar:", - "textureMatrix", - "setHasViewControls:", - "hasSubentities", - NULL, - "_defaultObjectClassName", - "_finalize_QCImageBuffer", - "_inputImage", - "serializePropertyList:intoData:", - "URLWithQuery:inHelpBooks:", - "awakeFromFetch", - "createResourceWithDownloadedData:sourceURL:", - "_commandDescriptionsFromPropertyListDeclarations:suiteName:", - "limitDateForMode:", - "createRepresentationOfType:withProvider:transformation:bounds:colorSpace:options:", - "_resetMeasuredCell", - "deminiaturize:", - "adjustToPDFView:", - "deletedObjects", - NULL, - "externalScale", - "runOperation", - "setDay:", - "setWindowFrameForAttachingToRect:onScreen:preferredEdge:popUpSelectedItem:", - "outputPorts", - "enlargedBounds:withYOffset:andCount:", - "extraLineFragmentTextContainer", - "netServiceBrowserWillSearch:", - "_MOClassName", - "initWithMigrationManager:", - "addRotationLayer:", - "_valueClass:", - "imageWithRenderer:userData:renderSize:renderContext:", - "constraintWithAttribute:relativeTo:attribute:offset:", - "_feedbackWindowIsVisible", - "setWithCapacity:", - "_updateLayerShadowFromView", - "loadNib", - "_dragEndedNotification:", - "getBoundingRects:forGlyphs:count:", - "dstDraggingEnteredAtPoint:draggingInfo:", - "initWithBytesNoCopy:length:freeWhenDone:", - "accessibilityIsHelpAttributeSettable", - "_subrowObjectsOfObject:", - "_webPreferences", - "processEditing", - "setInitialBoundsWithOptions:", - "_findFirstKeyViewInDirection:forKeyLoopGroupingView:", - NULL, - "contextDictionary", - "_lazyFetchResultProxyForObjects:", - "configureForActiveState", - "_setProperty:forKey:", - "observedNodeForExpandedNode:createIfNeeded:", - "variableRows", - "converterForImageManager:", - "setBalance:", - "_sessionData", - "localizedStringWithFormat:", - NULL, - NULL, - "analyzeKeyPath:registerOrUnregister:", - "isReleasedWhenClosed", - "didShow", - "allowGroupSelection", - "_doSomeBackgroundLayout", - "_recursiveGainedLayerTreeHostAncestor", - "selectRowAfterTargetingItem:withMenu:", - "serializedStateKeysWithIdentifier:", - "menuLocation", - "_writeDocumentProperties", - "filterNamesInCategories:", - "_setMenuClassName:", - "saveCustomInputPortStates:toState:", - "bundleWithIdentifier:", - "setGlyphID:forIndex:", - "connectionsForObject:", - "sourceKey", - "_transplantReplacementBackingLayer:", - "_accessibilitySupportedPartCodes", - "precision", - "_drawAnimationStep", - NULL, - "_sendDelegateToolTipForCell:tableColumn:rect:row:mouseLocation:", - "processSignificantWhitespace:", - "nodes", - "removeBinding:", - "_blueKeyboardFocusColor", - "setShouldReportNamespacePrefixes:", - "createCopy:", - "_updateOutputDeviceUniqueIDFromPropertyListener", - "stopSpeaking:", - "_rectOfRowAssumingRowExists:", - "raiseBaseline:", - "addSubrecord:", - "specialColorSpaceWithID:", - "node", - "setUseSSL:", - "automaticallyManageVisibility", - NULL, - "_lastItemIsNonSeparator", - NULL, - "_printSessionAttributeKeys", - "_setLocalizedKeyWithoutKey:", - "searchElementForProperty:label:key:value:comparison:", - "_sendAction:to:row:column:", - "_scrollRect:fromLayer:", - "initWithContentsOfFile:ofType:", - "imageFlowWillStabilize:", - "notificationCenter", - NULL, - "FilterApplyButton", - "setUserInterfaceItemIdentifier:", - "_uiClearField:", - "hitTestWithPoint:", - "dsDirRef", - "noteNumberOfTableRowsChanged:", - "drawTokenWithFrame:inView:", - "specialGroupForAddressBook:", - "pageUpAndModifySelection:", - "centerPanel", - NULL, - "_scriptingValueOfValueType:withDescriptor:", - "getBytes:maxLength:usedLength:encoding:options:range:remainingRange:", - "_delegateRepondsToValidateDrop", - "_setPKINITClientAuthUsage:", - "setSelectedIndex:", - "_layoutThumbnailLayers", - "_bundle", - "setUnsignedInt:", - "_incrementInUseCounter", - "FilterRemoveButton", - "cachePath", - "filepathLabel", - "decimalNumberBySubstracting:", - "connectionWillDeleteFromGraph", - "setDefaultBehavior:", - "sharedRemoteImageLoader", - "setParent:", - NULL, - "_checkForClipViewScrolling", - "copy:", - "_scriptingCanHandleCommand:", - "_previousNibBindingConnector", - "setMenuFormRepresentation:", - "scanHexDouble:", - "_handleAEOpenContentsEvent:replyEvent:", - "threadedGenieFXFromWindow:toWindow:", - "textContainerChangedTextView:", - "_setPrimaryIdentifier:", - "exactlyMatchesFileNameExtensionOrHFSFileType:", - "setIgnoresAlpha:", - "_inputBottomLineParams", - "namespaces", - "printShowingPrintPanel:", - "deserializeNewList", - "initPropPatchWithSession:URI:updatingProps:inNameSpace:", - "primitiveModificationDateYearless", - "searchResultAtIndex:", - "revertToBackupFromPath:", - "fileNameExtensionForType:saveOperation:", - "unlockDelegate", - "_propertyDescriptionForPresentableName:checkSubclasses:superclasses:", - NULL, - "drawBarInside:flipped:", - "_updateMaxIndexFromLabels", - "_scriptingFileWithDescriptor:", - "_defaultTitlebarTitleRect", - "writeColor:type:", - "layoutParameters", - "_finishWritingFileAtPath:byMovingFileAtPath:addingAttributes:error:", - NULL, - "_gridGeometryChanged:", - "findOnPage", - "accessibilitySetSizeAttribute:", - NULL, - NULL, - "recentIsACustomRecent:", - "setPreferredFontNames:", - "_updateNodeList:forChangedProperty:ofNode:", - "complete:", - "_processOwnedObjects:set:boolean:", - NULL, - NULL, - "_computeStepsInSequence:withConverters:softwareOnly:accelerated:sourceTarget:sourceFormat:sourceColorSpace:destinationTarget:destinationFormat:destinationColorSpace:transformation:bestScore:baseCost:inLoop:", - "_setDefaultButtonCycleTime:", - "_setHIViewIsDrawing:", - "_scrollFirstVisibleColumnIntoView", - "_startTimeOutWithSelector:documentPreview:object:stopOnCondition:", - "flushTextForClient:", - NULL, - "_validatePaginationAttributes", - "urlForEmail:", - "getDirInfo:", - "infoDictionary", - "setSpeechFeedbackServicesTimer:", - NULL, - "bitsPerBlock", - "initWithRepresentedObject:", - "updateOnlineStatus", - "textView:shouldChangeTextInRange:replacementString:", - "_toolbarCommonFinishInit", - NULL, - "_accessibilityCompatibilityHitTest:", - "refreshWithGroupsController:", - "markPersonAsViewed:", - "_wordsInDictionary:", - "newInsertedObject", - "initWithContainerClassID:key:method:", - "draggedImage:endedAt:deposited:", - "infoForBinding:", - "sourceEntityVersionHash", - NULL, - "metadataQuery:replacementObjectForResultObject:", - "_needImportMipmap:forCellSize:exactSizeMode:", - "setScrollView:", - "orderFrontFontPanel:", - "streamEnumeratorWithTrack:", - "updateFont:", - "_stashedOrigin", - "valueTextAttributes", - "_currentWidth", - "saveToDocument:removeBackup:errorHandler:", - "flushDataForTriplet:littleEndian:", - "setRootNode:", - "initWithString:relativeToURL:", - "standardDeviation", - "_attributedSubstringForCopyingFromRange:", - "rulerStateDescription", - "hasChanged", - "_windowDeviceRound", - "setEditMode:", - "setZoomValue:", - "_automaticRearrangementKeyPaths", - "_changeIconViewTextSize:", - "_lastSelectedSliceIndex", - NULL, - "_shouldLiveResizeUseCachedImage", - "accessibilityValueAttribute", - "addRunLoop:", - "_boundsWithAllKeyFrames:", - "glID", - "numberOfPages", - "deleteProxyPortWithOriginalPort:", - "indexForIdentifier:", - "willBeRemovedFromSuperlayer", - "_sendingTableViewRowAction", - "runProcess:arguments:wait:", - "deleteObjectsInRange:", - "_elementIsBlockLevel:", - "interpretKeyEvents:forClient:", - "_modifiedGrammarRangeForRange:details:", - "transformForOrientationAndDPIWithTranslationForWidth:height:", - "_resetScreens", - "unionHashTable:", - "fillExactInterior", - "cellsHaveTitle", - "_removeAllTrackingRects", - "_applyDisplayedValueIfHasUncommittedChangesWithHandleErrors:typeOfAlert:discardEditingCallback:otherCallback:callbackContextInfo:didRunAlert:", - "viewMovingToWindow", - "_removeBinding:", - "syncWithRemoteToolbars", - "getReadableNotWritable:names:", - "_hasKeyboardFocus", - "removePortAtIndex:", - "_centerLayerInParentLayer", - "setDocWindow:", - "accessibilityIsDefaultButtonAttributeSettable", - "closeStartContentWindow", - "isInherited", - "setScreenRectCG:", - "pushRoundedRectPath:inContext:withCornerRadius:alignOnPixelCenter:", - "slideshowClose:", - "setColorSpace:", - "portMaxValue", - "iconView", - "_stringRepresentation", - "_umask", - NULL, - NULL, - "setPrimitiveDisplayFlags:", - NULL, - "setIndexValue:", - "_composite:delta:fromRect:toPoint:", - "imageRepresentationType", - "initWithObjectID:", - "maxRows", - "_inActiveBackgroundColor", - "updateFromPMPrintSettings", - "_setDisplayNodes:", - "runModalForCarbonWindow:", - NULL, - "sleep", - "initWithRTFDFileWrapper:documentAttributes:", - "cancelIncrementalLoad", - "initWithMembers:keyPrefix:", - "addLayoutManager:", - "enqueueNotification:postingStyle:coalesceMask:forModes:", - "scanHexInt:", - "initToMemory", - "_updateInputManagerState", - "contextForSecondaryThread", - "resetSearchResults", - "defaultCompletionDelay", - "dictionaryByAddingObject:forKey:", - "addElementView:", - "_activateTrackingRectsForApplicationActivation", - "startRendering:options:", - "setGRL:", - "setInUserDomain:", - "supportedTextureBufferTargetsForManager:", - "_shouldShowCursorRects", - "_scriptingAnyWithDescriptor:", - "objectIDForEntity:referenceObject:", - "initWithKind:", - "_replaceRangeInArrayAtIndex:withRange:", - "nsImage", - "_selectAllNoRecurse:", - "_itemAdded:", - "setContentsTransform:", - "setAttributes:ofItemAtPath:error:", - "add:to:", - "downloadTextureWithBounds:toAddress:bytesPerRow:", - "orderedSetWithObjects:count:", - NULL, - "initWithSource::dest::", - "hasFrameImageAtTime:", - "_removeStatusItem:", - "primitiveCreationDateYearless", - "sourceOptions", - "setAcceptsMouseMovedEvents:", - "fontInvalidationCapableObjectForObject:", - "doubleAction:", - "_dropHighlightBackgroundColor", - "reallyReplaceObjectAtIndex:withObject:", - "_nodeAtPosition:outBounds:", - "setOutlinesCells:", - "EPSOperationWithView:insideRect:toPath:printInfo:", - "objectForResolution:", - "editWithFrame:inView:editor:delegate:event:", - "verticalRulerView", - "endOperationWithError:", - "rowForObjectID:", - "unbindItemWithResolution:withUID:", - "initWithIndex:", - "colorSwathesChangedInAnotherApplicationNotification:", - NULL, - NULL, - "accessibilityPostNotification:", - "_lockViewHierarchyForModification", - "popupClosing:", - "_layoutViews:startingInsetFromXOrigin:insetFromTop:withSpacing:sizeToFit:horizontal:", - "valueForBinding:resolveMarkersToPlaceholders:", - "fireDidStartAnimating", - "_containsColorForTextAttributesOfNegativeValues", - "usesFeedbackWindow", - "connectionUnitOutputNumberForConnection:", - NULL, - NULL, - "isAttached", - NULL, - "inputRampParamsAtIndexes:", - "_isValid", - "_destroyRealWindowForAllDrawers", - "sender", - NULL, - NULL, - "_updateSyncState", - "_modifyInvitationWithObject:forKey:", - "stringForIndexing", - "setTargets:", - "_importedCard", - "setChildren:", - "selectionRectChanged:", - "checkAllocCellLayoutInfo", - "browser:shouldShowCellExpansionForRow:column:", - "_startDraggingUpdates", - "initWithItem:forToolbarView:", - "storedAttributes", - "initWithImage:foregroundColorHint:backgroundColorHint:hotSpot:", - "paragraphs", - "_performArrayBinderOperation:singleObject:multipleObjects:singleIndex:multipleIndexes:selectionMode:", - "vectorWithSize:", - "mediaBox", - "initWithNavView:", - "_cursorRectCursor", - "_effects", - "setDoubleClickOpensImageEditPanel:", - "initWithCFURLProtocol:", - NULL, - NULL, - "_validateLDAPServer", - "_deselectAllAndEndEditingIfNecessary:", - NULL, - "appDidActivate:", - "escapeInvalidXMLCharactersInString:", - "setLeafKeyPath:", - "handleGetAETEEvent:withReplyEvent:", - "initAll:owner:index:", - "_loadSuitesFromSDEFData:bundle:", - NULL, - "_labelFont", - NULL, - "defaultValues", - "initWithManagedObjectModel:", - "_enqueueAnimation:forObject:keyPath:", - NULL, - "drawShadow", - "settingsView:shouldRenameKey:", - "_entityDeallocated", - "registerForCommandDescription:", - "_showsPreviewByDefault", - NULL, - "__timebaseChanged:", - NULL, - "_reconfigureAnimationState:", - "sharedWithString:", - "priorityForFlavor:", - "wantsLayer", - "render:arguments:", - "drawDropHighlightOnRowFirst:", - "descriptorType", - "createInputPortWithArguments:forKey:", - "_setDragAndDropCharRange:", - "_recordPreviousKeyWindowProperties", - "setSelectionType:", - "setSortDescriptorPrototype:", - "setURL:blockingUntilLoading:", - "authenticateWithDelegate:", - "_addDeletesToDatabaseOp:forManyToMany:", - "removeObjectFromAppleUseCoreUIAtIndex:", - "resumeExecutionWithResult:", - "mappingModel", - "_country", - "typographicBounds", - "_segmentHighlightState:", - NULL, - "shouldRefreshDisplayAfterSelectionMechanismWasDismissed:", - "root", - "initWithRow:tableColumn:realElement:", - "stringByReplacingOccurrencesOfString:withString:", - "_showFindIndicator", - "parseStream", - "cellFrameForCell:", - "didSave", - "initWithTextRenderer:options:", - "enabled", - "processName", - "setFontManagerFactory:", - "setParagraphStyle:", - "_registerUndoObject:", - "isLayoutValid", - "_objectDidTriggerAction:bindingAdaptor:", - "unbindItem:withUID:", - "drawImage:inRect:forAA:reflection:alpha:fog:baseline:", - "initToFile:error:", - "_inactiveStateShowsRollovers", - "notActiveWindowFrameShadowColor", - "setMaxContentSize:", - "cleanupAfterPrintOperation:", - NULL, - "_dragRowIndexes:inColumn:withEvent:pasteboard:source:slideBack:", - "documentURLs", - "metadataJobType", - "controlViewWillBecomeFirstResponder:", - "flushCachedChildrenForNode:", - "setMailRecent:", - "segmentSize", - "_getCString:maxLength:encoding:", - "setOption:forKey:", - "contains:", - "isBaseFont", - "windowTitlebarTitleLinesSpacingWidth", - "replyMode", - "unarchiver:cannotDecodeObjectOfClassName:originalClasses:", - "moveInDirection:", - "_objectForAttributeKey:", - "typefaceInfoForFontDescriptor:", - "setPickerMode:", - NULL, - "_pageUpWithEvent:", - "stringForKey:inTable:", - NULL, - "setAsyncLaunch:", - NULL, - "migrationManager", - "acceptsRootNodeOrWarn:usingParent:", - "_textHighlightColor", - "_userClickOrKeyInColumnShouldMaintainColumnPosition", - "initWithName:appleEventCode:enumeratorDescriptions:", - "getInfoForFile:application:type:", - "_computeAndAlignFirstClosestVisibleColumn", - NULL, - "_stripAttachmentCharactersAndParagraphStylesFromAttributedString:", - "showState:", - "_reflectFont", - "highlightedSelections", - "bestMatchingFontForCharacters:length:attributes:actualCoveredLength:", - "_setSelectedCell:", - "nonAutorotatedOriginalImageSize", - "_compositePointInRuler", - "_initWithContentsOfURL:ofType:error:", - "UID", - "keywordForDescriptorAtIndex:", - "_positionalSpecifierFromDescriptor:", - "pathForResource:ofType:inDirectory:forLanguage:", - "_appendObjectClassDeclarationsToAETEData:includingParts:", - "accessibilityIsSelectedAttributeSettable", - "verifyInvitationFile:invitationDictionary:trustRefOnErr:signerIdentity:", - "_menuCellInitWithCoder:", - "_toolbarFrameSizeChanged:oldSize:", - "toolbar:itemForItemIdentifier:willBeInsertedIntoToolbar:", - "accessibilityIsColumnsAttributeSettable", - "localizedName", - "setUserInfo:forKey:", - "_nonNilMutableArrayValueWithSelector:", - "authenticateWithBufferItems:authType:authOnly:", - "_defaultSelectionColor", - "iconView:performKeyEquivalent:", - "_setSelectionRange::", - "_performActionOnSelectedNodes:context:", - "fractionOfDistanceThroughGlyphForPoint:inTextContainer:", - "tangentialPressure", - "beginPageSetupRect:placement:", - NULL, - "boolParameterValue:", - "_inputPortAttributesWithKey:index:count:type:", - "scrollRect:by:", - "undoWithObject:", - "_setPathLocationEmptyTitle:", - "resolvesAliases", - "_bindVariablesWithDeletedRow:", - "parentItemRepresentedObjectForMenu:", - "applicationID", - "_decodeDownloadHeaderData:dataForkData:resourceForkData:", - "_handleFocusToolbarHotKey:", - "createFileFormatInfo", - "horizontalPageScroll", - "sharedController", - "_canDrawOutsideOfItsBounds", - "addRGBColor:forKey:toDictionaryRef:", - "_initWithGraph:mutable:", - "_installTrackingArea:", - NULL, - "initializeSlice:withOptions:", - "reshape", - "objectInInputBottomLineParamsAtIndex:", - "sizeWidthToFit", - "_orderOutAndCalcKeyWithCounter:stillVisible:docWindow:", - "shadowImageAroundPath:", - "animationDidStop:finished:", - "getComponents:", - "initWithDir:strings:", - "setHasVerticalRuler:", - "viewNibName", - "gridCapacity", - NULL, - "setInputTopLine:", - NULL, - "supportsDragAndDrop", - "_setupMessagePort", - "createCommandInstance", - "_setNeedsStateUpdate:", - "_notifyFamily_MovedFromIndex:toIndex:", - "analyzeCurrentWindow:", - "_setKeyViewRedirectionDisabled:", - "abBackupDate", - NULL, - "brightness", - "_updateContainerReferenceCounterForArraysOfItems:direction:", - "_setInputColor0:", - "setNumberOfVisibleItems:", - "getInfoButtonCell", - NULL, - "_pushState", - "_unlearnSpellingFromMenu:", - "objcCreationMethodSelector", - "setForegroundColor:", - "setHasLineNumbers:", - "normalize", - "writeDictionary:toURL:securely:andReturnResultCode:", - NULL, - "_allowAnimated_removeFromSuperview", - "_minXResizeRect", - NULL, - "cellPadding", - "_changeWasRedone:", - "setEnableSelectionHighlightDrawing:", - "doAutoResizeToRect:clipView:", - "_removeFromKeyViewLoop", - "begin", - "setSelection:", - "_findLastViewInKeyViewLoopStartingAtView:", - NULL, - "removeContext:", - "insertInAttachments:", - "updateState:", - "plusSign", - "deepSubnodeCopy:", - "imageCroppedRect", - NULL, - "windowControllerDidLoadNib:", - "minimum", - "frameSize", - "setSynchronousMode:", - "_userReplaceRange:withString:", - "compressMipmapItemIfNeeded:withUID:", - "indexOfMember:", - NULL, - "_boundsForSelection", - NULL, - "_itemChangedLabelOrPaletteLabel", - "addNewColor:andShowInWell:", - "foreignKeys", - "adapter", - NULL, - "parser:foundCharacters:", - "tileVertically", - "deviceDeltaX", - "_coreUIDrawSegmentBackground:withCellFrame:inView:", - "unescapedString", - "addQuadPointsToDictionaryRef:", - "_collectionWithName:index:", - "_templateType", - "_setSSLClientAuthUsage:", - "noteUserDefaultsChanged", - "lazyGetChildrenForNodeWithIdentifier:", - "_finalizeWithGC", - "mediaKeysForType:", - "sortAnnotations", - "localizedStringForKey:value:table:", - "_setCounterpart:", - "clearDataFileInfo", - "allowsUndo", - "getObject:atIndex:", - "ikVisibleRect", - "renderStateClass", - "addAnimation:forKey:", - "setIsOpen:", - "addFontTrait:", - "drawSelectionRingWithColor:width:forNode:bounds:view:", - "_chooseEvaluatorFunction", - NULL, - "setShowGroupMembership:", - "setZipCode:", - "mutableArrayValueForKeyPath:", - "_populateEntityDescription:fromNode:", - "_minNonExpandedFrameSize", - "_widthRequiredForLabelLayout", - "graphiteControlTintColor", - "parseKeyName:", - "valueWithQTTimeRange:", - "contentColor", - NULL, - "_moveParent:andExpandPanel:toFrame:", - "_allAttributeKeys", - "_setLockingFocus:", - "shouldDelayWindowOrderingForEvent:", - "_otherMenuItemForAttributeName:", - "_CGSinsertWindow:withPriority:", - "shouldAntialias", - "_descriptorWithNumber:", - "removeIndexesInRange:", - NULL, - "usesGroupingSeparator", - "setJavaScriptEnabled:", - "contentsTransform", - "metadataQuery:replacementValueForAttribute:value:", - "toolbarDefaultItemIdentifiers:", - "setSubIndex:", - "setPropertyList:forType:", - "_numberEnumerator", - "addIndex:", - "_labelColorIndex", - "_preparePredicate:", - NULL, - "view:customToolTip:frameForToolTipWithDisplayInfo:", - "_setCRLSigningUsage:", - "buildOrderByClauseWithSortDescriptors:", - "addObjectToArray:", - "_deallocatePPDStuff", - "_removeAllDrawersImmediately:", - "initFileURLWithPath:isDirectory:", - "accessibilityIsIgnored", - "setAnimationCurve:", - "adjustPosition", - "restoreCustomOutputPortStates:fromState:", - "setBackingType:", - "_parseCharacterAttributes2", - "_initContent:styleMask:backing:defer:contentView:", - "addAppleUseCoreUIObject:", - "label", - "initWithTextureTarget:textureInternalFormat:textureMaxMipMapLevel:pixelsWide:pixelsHigh:", - "_audioNodeFormatDescriptionDidChangeFromPropertyListener", - "offsetControlType:byTime:byValue:keyFrame:inTimeLine:", - "_markAsExplicitlyIncluded:", - "encodeDataObject:", - "contentRectForString", - "removeAllPopupViews", - "focusView", - "markOneShot", - "_fontPanelRemoveCollectionSheet:returnCode:contextInfo:", - "handleRollOverAtPoint:", - "newLegalColorSwatchHeightFromHeight:", - "_setKeyWithoutLocalizedKey:", - "advanceToUnicodeString", - "closeFullscreenWithEffect:", - "_encodeIntValuedMapTable:withCoder:", - "transactionDidBegin", - "initWithCountryCode:identifier:label:insertPopups:andInputController:", - "threadPriority", - "_windowWillOrderOut:", - "clearColor", - "separateWindowForPerson:", - "_scriptingAddObjectsFromSet:toValueForKey:", - "_incrementSelectedSubfield", - "_setObjectID:", - "_readSelectionFromUnarchiver:toPoint:", - "setVerticalScroller:", - "_popupHeightIsFlexible", - "decodeInt64ForKey:", - "_getHintString:", - "_requestHiddenState:", - "shouldLinkItemAtPath:toPath:", - NULL, - "fieldDescriptions", - "getICMDecompressionOptions:pixelBufferAttributes:forVideoConnection:", - "isInputBottomLineParams", - "removeTable", - "removeAllObjectsWithTarget:", - "registerClassDescription:", - "_printVerboseDebuggingInformation:", - "_getUnmodifiedCharacters:length:fromEvent:", - NULL, - "appendCharacter:", - "_postEvent:", - "ab_StringByMakingNameUnique", - "_setCertAuthorityIsCertAuthority:", - "updateSlideshowButtonWithPlaying:", - NULL, - "_addInternalRedToTextAttributesOfNegativeValues", - "tableView:shouldSelectTableColumn:", - "componentAddNotification:", - "_loadIconlessMenuContentsIfNecessary", - "loadCache:fromFile:", - "resumeAnimation", - "_initWithName:", - "selectFarthestRangeForward:", - "baseKeyFrameIndexAtTime:inTimeLine:", - "objectForCacheKey:", - "initWithSortDescriptors:inScope:", - "intercellSpacing", - "contextWithBitmap:rowBytes:bounds:format:", - "insertionReplaces", - "initFromPList:target:andIdentifier:", - NULL, - "_tooltipForColorPicker:", - NULL, - "defaultExpandOutlineItem:", - "_labelOnlyModeRectForItemAtIndex:inBounds:", - NULL, - "setContentMinSize:", - "_selectedNodesaIncludingDirectory:", - "action", - "_didChangeValuesForArrangedKeys:objectKeys:indexPathKeys:", - NULL, - "crosshairCursor", - "drawLineFromPoint:toPoint:", - "_setProgress:", - "_stealSharedPreviewViewForURL:", - "drawPushButton:inContext:", - "safeURLFromURL:", - "_resizeAccordingToTextView:", - "closing", - "__oldnf_copyToUnicharBuffer:saveLength:", - "deleteToEndOfParagraph:", - "defaultTimeZone", - "_getCommonTypeFor:", - "nextPage:", - "_getConvertedDataFromPasteboard:", - "openUntitledDocumentOfType:display:", - "importUnlock", - "_discardEventsForTrackingArea:", - "layoutStateDidChange", - "resolveClassMethod:", - "discardEventsMatchingMask:beforeEvent:", - "setCurrentDirectoryNode:", - "shouldDisplay", - "_issuePropFindAtPath:withDepth:lookingForProps:includingParent:", - "_setupForWindow:", - "apply:arguments:options:", - "runModalForIdentities:message:", - "_currentTableCellIsPlaceholder", - "_reloadInspector", - "_setStartSubelementFromDescriptor:", - "accessoryView", - "setDirection:", - "dataReferenceWithReferenceToData:name:MIMEType:", - NULL, - "layoutToFitInIconWidth:", - "userKeyEquivalentModifierMask", - "arrangedObjects", - "_usingAlternateHighlightColorWithFrame:inView:", - NULL, - "_parseText1Full", - "stopSequenceGrabber", - NULL, - "setMaxRows:", - "setNextAction:forDocument:", - NULL, - "endContainer", - "_addPersistentStore:identifier:", - NULL, - "processEndEntity:", - "updateOutlineSelection", - "initWithInitialSearchRow:totalRows:forView:", - "resolveResourceAndInvoke:", - NULL, - "setAlignment:", - "objectController", - "transformContext:forBox:", - "_setTrue:", - "accessibilitySizeAttribute", - "canFindHoleForLen:", - "_singleMutableArrayValueForKeyPath:", - "_setCurrentChildOperation:", - "_glyphDrawsOutsideLineHeight:", - "name", - "accessibilityTabsAttribute", - "setRate:", - "snapshotDate", - "_drawFrame:", - "wouldUseVisualContext", - "_computeInv", - "_accessibilityShowMenu:", - "_adjustedFrameFromDefaults:", - "typefaceInfoForPostscriptName:", - "_registerForQueryStateChangeNotifications:", - "initWithRTFD:documentAttributes:", - NULL, - "nts_PredicateMatchesRecord:", - "connection:handleRequest:", - "_autoComplete:", - "executionModeWithIdentifier:", - "tabKeyTraversesCells", - "__removeFromSelection:context:", - "setShowsAttributeFilter:", - "_windowTitlebarTitleMinHeight", - "addClassNamed:version:", - "_expandButtonClicked:", - "aCellIsPlayingInView:", - "fillObjCType:count:at:", - "_setValue:forInputkey:forPort:", - "ab_timeIntervalSinceToday", - "_refreshLinkedDevicesAttribute", - "_addParent:", - "registerView:name:", - "replacementClassForClass:", - "registerLayer:", - "helpButtonClicked:", - "attributedStringWithAttachment:", - "setPersistentStoreCoordinator:", - "setContentView:", - "ramNodeForResolution:uid:", - "_setWindowOriginOffsetWhenHidingHint:", - "stopRendering", - "_importThreadFinished", - "setAllowsAnimatedImageLooping:", - "_resetModificationDate", - NULL, - "_getInputBottomLineParams", - "showXcodeHelp:", - "uniqueKey:", - "evaluateStatus", - "_setKeyboardLoopNeedsUpdating:", - NULL, - "encodeSize:", - "proxy", - "_setupDNSNames:inCEGeneralNames:", - "_finalize_QCPlugInPatch", - "setLineScroll:", - "applicationLaunched:handle:", - "willPresentError:", - "diskLabelValues", - NULL, - "values:forResolutions:withCount:fromArrayOrNumber:", - "_endDrawView:", - "swapIndex:withIndex:", - "_atStartOfTextTable:atIndex:", - "_document:shouldClose:forScriptCommand:", - "selectedTextAttributesForCharacterAtIndex:effectiveRange:", - "connections", - "endFetchAndRecycleStatement:", - "_scrollInProgress", - "_userDeselectRow:", - "_drawClockAndCalendarWithFrame:inView:", - NULL, - "itemArray", - "_setConnectedPort:", - "implClassForPublicRecordClass:", - "_doTypeSelectNodeInDirectory:withSearchString:visitedNodes:expandedNodesToVisit:recursively:", - "stringByAbbreviatingWithTildeInPath", - "_crunchyRawUnbonedPanel", - "setTitleWithRepresentedObject:", - NULL, - "doCancelCrop:", - "gState", - "abortModal", - "trackingNumber", - "_finishPrintingDocumentsInContext:success:", - "initWithContainerSize:", - "accessibilityIsGrowAreaAttributeSettable", - "isMemberOfClassNamed:", - NULL, - "_runLoopModesForInvalidCursorRectsObserver", - "attributedTitle", - "_setDocumentWindow:", - "defaultClosestPixelFormat:withColorSpace:", - "registerExternalData:forObjectID:options:", - "statusImageForPerson:", - "coveredCharacterCacheData", - NULL, - "initToFileAtPath:append:", - "canGoToPreviousPage", - "removeConnection:fromRunLoop:forMode:", - NULL, - "initWithRole:parent:marker:", - "_keys", - "arrowKeyDown:withModifier:", - "imageRepClassForFileType:", - "setCacheUsedByProxyJpegData:", - "_itemChanged", - "_deleteFileAsnyc", - "newViewForToolbar:inWindow:attachedToEdge:", - "_setTrackingRect:inside:owner:userData:useTrackingNum:", - NULL, - "_saveQueryButtonClick:", - "SCTArrayByOrderedIntersectionWithArray:", - "applicationWillUnhide:", - NULL, - "generateLimitIntermediateInContext:", - NULL, - "ISS_encodingForIANACharSetName:", - "autoPlayDelay", - "_adjustSearchButtonCellImages::", - "_prepareSubstringWith:wildStart:wildEnd:", - "orderFrontListPanel:", - "_isTitleHidden", - "addPointer:", - NULL, - "imageRectInRuler", - "usesSignificantDigits", - "CA_stringByAbbreviatingWithTildeInPath:", - "writeBaselineOffset:", - "initWithSelectedGroup:addedToGroup:deletedPeople:updatedPeople:updatedPeopleProperties:addedPeople:mergedIntoGroups:addressBook:", - "_setLabelViewCount:", - NULL, - "_setLastSnapshot:", - "_maxWidth", - "abortImportVisibleCells", - "_wantsToActivate", - "hitTestForRect:inCellFrame:ofView:", - "previewView:willLoadPreviewForDocumentURL:", - "createImageFromURL:", - "vertBlur16ROI:destRect:", - "showsFirstResponder", - NULL, - NULL, - "setNumberOfMajorTickMarks:", - "typeForContentsOfURL:error:", - "startOffset", - "makeKeyAndOrderFront:", - "_doUserSetAttributes:", - NULL, - "_setOwner:", - "_obtainPermanentIDsForObjects:withContext:error:", - "currentMode", - NULL, - "_setPasswordStrengthTitleToolTip:", - "expressionIsBasicKeypath:", - "_getCounterpart", - "_plugin", - "setRepeatCount:", - "_updateLastEditingAndFocusRingFrame", - NULL, - "_focusRingClipAncestor", - "pageIsLeftOfAPair:", - "initWithPredicate:", - NULL, - "cropRectWithoutZoom", - "nts_RemoveSubgroup:", - "willRemoveFromTableView:", - "_setOrderDependency:", - "_disableMovedPosting", - "controllerBarHeight", - "mergedSimilarMultiValuesIn:forProperty:changes:", - NULL, - "nodeDidAddToGraph:", - "localizesFormat", - "_recursiveGainedDescendantThatOverridesNeedsDisplay", - "pageSizeForPaper:", - "activeTimeLineIndices", - "displaysTooltips", - "recursiveContainsGroup:", - "dictionaryRepresentationOfPersonAtRow:resultsView:", - "selectNavPopupMenuItemWithName:type:", - "colorPanelWillEndModal:", - "cancelAllQueries", - "distributionValueForProperty:person:", - "_calculateTotalScaleForPrintingWithOperation:", - "setBgColor:", - "selectionRectRemoved:", - "setLenient:", - NULL, - "animatedGifsCache", - "_createNonExecutableFilterWithKernelFile:filterDescription:", - "_unaffixedMarkerTitle", - "selectLayer:extendSelection:", - "getMoreInput", - "updateThumbnailUsingQueue:pool:", - "_relativeStartingDayForDateOptionType:", - "paddingCharacter", - "beginSheet:modalForWindow:modalDelegate:didEndSelector:contextInfo:", - "_unpackKeyboardEventRef:", - "sizeOfTitlebarButtons", - "displayLayer:", - "initWithObject:animationGroup:", - "_performDragFromMouseDown:", - "_accessibilityCorrectlyParentedCells:", - "_NSNibObjectIDForUIItemIdentifier:", - "_hasRecordsOfType:", - "_itemLayoutChanged", - "stringByStandardizingPath", - NULL, - "keyPathsForValuesAffectingAppleUseCoreUI", - "_operatorsForAttributeType:", - "pathContentOfSymbolicLinkAtPath:", - "editedImageDidChanged", - "_noise1d:", - "handleCommandEvent:withReplyEvent:", - "_beginListeningForDeviceStatusChanges", - "setStyleFromArray:", - "horizBlur4ROI:destRect:", - NULL, - "isWindowLoaded", - "setIsOnRightHandSide:", - "canCreateDirectories", - "_DAVRequestProxyAuthentication:ISS_DAVRequest:requestURL:usingHttps:", - "_uninstallPending", - "_setSelectedCell:atRow:column:", - "drawWellInside:", - "_setTruncatesLastLine:", - NULL, - "_notifyOfUpdatedDisplayWithImage:", - NULL, - "_setNewPreferedColumnWidth:", - "_transactionWithRequest:synchronousFlag:delegate:", - "didCommandBySelector:client:", - "_displayIfNeeded", - "_setParent:", - "setInputCGImage:", - "documentClassForType:", - "performActionForAccessibleChildAtIndex:", - "_sizeDownIfPossible", - NULL, - "_changeMinColorPanelSizeByDelta:compareWithOldMinSize:oldMinSize:setWindowFrame:", - NULL, - "validateMipmapImage", - "imageNamed:ofType:inBundle:", - NULL, - NULL, - "availableBackups", - NULL, - "_mapNode:toEntityInModel:", - "_syncToChangedToolbar:toolbarReplacedAllItems:", - "accessibilityCharacterRangeForLineNumber:", - "contentSizeForFrameSize:hasHorizontalScroller:hasVerticalScroller:borderType:", - "noteNumberOfRowsChanged", - "initWithUnsignedChar:", - "initImageCell:", - "showsProgressPanel", - NULL, - "_refreshAttributes", - NULL, - "setControlsFixed:forKeyFrame:inTimeLine:", - "_accessibilityMinValue", - "setOffset:", - "accessibilitySetMainAttribute:", - "_labelAlignment", - "_isHoveredPart:", - "_recalculateUsageForTextContainerAtIndex:", - NULL, - "dynamicToolTipStringAtPoint:trackingRect:", - "setCanGoBack:", - "insertColumn:withCells:", - NULL, - NULL, - "_invalidateDisplayIfNeeded", - "unhook", - "invalidateObjectValueInObject:", - NULL, - "encodingScheme", - "_versionIdentifiersAsArray", - "initWithObject:key:value:", - "_initWithWindow:", - "widthOfString:", - "setAllowsGroupSelection:", - "selectNextTabViewItem:", - "initWithAdapter:", - "outputImageProviderFromTextureWithPixelFormat:pixelsWide:pixelsHigh:name:flipped:releaseCallback:releaseContext:colorSpace:shouldColorMatch:", - "setAlternateImage:forSegment:", - "_handleApplyValueError:forBinding:canRecoverFromErrors:handleErrors:typeOfAlert:discardEditingCallback:otherCallback:callbackContextInfo:didRunAlert:", - "SCTColumnDividerColor", - "setDTDKind:", - "accessibilityChildren", - "_initWithContentsOfFile:error:", - "_forceResetTexturedWindowDragMargins", - "_computeResizeableCustomItemViewersInRange:", - "_carbonWindowRefChangedVisibilityTo:", - "functionWithName:", - "_zapResultArray", - "_shouldResetCursorRects", - "appendElementClassDeclarationToAETEData:", - "setDepth:", - "togglePreview:", - "_initWithSharedKitWindow:rect:", - "initWithContainerClassID:key:mutableCollectionGetter:proxyClass:", - "_handleAEOpenDocuments:", - NULL, - "_adjustRectForFocusRing:atRow:", - "goToPageNoPush:", - "displaysWhenScreenProfileChanges", - NULL, - "_invalidateBlinkTimer:", - NULL, - "_defaultValueForAllowsTypeSelect", - "domain", - "_selectedSliceIndices", - "resumeRenderingPatch:", - "setConditionallySetsHidden:", - "initWithKeyFrame:", - "setLabel:forSegment:", - "URLToURI:", - "selectDistinct", - "defaultShadowColor", - "_createHoverChangeAnimation", - NULL, - "conjunction", - "isMultiThreaded", - "_recursiveRecomputeToolTips", - "itemsPerRow", - "_resetIncrementalSearchOnFailure", - "textAttributesForNil", - "setNotifyOnSelectionChanged:", - "containsIndexesInRange:", - "rectOfRow:", - "setDrawDragBoundries:", - "pixelsHigh", - "addDocument:", - "switchToActualSize:", - "accessibilityIsModalAttributeSettable", - "isPressed", - "hasDynamicDepthLimit", - "_openOldCollections", - "size", - "backgroundIKImage", - NULL, - "_currentActivation", - "menuDelegateChanged", - "registerImageBufferConverterClass:priority:", - "parentGroups", - "_propertyForKey:", - "createPixelBufferForManager:withFormat:bounds:colorSpace:options:", - "setLayer:", - "_propagateDownNeedsDisplayInRect:", - "setAttribute:values:", - "setFileListOrderedByFileProperty:ascending:caseSensitive:", - "_connections", - "setImageFrameStyle:", - "_doSelectIndexes:byExtendingSelection:indexType:funnelThroughSingleIndexVersion:", - "mkpathRequestWithSession:URI:token:", - "spellServer:findMisspelledWordInString:language:wordCount:countOnly:", - "usesDataSource", - "_initWithImage:options::", - "canAdd", - "enqueueWithTarget:", - "parameterPorts", - "dictionaryRepresentationOfGroupAtRow:resultsView:", - "stringWithContentsOfFile:encoding:error:", - "textAttributesForZero", - "PDFViewOpenPDF:forRemoteGoToAction:", - "scriptingIsGreaterThanOrEqualTo:", - "pendingAttributes", - "setMessageType:", - "rangeOfCharacterFromSet:options:range:", - "attributesOfItemAtPath:error:", - "_updateOkButtonEnabledStateAndErrorMessage", - "_transformDstRect:clipRect:", - "addComponentByID:", - NULL, - "_sendDelegateDidMouseDownInHeader:", - "convertPointFromBase:", - "concat", - "_scriptingCoerceValue:forKey:", - "didHide", - "showcaseRect:window:", - "_scriptingObjectWithName:inValueForKey:", - "parser:didEndMappingPrefix:", - "unregisterClient:", - "_evenlySpacedRectForItemAtIndex:inBounds:", - "_initHTTPRequest", - "children", - "resignKeyWindow", - "_keyForLocalizedKeyDictionary", - "beginPrologueBBox:creationDate:createdBy:fonts:forWhom:pages:title:", - "setThousandSeparator:", - "voiceIdentifierForVoiceCreator:voiceID:", - "willChangeExpandedNodes", - "stop", - "releaseCGLContext:", - "connectToBackgroundLayer", - "_willCloseWindow:", - "_displayProfileChanged:", - "currentContextDrawingToScreen", - "engine", - "_taskBeginNotification:", - "_registerForWindowOrderNotifications:", - NULL, - "initWithMetadataManager:andForceRebuild:", - "_PFPlaceHolderSingleton", - "propertyTypesWithAddressBook:acquireLock:", - "gotoPreviousPage", - NULL, - "compositeToPoint:fromRect:operation:", - "initFromImage:rect:", - "_convertersCond", - "isExpansionToolTipVisible", - "defaultFocusRingType", - "jpegRepresentationOfItem:withUID:", - "_imageRepWithData:hfsFileType:extension:", - "_setMinimizeOnDoubleClick", - "uniqueNewCollectionName", - "drawThumbnailIndex:inRect:thumbSize:forFont:attributes:", - "indexOfItemWithTag:", - "sharedColorPanel", - "_imagesWithData:zone:", - "_optionsForShowingAsSheet:", - "accessibilityMenuFormRepresentationHasSubmenuWithItems", - NULL, - "_characterRangeCurrentlyInAndAfterContainer:", - "_scriptingIndexOfObjectWithUniqueID:inValueForKey:", - "_setUnprocessedInsertion:", - "_itemRemovalCompleted:", - "developmentLocalization", - "tableView:didChangeToSortDescriptors:", - "_takeFocus", - "_generateMulticlauseStringInContext:", - "validateUserInterfaceItem:", - "_createdDate", - "setDrawsShadows:", - "isKindOfClassNamed:", - "dstDraggingMovedToPoint:draggingInfo:", - "_registerObject:withID:", - "isRuleGrouping", - "isSelected", - "idling", - "actionCell", - "deleteRule", - NULL, - "element:hasOverriddenAttribute:", - "setServer:", - "_setNotes:", - "CIImageRepresentation", - "handleRequest:sequence:", - NULL, - "wipeMetaDataDirectory", - "_retainTrackingTag:", - NULL, - "setRecordDelegate:", - "_trackMenuSelection", - "enlargedBounds:withPoints:", - "initWithBitmapDataPlanes:pixelsWide:pixelsHigh:bitsPerSample:samplesPerPixel:hasAlpha:isPlanar:colorSpaceName:bytesPerRow:bitsPerPixel:", - "getNodeAsResolvedNode:", - NULL, - "thumbnailAtPoint:", - "_alternateDown::::", - "createCommandInstanceWithZone:", - "prepareChildsToDie", - "isSupportedOnContext:", - "_persistentStoreForIdentifier:", - NULL, - "fetchIndex", - "_sizeToFitView:", - "_hasPublicUsername", - "favoriteAttributesNames", - "indexPathWithIndex:", - "parseSeparatorEqualTo:", - "setRowForUpdate:", - "_zoomButtonOrigin", - "_availableBindingsWithFontBindingsFiltered:", - "keyCount", - "setAutostarts:", - "_singleValueForKeyPath:operationType:", - "setHidesOnDeactivate:", - "sharedApplication", - "_crlSigningUsage", - "threadPoolWithMaximumThreadCount:", - "contentPlacementTag", - NULL, - "_setState:forPorts:", - "modelByMergingModels:forStoreMetadata:", - "_forSRSpeechObject:setObject:forProperty:usingDataSize:", - "canAddChild", - "tryLock", - "setParsesCocoaElements:", - "getFiltersInCategory:", - "setTag:forSegment:", - "recordToManyInsertsForObject:withOperation:", - "_performToggleToolbarShown:", - "deactivateForDocumentAtIndex:usingTransitionImage:atFrame:", - "isImpossibleCondition", - "homePageFieldPresent", - "insertRulers", - "reverseObjectEnumerator", - "_assignObjectIds", - "_listClassForListRange:", - "newBatchRowAllocation:count:forSQLEntity:withOwnedObjectIDs:andTimestamp:", - "imageDimsWhenDisabled", - "_vCardKeyForAddressLabel:vCard3:", - "isFilePropertyDisplayed:", - "arrangeObjects:", - "_setExtendedKUECodeSigningApple:", - "markShadowDirtyRect", - "currentAnalysisDidCreateNewWindow:", - "frameLength", - "_rangeOfSuffixFittingWidth:withAttributes:", - "_midnightPassed", - NULL, - "_initWithCGSRegion:", - NULL, - "auxiliaryTextField", - "selectAllItems", - "_addToLibxml2TreeRepresentationWithDoc:dtd:context:", - "_bindingInfos", - "dateByNormalizingToGMT:", - "_updateLayerAnchorPointForFlippedSuperview", - "initMultiStatusRequestWithURL:method:responseClass:", - "_saveImageDataToDisk:", - "accessibilitySetValue:forAttribute:", - "resetPDFTooltips", - NULL, - "useOptimizedDrawing:", - "wantsToDelayTextChangeNotifications", - "initWithInfos:", - "setBacking:releaseCallback:releaseInfo:", - "becomeKeyWindow", - "indexFoundMatches:done:", - "prependTransform:", - "drawMenuItemBackgroundWithHighlight:inRect:withClipRect:", - "_rectangularCharacterRangesForGlyphRange:from:to:granularity:", - "initWithXMLNode:objectID:", - "_loadConfigPanel:", - "_selectNameFieldContentsExcludingExtension", - "_scrollPoint:fromLayer:", - "stringForRange:", - "_setWords:inDictionary:", - "contactIndex", - "commandDisplay", - "createCGImage:fromRect:", - "initWithWindow:withParent:", - "_beginToolbarEditingMode", - NULL, - "setDatePickerMode:", - "valueTransformerForName:", - NULL, - "parseABUID", - "_descriptorByTranslatingDictionary:ofType:inSuite:", - "setTruncatesLastVisibleLine:", - "scriptingProperties", - "_filterList", - "_setValueWithSelector:", - "_doDelayedAutocomplete", - NULL, - "_hasSelectedColumn", - "toggleBaseWritingDirection:", - NULL, - "updatePatchWithDefaultValues", - "menuHasKeyEquivalent:forEvent:", - "willRead", - "_vCardKeyForEmailLabel:", - "deserializePListValueIn:key:length:", - "_nonNilArrayValueWithSelector:", - "timeStringFromTimeInterval:longForm:", - "_scheduleChangeNotification", - "_willPresentSavingError:forOperation:url:type:overwriteRetryingInfo:", - "_saveLayout", - "_forceInsertItem:atIndex:", - "_drawGlyphsForGlyphRange:atPoint:parameters:", - "initWithFilterInfo:owner:", - "color", - "setShowsProgressPanel:", - "initWithString:", - "_clearOriginalSnapshotAndInitializeRec:", - NULL, - "fixAddressRulersInRange:", - "_diskCacheCreateLRUList:", - "displayRectIgnoringOpacity:inContext:", - "_eventWithCGSEvent:", - "searchBase", - "setRawFormat:", - "copyPolicyForOid:", - "_setPurgeable:resourceAtIndex:", - "_currentInputFilepath", - "_openPageInDefaultBrowser:", - "iconName", - "extractYear:yearlessDate:fromDate:", - "_unlockFirstResponder", - "layoutDocumentView", - "_dateUnitMultiplierForSearchDateSpan:", - NULL, - "clearAttributesCache", - "tryLockForWriting", - NULL, - NULL, - "_shouldDrawBezel", - "sharedSupportPath", - "setupViewWithOptions:modal:", - NULL, - "startSpinning", - "isPaged", - "setTime:forKeyFrame:controlType:inTimeLine:", - NULL, - "clearGlyphCache", - "setFrame:animate:fromLayout:toLayout:paneWidths:numberOfPanes:", - NULL, - "terminateForClient:", - "_drawContinuousCapacityWithFrame:inView:", - "_saveInitialMenuPosition", - "importVisibleCellsPriority", - NULL, - "_defaultButtonTitle", - NULL, - "setMembersSubrowDelegate:", - "cacheManager", - "_updateParagraphStyleCache:", - "selectionContainsSwappedNameEntries", - "maximumRecents", - "setTitleWithRepresentedFilename:", - NULL, - "_rangesForMultipleTextSelectionPasteAtIndex:fromPasteboard:", - "drawImage:atPoint:fromRect:", - "_evaluateTrust", - "pathComponentCellAtPoint:withFrame:inView:", - "trackMouse:forAnnotation:", - "orderWindow:relativeTo:", - "_simpleDescription", - "floatForKey:", - "_accessibilityUIElementPath", - "didFinishColumnScrollWithHelper:", - "isWindow", - "fadeHUDOut", - "selectionZoomRect", - "insertsNullPlaceholder", - "_rangesForUserBaseWritingDirectionChange", - "_indicatorImage", - "setPhoneString:", - "setAction:", - NULL, - "_createAndPostChangeNotification:withDeletions:withUpdates:withRefreshes:", - "searchFieldCellOrControlDidClearRecents:", - "_keyViewPrecedingAccesoryView", - "itemWithTag:", - "imageByCompositingOverImage:", - NULL, - "hideButton:", - "outlineColumnGroupForRow:tableColumn:", - "_canDrawOnBackgroundThread", - "_doOrderWindow:relativeTo:findKey:forCounter:force:", - "numberOfSlideshowItems", - "logError:", - "setNegativeFormat:", - "_isWord:inDictionary:", - "masksToBounds", - "beginSetup", - "setThreadArgument:", - "setPrimitiveModificationDateYear:", - "_DAVRequestAddAuthentication:ISS_DAVRequest:requestURL:", - "labelFont", - NULL, - "_stepperCell", - "_setupButtons", - NULL, - "drawRoundedRect:radius:strokeColor:fillColor:lineWidth:", - "drawWithFrame:inView:characterIndex:", - "_markerTitle", - "isBeginMark", - "_modifySelectionIndexes:atIndex:addOrRemove:sendObserverNotifications:", - "sharedAVManager", - "_attributedStringForEditing", - "slideshowItemAtIndex:", - "synchronizeWindowTitleWithDocumentName", - NULL, - "launchAppWithBundleIdentifier:options:additionalEventParamDescriptor:launchIdentifier:", - "classNamed:", - "_layerTreeDescription", - "sharedCompositionRepository:", - "_resetEvaluationErrorNumber", - "CA_copyRenderValue", - "printerFont", - "_fetchOrderedByFileProperty:orderedAscending:", - "_launchOneThread", - "_endSessionUpdates", - "_titleCellHeight:", - "initWithLength:", - "setSubmenu:forItem:", - "updateGridSize", - "frameRectForContentRect:styleMask:", - "initUnlockWithSession:path:lockToken:", - "error", - "resetMeasurements:forResolutionData:withWidth:height:onlyIntegerSizes:", - "objectSpecifierWithDescriptor:", - "freeSerialized:length:", - "setUsesFontLeading:", - "timer:", - "loadSamplePDF", - "_processLibXML2TextNode:content:", - "defaultTitleFont", - "setCriteriaSlices:anyAttributeString:", - "pixelFormatCMYK16", - "loadPanelNamed:", - "stringDrawingTextStorage", - NULL, - "_configureStreamDetails:", - "fileGroupOwnerAccountName", - "colorUsingColorSpaceName:", - "setCount:", - "_lastEventRecordTime", - "setExpanded:", - "_dosetTitle:andDefeatWrap:", - "_setInitialFirstResponder:autoGenerated:", - "_stringByTranslatingFSSpecDescriptor:toType:inSuite:", - NULL, - "_loadAndRestoreCurrentBrowsingNodePath:selectedNodes:", - "RTFD", - "computeButton", - "_drawFrameRects:", - "_nominalCharacterCoverage", - "ISS__ay_performSelector:withObject:inThread:", - "setErrorProc:", - "_stringForEditing", - "titleCell", - "session", - NULL, - "_disposeSurface", - "openDocumentWithContentsOfFile:display:", - "_loadQTKit", - "panelType", - "_shouldOpenInlinePreview", - "_incrementBy:startingAtIndex:", - "periodicFlushRoutine:", - "drawRubberBandWithClipRect:", - "selectItemWithTag:", - "localName", - NULL, - "setHardInvalidation:forGlyphRange:", - "_setupUI:", - "_oldValueForKey:", - "encodeVersionWithCoder:", - "isCancelled", - "big:", - "_makeModalWindowsPerform:", - NULL, - "windowBackgroundColor", - "sessionIsReadyToBuildAndRunGraph:", - "setPrimitiveFirstName:", - "stopTextTimer", - "setProfileView:", - "initWithInstanceInfo:renderingMode:", - "scannerWithString:", - NULL, - "appendBezierPathWithArcWithCenter:radius:startAngle:endAngle:", - NULL, - "_resetOpacity:andForceSetColor:", - "isConnected", - "objectAtIndex:effectiveRange:runIndex:", - "contentSeparatorColor", - "endPage", - "drawNoteIcon:inContext:", - "attributesWithIdentifier:", - "mouseDownOutsideSelection:", - "installQLViewFromDataSource:", - "createNSBitmapImageRepForManager:withOptions:", - "resortCachedChildren", - NULL, - NULL, - "_sideMargin", - "setInitialDirectory:", - "_scaleImageSize:toFitInSize:", - "pathForSoundResource:", - "setControlsView:", - "drawDebugSchedulePriorityRanges", - "namesOfPromisedFilesDroppedAtDestination:", - "_enumeratedPredicateBindings:", - "addUniqueIdsMissingFromSet:toArray:forClass:prefetch:inAddressBook:", - "keychainSyncList", - "isRectVisible:onPage:", - "insertGlyphs:", - "capabilityMask", - "initWithContainerClassID:key:ivar:", - "setRowTemplates:", - "addressBookMetaKitDatabaseFileName", - "_uniqueNameOfChild:", - "_commitEditingOtherCallback:", - "_needsRecalc", - "mouseDownOnCharacterIndex:atCoordinate:withModifier:client:", - NULL, - "_inputExtent", - "sendWillSendRequest:redirectResponse:", - "isTrustDisplayed", - "tileSize", - "targetOrigin", - "extraTextRectForBounds:", - "duplicatesForPeople:", - "_attributedStringForDrawing", - "setItem:", - "cachedHandleForURL:", - "certificateView", - "findPanel:", - "compressionOptionsWithDescription:", - "allKeysForObject:", - "view:willDisplayImage:", - "_doFirstPassForMapping:error:", - "_surfaceBounds", - "appendPropertyDeclarationsToAETEData:", - "updateOptionsWithVersion:", - "_hiddenExtension", - "configDataChangedSince:", - "_objectsPointer", - "getKeys:values:", - "setUserFont:", - "_enumeratedHiddenBindings:", - "predicateWithSubstitutionVariables:", - NULL, - "propertyListFromData:mutabilityOption:format:errorDescription:", - "setSpeechFinishedSuccessfully:", - NULL, - "foreignKeyForSlot:", - "addSelectionNoNormalize:", - "_shiftLeft:", - "accessibilityEncodeOverriddenAttributes:", - "setDisplayName:", - "_branchImageRectForBounds:", - "numberWithInt:", - "_computeDefaultMenuFormRepresentation", - "_valueForBindingWithoutResolve:mode:", - "illegalCharacterSet", - NULL, - "setTransactionDelegate:", - "freePageViewBounds", - NULL, - "_dimpleDoubleClicked:event:", - NULL, - "_isModal", - "gutterWidth", - "_labelForColorPicker:", - "ruleEditor:numberOfChildrenForCriterion:withRowType:", - "_specifierTestFromDescriptor:", - "stopPDFViewAnimation", - "undoRedo:", - "setShowsHiddenFiles:", - "_refreshSuspendedAttribute", - "attributeForKey:", - "_bezelTopPadding", - "_createStaticTextFieldWithStringValue:", - "_shouldStartTaskNamed:", - "saveCache", - "markViewedForRecordWithUniqueId:tryAgain:", - "removeRequestMode:", - "_moveLeftWithEvent:", - "_setFrameSavedUsingTitle:", - "isScalarProperty", - "numberOfItemsInMenu:", - "fileHandleWithStandardOutput", - "_criteriaDictionary", - "_writeAutosaveRecords", - "initWithRemoteLocation:addressBook:", - "willPopUpNotification:", - "imageFrameCount", - "textTimerFired:", - "setZoomRate:", - "_minYBorderRect", - "validModesForFontPanel:", - "mouseUp:inView:", - "_hasRetainedStoreResources", - "isNSArray__", - "_interpolationFunctionRefWithCallbacks:", - "recacheColor", - "editSmartGroup:", - "localizedCaseInsensitiveCompare:", - "persistence", - "_flipStateOfCellsInIndexSet:toState:", - "wrapCardRollOverAroundRects:count:", - NULL, - NULL, - "_hiddenOnLaunch", - "addContentObject:isPlaceholder:insertsNullPlaceholder:value:index:cellOrControl:", - "internalSaveTo:removeBackup:errorHandler:", - "selectedGroups", - "setSubCacheSizeIndex:", - "initWithURL:cachePolicy:timeoutInterval:", - "setDefaultBorderColor:", - "_getRow:column:nearPoint:", - "_dragCompletionTargets", - NULL, - "toManyRelationshipKeys", - "intAttribute:forGlyphAtIndex:", - "_handleKeyDown:inNode:", - NULL, - "_enabledStateWithMode:", - "initWithAdapterOperator:correlation:", - "_multipleValueForKey:atIndexPath:", - "_imagesFromIcon:inApp:zone:", - "selectTextAtRow:column:", - "_expandedNodesForObservedNode:", - "createDragProgressWindow:forRow:", - "cellIndexAtDocumentPosition:", - "selectionMechanismWasDismissed:", - "matrixInColumn:", - "formatString", - "maxBounds", - "_setupUI", - "setTexture:", - "setColumnAlias:", - "snapRotation:", - "_cancelPerformSelectors", - "accessibilitySetVisibleCharacterRangeAttribute:", - "_keyBindingManager", - "dictionaryWithObjects:forKeys:count:", - "encodeWithCoder:colorSpaceCode:", - "standardContentBorderThicknessForEdge:borderSize:styleMask:", - "minContentSizeForMinFrameSize:styleMask:", - "_setAllowsNonVisibleCellsToBecomeFirstResponder:", - "_performKeyEquivalent:", - "groupsController:outlineView:heightOfRowByItem:", - "initWithKey:ascending:selector:", - "tokenAttachment:doubleClickedInRect:ofView:atCharacterIndex:", - "pathNamesForRecords:singleCard:dataForAllRecords:", - "compositionPickerView:draggingEnteredComposition:sender:", - "_expand", - "_initUnlockForToken:", - "_finalScrollingOffsetFromEdge", - "newWithKey:object:", - "wasUpdated", - "createServerPortIfNeeded", - NULL, - "createImageFromCGImage:", - "typingAttributes", - "abStringByRemovingDotMac", - "IKIPSliderMouseUp:", - "_toggleInlineSlideshow", - "comboBoxCell:completedString:", - "_defaultIndicatorImage", - "_updateDrawsNothing", - "_markerPrefix", - "setSupportsDragAndDrop:", - "_document:didSave:contextInfo:", - "removeItemForTableView:pasteboard:operation:", - "fileManager:shouldProceedAfterError:", - "convertRect:fromPage:", - "data1", - "tellDelegateAboutJobResult:", - "previewView:willShowPreviewForURL:", - "_debug", - "popBundleForImageSearch", - "nextSibling", - "_errorWithCode:", - "variables", - "value", - "pixelFormatARGB8", - "stepForward:", - "toggleFontPanelShown:", - "inverseColumnName", - "isToMany", - "untrashedLeafFileLocationComponentWithLocator:", - "columnResizingType", - NULL, - "_hasFocusRing", - "setArguments:", - "formatterOfObject:", - "setImagingModeForcedToSharedSurface:", - "_copyImage", - "_swapToolbarItemViewerAfterView:", - "nts_Me", - "_initWithName:type:", - "rendererVersion", - NULL, - "_outputPorts", - "canSupportMinAndMaxForObject:", - NULL, - "magentaColor", - "startObservingPreviewNode:", - "_isOnePieceTitleAndToolbar", - "imageRepresentation", - "initWithColumnName:sqlType:", - "_web_removeFileOnlyAtPath:", - NULL, - "previewPanel:shouldOpenURL:", - "_latin1MappingTableWithPlatformFont:hasKernPair:", - "searchList", - "_willSelectComposition:", - "joinSemantic", - "_attributesToHighlightStyle:", - "setCurrentSession:", - "_isPoint:inDragZoneOfRow:", - "sendSuperEvent:", - "undoManagerForTextView:", - "copyLink:", - NULL, - "enterDisplayOperationForWindow:windowRegion:", - "_writeStringInRanges:toPasteboard:", - "_loadSuitesForJustLoadedBundle:", - "setControllerType:", - "_highlightColorForCell:", - "initWithName:stringValue:", - NULL, - "setFillColor:", - "displayIfNeeded", - "allElementsForDeviceID:", - "identity", - "_hasAnyObservers", - NULL, - "_tempHide:relWin:", - "setLastRenderedMipmapItem:", - "_bestSettingSimilarToSetting:exactMatch:", - "maxValue", - "_drawOverflowHeaderInRect:", - "timeModeWithIdentifier:", - NULL, - "setForeignEntityKeySlot:unsigned:", - "setKeyCell:", - "setMIMEType:", - "notANumberSymbol", - "_originalRowForUpdate:", - "setAllowsDirectoriesSearches:", - "nextEventForWindow:", - "_setDocumentViewAlignment:", - "_borderType", - "noteNumberOfItemsChanged", - "restoreParameter:from:", - "_updatePathLocationControl", - "propertyChanged:", - "_sizeToFitColumn:withSizeToFitType:", - "drawOverlays", - "_switchViewForToolbarItem:", - "nts_MemberUID", - "compositingOperation", - NULL, - "_parserableDateDescription:", - "itemIdentifier", - NULL, - "initWithGLContext:pixelFormat:vtable:options:", - "_executeAppleEvent:withMode:error:", - "browserDidScroll:", - "unregisterThread", - "tile", - "titleRectForBounds:", - "_createAttributeNameMapping", - "applyDecisions", - "selectedKnobColor", - "requiredMinSize", - "createAnnotationWithEvent:", - "pixelFormatRGBX8", - "sleepForTimeInterval:", - "updateIPhotoButtonWithAdded:", - NULL, - "_refreshInputSourceAttributesFromCallback", - "_removeConnectionFromOutput:", - "_setMenuOwner:", - "_sendDelegateWillDisplayCell:forColumn:row:", - "learnWord:", - "_registerProtocols", - NULL, - NULL, - "selectedCellInColumn:", - "initWithFormat:locale:", - "_drawDropHighlightOffScreenIndicatorPointingUp:atOffset:", - "setPathComponentCells:", - "startingRow", - "_provideNewViewFor:initialViewRequest:", - "arrayGrow:", - "_evilHackToClearlastLeftHitInWindow", - "encodePortObject:", - "_setUpLayerTreeSurface", - "imageWithNSImage:", - "_invalidateCursorRects", - "_willHideDisplayableView:", - NULL, - "rotation", - "deserializeBytes:length:atCursor:", - "_bezelTopOffset", - "_wantsPastedFiles:", - "URLProtocol:didCancelAuthenticationChallenge:", - "currentRunLoop", - "_conformsToProtocolNamed:", - "_surfaceWillGoAway:", - "atLeastOneMipmapItemIsValid", - "endSpecifier", - "setModifiedSmartGroup:", - "_setKeyboardFocusRingNeedsDisplayDuringLiveResize", - "removeExtraBackupsForInterval:endingOn:andUpdateList:", - "_maxYBorderRect", - "modifyFont:", - "startDraggingWithEvent:", - NULL, - "cookies", - "_glyphAdvancementCache:", - "setDateValue:", - NULL, - "dataFromRange:documentAttributes:error:", - "associatedViewFor:", - "_setCurrentListNumber:", - "drawSwatchInRect:", - NULL, - "sendBeforeTime:sendReplyPort:", - "objectsByEvaluatingSpecifier", - "_endEditingIfNecessaryWhenDeselectingRowRange:", - "_updateAutomaticRearrangementKeysPaths", - "notPredicateWithSubpredicate:", - "_setSurfaceBackedOpenGLContext:", - "CGSRegion", - "setTopColor:", - "mediaRetained", - "_unlockfeContext", - "_setUninstallPending:", - "removeThumbnail:", - "inputNeutralTemperature", - "writeKern:", - "PICTRepresentation", - "defaultAddressBookPreferencesFile", - "_setError:", - "abContainsCaseInsensitiveString:", - NULL, - "_findButtonImageForState:", - "_selectRow:", - "_format:withDigits:", - "allCustomPropertyValuesWithCustomProperty:", - "parentOperation", - "dataSourceRespondsToRequiredMethods:", - "setBuffer:", - "_setDoublePage:", - "decimalValue", - "_popUpMenu", - "setValidateSize:", - "setValue:forBinding:error:", - "direction", - "mounted:", - "argumentDescriptionFromName:implDeclaration:presoDeclaration:suiteName:commandName:", - "imageCropView:willReceiveDraggedImage:", - "imageIsImported", - "initWithPreviewView:", - "_processLibXML2TitleNode:", - "device", - "imageProxy", - NULL, - "_owningPopUp", - "initWithOperatorType:", - "replaceString:withString:range:options:inView:replacementRange:", - "setSelectionGranularity:", - "writeEscapedUTF8String:", - NULL, - "hasEditedDocuments", - "removeColumn:", - "_openExtrasPopup:", - "registerFilters", - "destinationModel", - "setOptimizableColumn:", - "_screenChanged:", - "indexSetWithIndex:", - "_hideControlsPanel", - "_registeredForChildNotifications", - "takeDoubleValueFrom:", - "_uninstallTrackingArea:", - NULL, - "imageWithImageProxy:", - "completionDelay", - "initWithRenderingContext:patch:", - "_newFirstResponderAfterResigning", - "_shouldUseTexturedAppearanceForSegmentedCellInView:", - NULL, - "wordList", - "setCurrentPage:", - "charactersIgnoringModifiers", - "abort", - "updateSearchHilightWithSearchString:", - "_endTableCellDefinition", - "_fastCStringContents:", - NULL, - "initMultiStatusRequestWithSession:method:path:responseClass:", - "_setAttributedString:", - "_previewPanel", - "stringWithFileSystemRepresentation:length:", - "canChooseNode:", - "setOpenGLLock:", - "_delegateRespondsTo_nextTypeSelectMatchFromRow", - "_drawTitlesForView:inRect:", - NULL, - NULL, - "_isTrackingAreaObject:", - "contentAtIndex:", - "restoreCachedImage", - "processImage:context:", - "buildPropertyDict:", - "fileWrappers", - NULL, - "componentsSeparatedByString:", - "_initLocks", - "_sizeTableColumnsToFitWithStyle:forceExactFitIfPossible:", - "_latin1MappingTable:", - NULL, - "nts_IsSubscribed", - NULL, - "resetDocumentState", - "markerWithRulerMarker:parent:", - "notifyDataIsReady", - "lastRequestMessage", - "setControlSize:", - "characterSetWithCharactersInString:", - "_registerInstance", - "encodingVersion", - "setConfigurationFromDictionary:", - "initWithEntity:propertyDescription:virtualForToMany:", - NULL, - "fileAttributes", - "CA_stringByStandardizingPath:", - "_loadMetadataFromDocument:", - "setTimeZone:", - "_setupSurfaceAndStartSpinning:", - "_constrainDateValue:timeInterval:", - "_ql_enclosingPreviewView", - "_cocoaErrorStringWithKind:", - "setInitialized:", - "vectorWithX:Y:Z:", - "setOldPassphrase:", - "hasChanges", - "setConstrainedFrameSize:", - "setAttributeSlotNoRetain:withObject:", - "GFSetEnumerator", - "_registeredDeviceClassNames", - "showPasswordAssistantPanel:", - "writeData:", - "stopNote", - "_tryDAVLock", - NULL, - "containsMetaDataCacheCards:", - "orderFrontColorPanel:", - "clearCustomPropertyCaches", - NULL, - "dateFromISO8601String:", - "_orderFrontModalWindow:relativeToWindow:", - "nts_ClearCachedRecordsForUniqueIds:", - "proxyDied:", - "_toggleLogging", - "blueComponent", - "_sessionDidResignActive", - "_setCSRData:", - "autosaveDocumentWithDelegate:didAutosaveSelector:contextInfo:", - NULL, - "createPixelBufferForManager:withFormat:transformation:bounds:colorSpace:options:", - "encodeObject:forKey:", - "setShowsLockButton:", - "_stashCollapsedOrigin:", - "_generateIDWithSuperEntity:nextID:", - "initWithEntryNames:contents:properties:options:", - "_adjustScroller:withDocumentLength:withViewLength:offset:", - "_chosenSpellServer:launchIfNecessary:", - "setUpdatedObjects:", - NULL, - "openDrawers", - "maximumFractionDigits", - "_didShowDisplayableView:", - "_isEditing", - "defaultTextColor", - "previewPanel:willLoadPreviewForURL:", - "recentDocumentURLs", - "registerImageBrowserTasks", - "_mouseDownListmode:", - "_web_localizedDescription", - "alpha", - "__saveSelection:context:", - "setActive:forTimeLine:extendSelection:", - "_positionLabels", - "attachToolbarToColorPanel:", - NULL, - "outlineColumn:willDisplayOutlineCell:row:", - NULL, - "defaultImageOrientation", - "opaqueAncestor", - "_freeCacheStepWithVisibleIndexes:blackList:", - "canAddConnectionForMediaType:", - "importVCardFiles:intoGroup:", - "getIDRefStringForValue:ofRelationship:objectForError:", - "_layerTreeRendererSurfaceGone", - "setDataRefType:", - "fullBounds", - "_searchFieldAction:", - "_calendarDateComponentsForPoint:inCalendarRect:", - "_forceAppendItem:", - "hashTableWithWeakObjects", - "openButton:", - "nodeAtIndexPath:", - "arrowsPosition", - "_drawingEndSeparator", - "_setKind:", - "shutAllDrawers:", - "initWithCurrentBrowsingNodePath:fileListMode:", - "_applyHTTPCredentials:", - "setShowsContentSeparator:forEdge:", - "stringsFromSelectionExpanding:", - "_sliceBottomBorderColor", - NULL, - "setWindowSharingType:", - "dragAnimationComplete:toRow:", - "setProperty:comparison:value:", - "thumbnailWithMaximumSize:", - "_contentHasShadow", - "string", - "_doOptimizedLayoutStartingAtGlyphIndex:forSoftLayoutHole:inTextContainer:lineLimit:nextGlyphIndex:", - "setDownCaption:", - "URLProtocol:didReceiveResponse:cacheStoragePolicy:", - "separatorItemIdentifier", - "windowFrameAutosaveName", - "initWithICCProfileData:", - "drawInRect:inContext:", - "IK_JPEGRepresentationWithCompressionFactor:", - NULL, - "initListDescriptor", - "indexForPage:", - "setNodeManager:", - "_revertDocument", - NULL, - "receiveDataWithTimeOut:", - "_doThirdPassForMapping:error:", - "memberOfTitle:", - "unionSet:", - "_breakConnectionOfTableBinderIfAutoCreated:", - "horizontalBoxInitROI:destRect:userInfo:", - "convertRect:fromView:", - "_undoDeletions:", - "skipParameter", - "_layoutOrdersForChoiceRootedAtItem:inRow:", - "isEqualToHashTable:", - "targetForSelector:", - "setDatabaseVersion:", - "moduleCanBeRemoved", - "gotoEnd:", - "_requestorInResponderChainForServiceDictionary:sendTypes:returnTypes:", - "_computeThumbnailImageInSubthreadFor:", - "_updateStatsForResourceAtIndex:", - NULL, - "toggleLoops:", - "setNumberOfItemsPerRow:", - "_shouldDrawTextWithDisabledAppearance", - "_shouldTypeSelectForEvent:", - "_sizeForNode:", - "isUpdated", - "nameOfGlyph:", - "_toolbarPillButtonClicked:", - "tableView:clickedOnSubrow:ofRow:", - "setWithObjects:", - "IKStoreTemporaryIntValue:", - "transparencyROI:forRect:", - "initWithDocument:", - "_setPM:", - "_registerCacheNode:", - "stringValue", - "_checkLoaded", - "initWithAttributes:", - "setAttributedStringValue:", - "imageProviderClasses", - "_antialiased", - "pathNamesForRecords:singleCard:", - "preloadThread", - "stringByConvertingURLToPath", - "_addRepsFrom:toRep:", - "__oldnf_componentsSeparatedBySet:", - "_viewDidEndLiveResize_handleRowHeaderSurfaces", - "_generateHTML", - "connectionWithSourceObject:sourceKey:targetObject:targetKey:userInfo:", - "_createIconViewDelegate", - "setReleasesAfterPoofing:", - "ignoreOpenAndClose", - "orientationTag", - "_computeThumbnail:", - "_doPositionDrawerAndSize:parentFrame:stashSize:", - NULL, - "setCurrentSearch:", - "_hasSeparateArrows", - "connection:didReceiveData:", - "columnWithIdentifier:", - "provideViewForUIConfiguration:excludedKeys:", - "postalAddresses", - "_closeBlocksForParagraphStyle:atIndex:inString:", - NULL, - "_writeRTFDInRange:toPasteboard:", - "_scriptingObjectWithUniqueID:inValueForKey:", - "removeTooltip", - "_versionNumber", - "enumeratorWithSet:", - NULL, - "hasBitmapRepresentation", - "echosBullets", - "_ensureTableCells", - "_setGenericValue:forKey:withIndex:flags:", - "_scriptingDescriptorOfComplexType:orReasonWhyNot:", - "updateSingleValue:forProperty:changes:", - "allowsCursorRectsWhenInactive", - "clearCachedStatements", - "nts_AddressBookWithDatabaseDirectory:", - "insertionRect", - "setExpandedView:", - "relayoutPicker", - "setRemoteRoot:", - "containsValueForKey:", - "pickerLayoutState", - "zoomOnSelectedLayerLayout:", - "cancelPreviousPerformRequestsWithTarget:", - "setAllowsOtherFileTypes:", - "setContextHelpModeActive:", - "suspended", - "thumbnailOfSize:", - "_allProperties", - "_sizeOfNSImage:", - "tryNewColorListNameSheetDidEnd:returnCode:context:", - "nextBase64Line:", - NULL, - "host", - NULL, - "_imageWithProgrammaticEffectsWithBaseName:state:backgroundStyle:", - "removeObjectAtIndex:forDatabaseKey:", - "selectedColumnIndexes", - "dictionaryWithContentsOfFile:", - "_addEntity:", - "setButtonType:", - "_portForPoint:inNode:bounds:outBounds:", - NULL, - "URLHandleResourceDidCancelLoading:", - "_secProtocolForProtectionSpace:", - "nts_SetValue:forProperty:recordCouldBeInDatabase:record:", - "initWithDataRefData:type:", - "alternateSelectedControlColor", - NULL, - "releaseCGPathArray", - "addRecord:toArray:", - "_clearDependenciesWithAllPeerBinders", - "defaultValueForKey:", - "invalidateLayoutForCharacterRange:isSoft:actualCharacterRange:", - "nts_RemoveMember:", - NULL, - "setColor:forAttribute:", - "addressAsString", - "_isSheetOnWindowWithWindowNumber:", - "_synchronizeTitlesAndColumnsViewWidth", - "_trimRecentSearchList", - "cursorUpdate:", - "_compositeFlipped:atPoint:fromRect:operation:fraction:", - "compositionParameterView:didChangeParameterWithKey:", - "_localPointForEvent:inView:", - "stringValuesOfProperty:", - "_setupIdle", - "removeElementAtIndex:", - "initWithFloat:", - "_findItemWithAttributeName:inMenu:", - "drawBackground", - "_fontSetWithName:", - "setDefaultFontSize:", - "_matchesKeyEquivalent:modifierMask:", - "insertionIndex", - "previewPanel:didChangeDisplayStateForDocumentURL:", - "setCacheUsedByBitmapRep:", - "_switchToAppropriateModeForColorIfNecessary:", - "encodeInt64:forKey:", - "_setPathLength:", - "lifeRange", - NULL, - "_registerForToolbarNotifications:", - "_cache", - "_markerSuffix", - "setValue:forHTTPHeaderField:", - "initWithRecord:customProperty:", - "_selectInTabView:itemWithIdentifier:", - "_setNote:atIndex:", - "_descriptorOfType:withValue:orReasonWhyNot:", - "initWithDomain:code:userInfo:", - "recalcMaskForResolutionData:", - "_nodes", - "isComment:delimiter:", - "_indicatorFrameForCellFrame:inView:", - "setByAddingObjectsFromArray:", - "imageRepClassForType:", - "prepareWithInvocationTarget:", - "newMiniaturizeButton", - "_topContainerView", - NULL, - "stopAllModeObjectObserving", - "goesNext", - "cgBackgroundColor", - "_ejectButtonClicked:", - "setCustomValuesDictionary:", - "_lockInterval", - "initializeFiles", - "_fileLocator", - "removeUnbindedNode:domain:", - "gridGroupFromDictionary:oldGroups:", - NULL, - "_maxXResizeRect", - "setKeyEquivalentModifierMask:", - "_setManagedObjectModel:", - "popupViewForAnnotation:", - "closeOpenedWindow:", - "waitTillConversionIsDone", - "pixelBufferAttributes", - "_graphiteControlTintColor", - "_initFromRecord:", - "rangeOfUnit:startDate:interval:forDate:", - "_cleanupRendering", - "_parseData:", - "registerUndoOperation", - NULL, - NULL, - "createThumbnailFromPDFPage:", - "_diskCacheSync", - "_bottomContainerView", - "_findSystemImageNamed:", - "objectIsForcedForKey:inDomain:", - NULL, - "resetRamNodeCacheUsedCount:", - "showcaseMenu:andShiftFocus:", - "_getGlyphIndex:forWindowPoint:pinnedPoint:anchorPoint:useAnchorPoint:preferredTextView:partialFraction:", - NULL, - "panelShouldHaveExportToIPhotoButton", - "parentSpecifier", - "noteNewRecentDocumentURL:", - "imageManager", - NULL, - "initWithImage:", - "_fixGlyphInfo:inRange:", - "initInsertActionWithItem:withPriority:", - "openFile:withApplication:", - "_clearControlTintColor", - "_descStringForFont:", - "setGraphEditor:", - "setCacheUsedByJpegData:", - "addCellWithSettings:data:profile:", - "_setSuperentity:", - "_drawKeyboardFocusRingWithFrame:inView:", - "handleSetFrameCommonRedisplay", - "_popUpItemAction:", - "_setNeedsDisplayInRow:column:", - NULL, - "deleteOutputForKey:", - "updateClipView", - "setThreadResult:", - "_maxXWindowBorderWidth", - "fullMetadata", - "getMatrix:", - "setPreviousInDictionary:", - "timeForKeyFrame:controlType:inTimeLine:", - "initForPropFind", - "_selectTabWithDraggingInfo:", - "prepareSQLStatement:", - "_createFullscreenWindowWithFrame:", - "imageForRepresentationInstance:forCell:", - "shouldCacheFullSizeImage", - NULL, - "drawBezelGroup:", - "_sortingGroupCompare:", - "_asIconHasAlpha", - "_sortOrderAutoSaveNameWithPrefix", - "setHorizontalScroller:", - "getAttribute:allowBinary:", - "keyBindingManager", - NULL, - "_updateAutoscrollingStateWithTrackingViewPoint:event:", - "_setAutoreleaseDuringLiveResize:", - "_sizeHorizontallyToFitWidth:", - "_targetBindingBound", - "database", - "autoscroll:", - "frequencyArgument", - "_setMinSize:", - "continueWithoutCredentialForAuthenticationChallenge:", - "_statusItemIsDeallocing:", - "saveDocumentAs:", - "propertyValueWithKey:uniqueId:addressBook:preventFetching:", - "peoplePropertyTypes", - "registerUndoWithTarget:selector:object1:object2:", - NULL, - "createUniqueImageManagerForQCCGLContext:options:", - "_setInputBackgroundImage:", - "_scriptingObjectsAtIndexes:inValueForKey:", - "transactionSuccessful:", - "registerFilterName:", - "removeCharactersInString:", - "_superviewFrameChanged:", - "currentDocumentIndex", - "correlationTableName", - "showAttachmentCell:inRect:characterIndex:", - "columnTitleForProperty:", - "_drawForTransitionInWindow:usingPatternPhase:inRect:", - "willBeDisplayed", - "put::", - "_unzipRequestPostHandler:", - "_setupURIs:inCEGeneralNames:", - "decodeBytesWithReturnedLength:", - "continueSpeaking", - "_unionOfObjectsForKeyPath:", - "setStreet:", - "newCloseButton", - "canCrop", - "setFrame:display:animate:", - "iconURL", - "_typeDescription", - "_setErrorOffendingObjectDescriptor:", - "createPageFromImage:atIndex:", - "setManagedName:", - "_getData:encoding:", - "inputWhiteParams", - "maximizedMode", - NULL, - NULL, - "_createCachesAndOptimizeState", - "moveToBeginningOfLine:", - "imageUnfilteredPasteboardTypes", - "defaultQueue", - NULL, - "numberOfTabViewItems", - "_sendDidBeginMessage", - NULL, - NULL, - "iconView:nextTypeSelectMatchFromIndex:toIndex:forString:", - "initWithSourcePath:destinationPath:", - "_lastDraggedOrUpEventFollowing:", - "selectedInactiveColor", - "blurHorizontalPass7ROI:destRect:", - "_widthIsFlexible", - "_forgetData:", - "encodeValuesOfObjCTypes:", - "_colorAtIndex:", - "accessibilityOverflowButtonAttribute", - "removePages:", - "_deviceMoveToPoint:", - "goToDestinationNoPush:", - "ISS__ay_postNotificationName:object:inThread:beforeDate:", - "_addTrackingRects:owner:userDataList:assumeInsideList:trackingNums:count:", - "removeObjects:", - "orderSurface:relativeTo:", - "addAnnotationLayer:", - "initWithContentsOfFile:", - "initWithCString:encoding:", - "_setValue:forOutputPort:", - "SCTFixApplicationMenuString", - "enabledStateAtIndex:", - "_setAutoGeneratedInitialFirstResponder:", - "_itemRemoved:", - "_createTimer", - "__oldnf_removeInternalRedFromTextAttributesOfNegativeValues", - "_updateHighlightedItemWithTrackingViewPoint:event:", - "refreshLoadingProgressBar", - "proKitGrayBackgroundUsingTexture:", - "decodePoint", - NULL, - "_specifiedStyleForElement:", - NULL, - "_old_initWithCoder_NSColorWell:", - "setWantsNotificationForMarkedText:", - "_windowWillLoad", - "setUniqueId:", - "upperItem", - "recordAtIndex:", - "intParameterValue:", - "glyphIndexToBreakLineByClippingAtIndex:", - "drawBorder:", - "clickableContentRectForBounds:", - "_takedownTheater", - "minCount", - "scrollItemAtIndexToTop:", - "_setBaselineDelta:", - "shouldUseInvalidationForObject:", - "recentPicturesPopUpWithDefaultOptionsForRepository:withDelegate:", - "_resizeColumn:withEvent:", - "setAllowsMixedState:", - "newButtonAsPlus:atIndex:", - "writeStrikethroughStyle:", - "_userCanChangeSelection", - "_initWithDOMRange:", - "openDocumentWithContentsOfURL:display:", - "builtInProperties", - "providerRespondingToSelector:", - "handleTakeValue:forUnboundKey:", - "_markerSpecifier", - "removeObjectAtArrangedObjectIndex:", - "constrainFrameRect:toScreen:", - "setImageView:asDelegateFor:", - "_setUpTextField:", - "_dontShowMessageAgainTitle", - "createTableForEntity:", - "stopProxy", - "_finalizing", - "canWriteItem:", - "currentInputManager", - "tagForSegment:", - "backgroundLoadDidFailWithReason:", - "setClearsBackground:", - "pathNamesForRecords:singleCard:dataForAllRecords:inPath:", - "_updateCameraButton", - "_viewAboveAccessoryView", - "serializeData:", - "insertNewline:", - "sendDidReceiveResponse:", - "willAccessValueForKey:", - "verticalMotionCanBeginDrag", - NULL, - "_ignoreSpellingFromMenu:", - "saveDateValue:", - "populateIdentifiers:values:labels:primaryIdentifier:withDataFromRecord:customProperty:", - "numberOfColorComponents", - "createCIImageForManager:withOptions:", - "markerForItemNumber:", - "updateCellOrControl:forMaxValue:", - "_setIssuerHashOfPublicKey:", - "longLongValue", - "_invalidateFocusRingRect", - "setContentFilters:", - "openDocumentFormatData", - "deselectCell:", - "accessibilityVerticalScrollBarAttribute", - "declareContext:isSharedWith:", - "setFloatParameterValue:forResolution:to:", - "outlineView:shouldSelectTableColumn:", - "_updateLayer", - "_isCustomItemType", - "addVariationDescriptions:", - "selectionRectRemoved", - "setContainerSize:", - "analyzeCurrentGRL:", - "_appendNodes:forNodeInfo:addSeparator:", - NULL, - "allocateTextureForSize:glID:offset:", - "_setChosenIssuer:", - "drawSelectionOnTitle", - "initializeItem:", - "_itemsFromItemViewers:", - "_canonicalXMLStringPreservingComments:namespaceString:relationships:", - "outputKeys", - "setLegendHidden:", - "_writePersistentBrowserColumns", - "setTypes:onPasteboard:", - "serviceConnectionWithName:rootObject:", - "_cacheDocumentPreview:", - NULL, - "numCertFields", - "objectForKey:atIndex:", - "drawBezelWithFrame:inView:", - "put:", - "_frameForLayer:", - "exchangeObjectAtIndex:withObjectAtIndex:", - "wasRedirectedToRequest:redirectResponse:", - "currentVersion", - "_growContentReshapeContentAndToolbarView:animate:", - "runPageLayout:", - "redRange", - NULL, - "mergeGroupContentsTableIntoGroups:", - NULL, - "_relayoutWithAnimation:ifInfoVisibilityChanges:", - "decryptComponents:", - "replaceNodeWithIdentifier:withNode:", - "protocolCheckerWithTarget:protocol:", - "allocFromZone:", - "nts_AddSubgroup:", - "_enableOrDisableTrackingAreas", - "stringByReplacingCharactersInRange:withString:", - "fadeFromBlackToNormal:wait:", - "addTrackingAreasForView:inFrame:withUserInfo:mouseLocation:", - "_useFastValidationMethod", - "setTitleFont:", - "IKSlideshowStartIndex", - "_storeDefaultSearchScopeMode", - "setCTM:", - "_performBatchWindowOrdering:", - "decodeRect", - "_commandPopupRect", - "_stringByTranslatingAliasDescriptor:toType:inSuite:", - "_needsRedrawBeforeFirstLiveResizeCache", - "selectTabViewItemWithIdentifier:", - "setDidEndSelector:", - "setIsEqualFunction:", - "setAttributedTitle:", - "setDimmedLayerColor:", - "leftIndentMarkerWithRulerView:location:", - "clearsContext", - "setMenuZone:", - "collectionView:didChangeToSelectionIndexes:", - "displayIgnoringOpacity", - "_defaultButton", - "CGImage", - "_invalidateDisplayForChangeOfSelectionFromRange:toRange:", - "cellDocumentRectAtIndex:", - "control:textView:doCommandBySelector:", - "insertObjects:inSubNodesAtIndexes:", - NULL, - "gizmoIcon", - "locationOfControlType:keyFrame:", - "performKeyEquivalent:", - "_isUnprocessedDeletion", - "proxyDataFormat", - "portForKey:", - "_acceptableRowBelowKeyInVisibleRect:", - "soundUnfilteredTypes", - "_changeMinColorPanelSizeByDelta:setWindowFrame:", - "dictionaryRef", - "moveAsideDatabaseAtPath:reason:", - "supportsTableEditing", - "_stopModal:", - "appliesToRequest:", - "_dataForkReferenceNumber", - "_removeOverlay", - "sharedScriptingAppleEventHandler", - "_glyphTreeDescription", - "restoreSavedSettings", - "_renameCollectionWithName:to:", - "setDocumentURLs:currentIndex:preservingDisplayState:", - "getRepresentation:options:colorspace:intent:bitsPerComponent:image:", - "_optimizeHighlightForCharRange:charRange:fullSelectionCharRange:oldSelectionFullCharRange:", - "getValueFromObject:", - "updateXMLNode:fromObject:objectIDMapping:", - "sharedHelpManager", - "_setIndicatorImage:", - "_writeMetaDataForPeople:withLock:", - "moveWordRightAndModifySelection:", - "drawSchedulePriorityRanges", - "AMSymbol", - "dataWithContentsOfMappedFile:", - "_selectedSize", - "rect", - "_synchronousTransactionStatus:requiringResult:", - "_updateExpansionButtonEnabledState", - "_parseParagraphAttributes2", - NULL, - "autostarts", - "_patchStateChanged:", - "movieShouldLoadData:", - "updateUserSelection:", - NULL, - "selectedCellIndex", - "retainedFulfillAggregateFaultForObject:andRelationship:withContext:", - "_validateJobPageNumbers", - "prepareForCarbonMenuBar", - "paragraphSeparatorGlyphRange", - "textWithStringValue:", - "setHorizontalAlignment:", - "nextArraySeperatedByToken:stoppingAt:inEncoding:", - "setDoubleValue:", - "turnOffLigatures:", - "_menuScrollAmount", - "_initSingleAttributes", - "optionSetting:", - "localeIdentifierFromComponents:", - "clearAllSamples", - "_selectNextFocusedCellGoingForward:andEdit:", - "_ql_allowsJavascriptForPreview:", - "_deviceCurveToPoint:controlPoint1:controlPoint2:", - "setInputNeutralChromaticityY:", - "_keyViewFollowingAccessoryView", - "browserDidScroll", - NULL, - "hasEditor", - "_kaleidoscopeKernel:", - "_applyLinesToFunction:info:", - "push:", - "insertItem:path:dirInfo:zone:plist:", - "destinationOptions", - "_tileView", - "alternateSecondarySelectedControlColor", - "registerClassDescription:forClass:", - "_mouseDownShouldMakeFirstResponder", - "startObservingModelObjectAtReferenceIndex:", - "_observesModelObjects", - "serializedRepresentation", - "_sendDelegateWillDisplayCell:atRow:column:", - "makeProperties:verifyWith:", - "restartIndeterminateCycle", - "handleDelayedUpdate:", - "visibleCellIndexesAtSelection", - "sharedGlyphGeneratorForTypesetterBehavior:", - "createCopy:orientationTag:", - "trackMouse:inRect:ofView:untilMouseUp:", - "layoutSublayers2", - "changeBaseWritingDirectionToRTL:", - "beginPageInRect:atPlacement:", - NULL, - "_isRulePopup:", - "coerceColor:toData:", - NULL, - "parseExtKeyUsage:", - "textXWithTextInfo:renderedSize:destinationRect:", - "_acceptableRowAboveRow:tryBelowPoint:", - "accessibilityFocusRingBounds", - "textView:clickedOnLink:atIndex:", - "_popUpMenuFromView:", - "dragColor:withEvent:fromView:", - "optionsForCGImageSourceCreateImageAtIndex", - NULL, - NULL, - "keepBackupFile", - "closedHandCursor", - "accessibilityIsHeaderAttributeSettable", - "attributesAtIndex:effectiveRange:", - "_shouldAlwaysUpdateDisplayValue", - "bytesPerPlane", - "setPrototype:", - "_drawRectIfEmpty", - "_initWithDictionary:", - "andPredicateWithSubpredicates:", - "_recursiveFindDefaultButtonCell", - "timeZoneName", - NULL, - "_displayingAllDirty", - "_removeRecords", - "typesFilterableTo:", - "setNumberOfOperations:", - "selectionHighlightStyle", - "_resetTitleFont", - "setMaximumRecents:", - "includesSubentities", - "setTrustSettingsDomain:", - "createCVPixelBufferForManager:withOptions:", - "controlBackgroundColor", - "canInitWithFile:", - "absoluteZ", - NULL, - "_shouldAllowAutoExpandItemsDuringDragsDefault", - "columns", - "_subentitiesIncludes:", - NULL, - "applicationDidUnhide:", - "_filteredAndSortedChildrenOfNode:", - "relationshipsByName", - "pageUp:", - "previousCard:", - NULL, - NULL, - "_addStringToRecentSearches:", - "setDrawWithCGImage:", - NULL, - NULL, - "_deleteNodeFromMainCache:", - "_invalidateAllRevealoversForView:", - "dayOfYear", - "_canChangeRulerMarkers", - "zoomToFitAll", - NULL, - NULL, - "_sendActionFrom:", - "rulerView:didRemoveMarker:", - "cancelLoadInBackground", - "windowWillOrderOffScreen:", - "_parseFullURL", - "_disableRefreshOnWindow:", - "_drawBackgroundForGroupRow:clipRect:", - "usesScreenFonts", - "windowRegionBeingDrawn", - "cameraDY", - "dataWithPDFInsideRect:", - "_setDynamicToolTipsEnabled:", - "_drawerDefaultLeftLeadingOffset", - "setOrderIntermediate:", - "getFilenamesAndDropLocation", - "nts_SetSearchElement:", - "parseADR", - "_invalidateEjectButtonCellWithEvent:", - "setCharacterIndex:", - "_iDiskPathForURI:", - "applicationDidHide:", - "IKIPLargestRepSize", - "_changeJustMain", - "writeToConsumer:", - "initWithFrame:mode:prototype:numberOfRows:numberOfColumns:", - "objectValue", - "isBeingEdited", - "setTransferMode:", - "_loadedCellAtRow:column:inMatrix:", - NULL, - "_closeTooltip", - "_calendarRangeOfSelectedDaysForDisplayedMonth", - "expandByOneROI:destRect:", - "drawVisibleCells:", - "setAlternateIconsForAnimationFilenames:", - "resourceNamed:", - "nts_migrateUniqueMailRecentsFromV2SQLiteStore:toBinaryV3Store:inContext:error:", - "_newRowsForFetchPlan:selectedBy:withArgument:", - "_datePickerCellDidChangeSubfieldSelection:", - "terminationStatus", - "currentAnimationStep", - "rectOfColumn:", - "lastChangeCount", - "trackMouseDragAllowed:", - NULL, - "currentFontAction", - "bufferSize", - "validateVisibleItems", - "_nextDisplayMode", - "_scriptingSetOfObjectsForSpecifier:", - "_resolvePositionalStakeGlyphsForLineFragment:lineFragmentRect:minPosition:maxPosition:maxLineFragmentWidth:breakHint:", - "_effect", - "isOpaque", - NULL, - "underlineGlyphRange:underlineType:lineFragmentRect:lineFragmentGlyphRange:containerOrigin:", - "imageBrowserLoadingEnded:", - "_isEqualToSortDescriptor:", - "indexOfBestMatchForDisplayNamePrefix:inCachedChildrenForNode:", - "_searchTermsWindowBecameKey:", - "setExpandedNodes:", - "_keyFramesCache", - "_setImageOnDragSession:withOffset:", - "replaceBytesInRange:withBytes:", - "handleAnimatePageTransition:", - "_scriptingCopyWithProperties:forValueForKey:ofContainer:", - "isEqualToFormatDescription:", - "toggleToolbarShown:", - "isOptional", - "_convertRootIndex:", - "mediaTypeInMedia", - "_handleDefaultVoiceChange", - "removeRecord:fromAddressBook:", - "valueSelectionBehavior", - "setDefaultParagraphStyle:", - "goBackwardInHistoryIfPossible", - "datePickerCell:validateProposedDateValue:timeInterval:", - NULL, - "colorUsingColorSpace:", - "_shouldStretchWindowIfNecessaryForUserColumnResize", - "initWithPort:", - "_setDisplayValue:object:triggerRedisplay:", - "_disabledTrackingInNeighborhoodOfMouse", - "_defaultTokenizingCharacter", - "descriptionDictionary", - "_runLoop:containsPort:forMode:", - "_isKeyPathBound:", - "hitPart", - "subscript:", - "_typeDescriptions", - "_open:fromImage:withName:", - "_unfragmentBrowserItems", - "_saveState:filterTarget:filterAction:flatten:", - "selectTabViewItemAtIndex:", - "_drawDiscreteCapacityWithFrame:inView:", - "bezierPath", - "promise:keysAndValues:", - "initWithCoercer:selector:", - "composite:outOf:", - "setContextInfo:", - "_performMenuFormRepresentationClick", - "getBufferSize", - "resultList", - NULL, - "_timeLayoutTree", - "outlineView:didClickTableColumn:", - "registeredClients", - "_lookUpRangeInDictionary:", - "_readCacheFile", - "_scriptingIndicesOfObjectsForSpecifier:count:", - "setAutofill:", - "isAuthenticated", - "_segmentedControlRectForItemAtIndex:inBounds:", - "setMsgid:", - "recalcFigure:path:button:", - "maxDataLength", - "_sendDelegateDidDragColumn:", - NULL, - "textForValue:", - NULL, - "initializeNewItem:", - "_pageFormatWasEdited", - "_rowsForConflictDetection:withChannel:", - "_growBoxOwner", - "_keepCacheWindow", - "_executeInsertChild:didCommitSuccessfully:actionSender:", - "_sendFinderAppleEvent:class:file:", - "initWithClassPath:", - NULL, - "_insertionOrder", - "_setLastDragDestinationOperation:", - NULL, - "addAttributesWeakly:range:", - "_drawWithImageCache", - NULL, - "resetSQLStatement", - "cancelDelayedUpdate", - "colorSyncProfile", - "hardwareCapsDidChange:", - NULL, - "_recentLockTokens", - "_postAtStart:", - "preferenceForKey:", - "setApplicationName:", - "_userDeselectToRow:", - "clearVerifyField", - "simpleNodesFromXMLDocument:atPath:", - "deselectAllCells", - NULL, - "_determineDropCandidateForDragInfo:", - "_searchFieldCancelAction:", - "computeOccuranceIndexForChild:forParent:", - "application:printFile:", - "renderWithCGLContext:forBounds:", - "_primitiveCharacterRangeForGlyphRange:", - "valueForOutputKey:ofType:", - "removeAllActionsWithTarget:", - "setupIndexHandler", - "createGenieWindowForBoundingBox:", - "pictureTaker:willOpenOnImage:contextInfo:", - "_CFURLRequest", - "_counterpart", - "textTypes", - "_willDeallocIndexPath:", - "highlightColor:", - "setCompletionDelay:", - "initWithReferenceToObject:", - "documentVisibleRect", - "animationDuration", - "externalReferenceCount", - "setImageManager:", - "getCyan:magenta:yellow:black:alpha:", - "rangeOfVisibleIndexesAtSelection", - "setOptional:", - "movieRect", - "isVisual", - "addInsertedObject:", - "_sizeWithSize:", - "outlineView:shouldEditTableColumn:item:", - "movieWithDataReference:error:", - "setDefaultCropIsZoomToFit:", - "initWithName:attributes:", - "initWithOptions:contextAttributes:", - "newWithColorSpace:components:count:", - "_effectiveTitlePosition", - "setImageRep:", - "transformWith:", - "cachedChildrenForExpandedNode:", - "_alwaysShowBezelForCurrentBezelStyleAndState", - "_hash", - "indexSheetWillDeactivate:", - "initWithRootElement:", - "presentError:modalForWindow:delegate:didPresentSelector:contextInfo:", - "bundleWithPath:", - "layoutGlyphsInLayoutManager:startingAtGlyphIndex:maxNumberOfLineFragments:nextGlyphIndex:", - "setParagraphSpacingBefore:", - "_postCarbonWindowActivateEvent:makeKeyWindow:", - "integrateReferenceInstance:replaceImage:", - "usesRuler", - "showsContentSeparatorForEdge:", - NULL, - "canBrowseNode:allowInteraction:", - "_moveSheetByItself:delta:", - "setRecentPictureAsImageInput:", - "needsResyncWithDefaultVoice", - "titlebarBoundsForNote:inBounds:", - "smartInsertForString:replacingRange:beforeString:afterString:", - "resetDateFormats", - "initWithCompositionFile:", - NULL, - "windowWillMove:", - "canHide", - "_PFPlaceHolderSingleton_core", - "_mouseDownInSurroundingRegionShouldMoveWindow", - "_initForURL:withContentsOfURL:ofType:", - "_ql_allowsPlugInsForPreview:", - "_performFetchWithRequest:merge:error:", - NULL, - "_textDimsWhenDisabled", - "setSelector:", - "_resizeViewsForOffset:coordinate:", - NULL, - "_completeNoRecursion:", - "_removeResourceAtIndex:", - "_setNeedsDisplayInRegion:", - NULL, - "verifyDataType:forKey:", - "transpose:", - "_initWithWindowNumber:", - "_initWithType:", - "classFallbacksForKeyedArchiver", - "leftView", - "__performUndo2:", - "_enclosingBrowserView", - NULL, - "_newIconlessMenuItemForNavNode:", - "invertedDictionary", - "__oldnf_replaceAllAppearancesOfString:withString:", - NULL, - "_clockAndCalendarCellSize", - "_updateRolloverAtPoint:", - "setResetMatrices:", - "deselectRecord:", - "takeAPicture", - "_allocAndInitPrivateIvars", - "_menuFormRepresentation", - "_primitiveSetPreviousKeyView:", - NULL, - "_stringSearchParametersForListingViews", - NULL, - "accessibilityIsMinimizeButtonAttributeSettable", - "importsGraphics", - "_redisplayAndResizeFromRow:", - "_sizeRowHeaderToFitIfNecessary", - "initWithFormat:pixelsWide:pixelsHigh:options:", - "setScopeLocations:", - "_displayValueForConstantValue:", - "_plusImage", - "heightOfInfoSpace", - "browserWillScroll:", - NULL, - "_batchZoom", - "cacheUsed", - "_setCloseEnabled:", - "gotoPreviousItem", - "initForCArray:withContext:andRange:mergeWithRange:withType:", - "URLResourceDidCancelLoading:", - NULL, - "setPrimitiveText:", - "QTPixelFormat", - "insetByX:Y:", - "selectedMenuItemColor", - "getSubNodes:range:", - "drawTitleBackground", - "_observeSpecifierOfEntry:", - "_setInlinePreviewURL:", - "isSetOnMouseExited", - NULL, - "colorWithRed:green:blue:", - "setDoubleClickTarget:andAction:", - "_bulletStringForString:", - NULL, - "ISS_mimeAnalysis", - "_readSelectionFromPasteboard:toPoint:", - NULL, - "recentPicturesPopUpForRepository:withDelegate:", - "_shouldDrawRightSeparatorInView:", - "flushWindow", - "_setContentKindAndEncoding", - "analyzeReconfiguredWindowFinished:", - "perMillSymbol", - "wantsToDrawLabelInDisplayMode:", - "managedObjectClassName", - "replaceSetLengthActionForItem:withLength:", - "fontAttributes", - "_cellFurthestFrom:andCol:", - "green", - "openCategoryFile:withData:", - NULL, - "horizontalAlignment", - "setSubmenu:", - "_updateActivity:", - "_focusAcquired", - "updateInDock", - "_initWithCGSEvent:eventRef:", - "_rowHeaderScrollableContentVisibleRect", - "menuForEvent:", - "actionMenu", - "wantsDefaultClipping", - "setCustomButtonVisible:", - "updateCellLayoutAtIndex:", - "openTempFile:ok:", - NULL, - "_nameIsEqualToNameOfNode:", - "cellsAlignOnBaseline", - "setGroup:", - "keyWindowFrameHighlightColor", - "_allocString:", - "enabledFileTypes", - "_setBorderType:", - "setIndexLabel:atIndex:", - "setScriptErrorString:", - "dispatchGroupSelection:", - "pathToColumn:", - "_explicitlyCannotAdd", - "newItemForRepresentedObject:", - "strokeExactInterior", - "_setResult:", - "setupSlider", - "filterForName:value:key:", - "preferences", - "focusStack", - "_displayName", - "makeFirstResponderFromCarbonFocus:", - "_openDrawer", - "_initWithProperties:commandName:resultTypeAppleEventCode:", - "accessibilityIsToolbarButtonAttributeSettable", - "addAttribute:values:mergeValues:", - "_interlabelPadding", - "inputClientDisabled:", - "colorSpaceForColorSpaceName:", - "setMaxSize:", - "_centerTitle:inRect:", - NULL, - NULL, - "cacheSchema", - NULL, - "initWithParentSpecifier:name:", - "scheme", - "_asScriptTerminologyNameString", - "_startObservingRowObjectsRecursively:", - "replaceBytesInRange:withBytes:length:", - "setBorder:", - "postNotificationName:object:userInfo:deliverImmediately:", - "setConfigurationUsingName:", - "_filtersDALDevices", - "_registerForFontSetNotification", - "_mapKeyCodeToInputSource:modifiers:", - NULL, - "_matadorThread:", - "_setGroupIdentifier:", - "initWithCertData:", - "setVerticalLineScroll:", - "intWithController:", - "canConvertToBMPRepresentation", - "performSelector:withObject:withObject:", - "isInserted", - NULL, - "updateFrameColors:", - "_stateMarkerForValue:", - "drawBorderImage:middleImage:borderImage:inRect:withOrientation:flipped:operation:fraction:", - "_setCAType:", - "openDocument:", - "_popupImageSize", - "operationType", - "verifyWithDelegate:", - "applicationTerminating:", - NULL, - "_fillGlyphHoleAtIndex:desiredNumberOfCharacters:", - "copyRegexFindSafePattern:toBuffer:", - "accessibilityHelpStringForChild:", - "weakCount", - "multiValueForProperty:", - "_placeholderString", - "evaluatedArguments", - "writeUnderlineStyle:allowStrikethrough:", - "_region:", - "endMouseOperation", - "selectColumnIdentifier:", - "_bindingAdaptorMethodsNeededMask", - "setHighlightsBy:", - "_setDrawsBaseline:", - "copyFromZone:", - "nts_ValueForProperty:", - "setScriptingProperties:", - "sharedTimers", - "accessibilitySetHiddenAttribute:", - "setDestinationKeychain:", - "correspondingDisclosureGroup", - "setWidth:", - "drawFocusRingInView:", - "rebroadcastUserPictureDidChange", - "attributedString", - "imageRepClassForData:", - "_setHasCustomSettings:", - "showcaseRect:position:", - "sendProfilingData", - "select", - "_scheduleDelayedAutocomplete", - "initWithProtocol:httpRequest:proxyURL:challenge:callback:context:", - "fbeNode", - "writeCharacterShape:", - "_doModalLoopForSecondaryThread:", - "contentDocument", - "handleThreadedFindGRLs", - "_autoreleaseTrackingTag:", - "_setup:", - "_willChangeValuesForArrangedKeys:objectKeys:indexPathKeys:", - NULL, - "setQueryType:", - "_panelInitWithCoder:", - "initWithHost:port:protocol:realm:authenticationMethod:", - "_searchInSpotlight:", - "_readImageInfoWithImageSource:imageNumber:properties:", - "_transactionFinished", - "texturePixelsWide", - "_applicationWillTerminate:", - "isAtEnd", - "enterFullscreen", - "rehashAround:", - "_stripAttachmentCharactersFromString:", - "initWithNode:arguments:", - "imageForState:", - "netServiceWillPublish:", - "_textHitTest:withFrame:inView:", - "initWithKey:type:access:appleEventCode:isHidden:presentableDescription:name:", - "cacheUsedByBitmapRep", - "inputTopLineAtIndexes:", - "addedMembers:", - "_relayoutSubviewsWidthChanged:", - "_moveFullscreenViewToView:showControls:fitToScreen:coalesceFlushes:", - "predicateWithValue:", - "lockTextureRepresentationWithColorSpace:forBounds:", - "boundsForProvider:withTransformation:", - "nts_SetDistributionIdentifier:forProperty:person:allowFetching:", - "_theaterStateDidChange:", - "spellServer:checkGrammarInString:language:details:", - "extraLineFragmentUsedRect", - "tokenField:completionsForSubstring:indexOfToken:indexOfSelectedItem:", - "isFileListOrderedCaseSensitive", - "recoveryOptionIndex", - "_searchFieldClearRecents:", - "tabViewAdded", - "setSpacing:inWindow:delegate:", - "writeBinaryObjectSequence:length:", - "_getRemainingNominalParagraphRange:andParagraphSeparatorRange:charactarIndex:layoutManager:string:", - "insertRow:withCells:", - "hasCloseBox", - "_web_numberForKey:", - "setApplicationIconImage:", - "setNegativeSuffix:", - "_isThreadedAnimationLooping", - "subrowObjectsForPerson:", - "aspectRatio", - NULL, - "setCacheUsedByProxyBitmapRep:", - "_blobForCurrentObject", - "_validateStyleMask:", - "_cachedAttributedTitleSize", - "text", - "_topRightResizeCursor", - "allowedClasses", - "_scanForPlugIns:", - "symbol", - "setFieldOfView:", - NULL, - "isToOne", - "_complexTypeDescriptions", - "setPreviewMode:", - "moveToEndOfParagraph:", - "coreUIState", - "_altContents", - NULL, - "relatedMatchesForIdentifier:", - "principalID", - "_predicateForImplClass:addressBook:", - "scrollsDynamically", - "enableKeyEquivalentForDefaultButtonCell", - "setTrailingOffset:", - "abPeopleFromUniqueIds", - "handlePollingForMyWindow:", - "selectedPages", - "_alignmentRectInNormalizedCoordinates", - "accessibilityIsCloseButtonAttributeSettable", - "initWithMenu:", - "_collectItemViewerFrames:intoRectArray:", - NULL, - "isInInterfaceBuilderSimulator", - "fileNamesFromRunningOpenPanel", - "menuView", - "_abCompareWithinIntervalAroundToday:", - "_tabRectAdjustedForOverlap:", - NULL, - "finishUsingMenuRepresentation", - "_indexOfRangeBeforeOrContainingIndex:", - NULL, - "mouseDownSetup:", - "_repeatMultiplier:", - "parseCrlDistributionPoints:", - "setPortNumber:", - "enumerateDescendents:ofResource:", - "textAttributesForPositiveValues", - "_setContentsDirty:", - "removeSource:", - "encodeQTTime:forKey:", - "countdownNotePlayer", - "tooltipDelay", - "selectFilterByURL:", - "_itemAdditionCompleted:", - "_setupBoundsForLineFragment:", - "valueTransformerNames", - "invalidateContents", - "addTypes:owner:", - "setMouseDownMovesWindow:", - "errorCount", - "_addResource:withSize:cost:md5List:count:", - "formatType", - "_registerOrUnregister:observerNotificationsForModelObject:", - NULL, - "_isAtEnd", - NULL, - "_unlockViewHierarchyForDrawing", - "applyMultiValue:withProperty:toRecord:", - "clearReorderingItemsArray", - "beginLoadingImageDataForClient:", - "_blockRowRangeForCharRange:completeRows:", - "pageRanges", - "_swap", - "highlightRecovery:pattern:clipLevels:phase:redBlueSwap:image:", - "_createStringDict", - "_sharesParentKeyState", - "supportsProperty:", - "enqueueResumeOperationScheduledForTime:", - "buttonRectForBounds:inView:", - "_versionHash:", - "mutableAttributes", - "setPolicies:", - "updateOptionsWithApplicationName:", - "membersOfGroup:", - "_showingFocusRingAroundEnclosingScrollView:", - "selectAllInView:selectionOnly:", - "objectInAppleUseCoreUIAtIndex:", - "_addKey:", - "pathForResource:ofType:inDirectory:", - "setColumnAutoresizingStyle:", - "optimizesParameters", - "setExternalScale:", - "createCGImage:fromRect:format:colorSpace:", - "animate", - "_sendCarbonNotificationForTag:withValuePtr:andSize:", - "initWithColorSpace:", - "willClose", - NULL, - "selectedPagesAreContiguous", - "automaticRedisplay", - "initWithCopyOfRects:count:bounds:", - "mutableCollectionGetter", - "selectedControlTextColor", - "orderFrontFindPanel:", - "apply:to:params:", - "null", - "defaultCollector", - "verticalPagination", - NULL, - "handleAnimationProgress:", - "mipmapDB", - "levelForItem:", - NULL, - "_notifyDelegate_DidRemoveItem:", - "_minContentSizeForDrawers", - "formatDescriptions", - NULL, - "_updateLayer:", - "imageOffset", - "_isDeadkey", - "addFileNamed:fileAttributes:", - "_discardEventsFromSubthread:", - "_updateHeightToReflectNewWindowStyleIfNecessary", - "_shouldShowHiddenFiles", - "_documentController:didPrint:appleEventSuspensionID:", - "contextWithCGContext:options:", - "existingItemForSetItem:forAbsentKey:", - "_generateCountClauseForToManyKeyPathExpression:inContext:", - "_rulerAccViewListsAction:", - "_zoomWithSpeedFactor:", - "_canCreateImageFromPasteboard:", - "addChildWindow:ordered:shareKey:", - "deletedGroups:", - "_imageForPart:keyWindow:", - "_autoscalesBoundsToPixelUnits", - "minimumDaysInFirstWeek", - "boxType", - "restoreWindowOnDockReincarnation", - "runModalForSavePanel:withFilepath:", - "_clickedCharIndex", - "initDir:file:docInfo:", - "_setFileURL:", - "executeRequest:withContext:", - "_simpleCompletePathWithPrefix:intoString:caseSensitive:matchesIntoArray:filterTypes:", - "moveForward:", - "indexSheetWillActivate:", - "enumerations", - "_addDefaultTable", - "contentsEqualAtPath:andPath:", - "initWithGroup:records:assimilatedMap:addressBook:", - "allowsUserCustomization", - "_initLockDictionary", - "drawInRect:", - "multiply:with:", - "suppressAllNotificationsFromObject:", - "_resolveName", - "backgroundFilters", - "statusUpdate:", - "_postCheckpointNotification", - "selectedSegment", - "orderString:range:string:range:flags:", - "translateRectsNeedingDisplayInRect:by:", - "mutableData", - "setCurrencyCode:", - "countForFetchRequest:error:", - "dataForResolutionData:", - "_delayedUpdateSwatch:", - NULL, - "writeLigature:", - "initForKeyBackPointer:", - "currentVRamBindedRange", - "fileName", - "_taskNowMultiThreaded:", - "_contextInfo", - "canInsertChild", - "orientation", - "isEnabledWithSelection:", - "initWithTextControl:colorPanel:delegate:", - "_findFirstItemInArray:withItemIdentifier:", - "openInclude:", - "_initializePrimitiveAccessorStubs", - "immutableCopy", - "locationX", - "_certSigningUsage", - "loadNSImageNamed:into:", - "int64", - "deselectDirectoryResultRow:subrow:", - "isIdentifiedByName:", - "_validateUnderline:", - "accessibilityHiddenAttribute", - NULL, - "newFlipped:", - "_resizeWeighting", - "cropElementDidLiveUpdate:", - "setTitle:andDefeatWrap:", - "toggleSmartInsertDelete:", - "startDeviceAVCControlsPoller", - "_imageChosen:returnCode:contextInfo:", - "_updateTitle", - "splitView:canCollapseSubview:", - "abGlobalAPILockInFile:line:", - "_launchSpellCheckerAsynchronously:", - "appendPasswordView", - "_buttonOfClass:action:", - "updateObject:objectIDMap:", - "stringByConvertingPathToURL", - "validateMipmapAtIndex:withQuality:", - "heightForNumberOfVisibleRows:", - "sharedWorkspace", - "_managedObjectsChangedInContext:", - "modelByMergingModels:", - "columnFilters", - "startTimerForSpeaking", - "_shouldHighlightRows", - NULL, - "enabledStateForMenuItem:", - "loadState", - "_setValue:forKeyPath:ofObjectAtIndexPath:", - "copyright", - "clearSearch", - NULL, - "reclaimResources", - "isLocked", - "parseABMaiden", - "bufferPixelsWide", - "data2", - "_menuSelect:", - "viewDidLiveResizeFromRect:", - "fontInstanceForRenderingMode:", - "attributesAtEndOfGroup", - "_loadOrSetMetadata", - "cancelOperation:", - "_addOptionFromSlice:ofRowType:", - "visiblePages", - "createDestinationInstancesForSourceInstance:entityMapping:manager:error:", - "nodeNamespace", - "_sendManufacturedCursorUpdateEventForTrackingRectEvent:", - "transactionHadError:", - "_applicationDidTerminate:", - "IKOpenGLDefaultPixelFormat", - "_setCountry:", - "destinationsForRelationship:", - "adjustControls:", - "indexOfIdentifier:", - "_clearDirtyRectsForTree", - "_markedWidthDiffersFromCurrentWidth", - NULL, - "calendarIdentifier", - "minificationFilter", - "setAllowsUserConfiguration:", - "propertyPopUpFrame", - "minimumFractionDigits", - "_modelForVersionHashes:", - "initWithCharactersInString:", - "isLocationRequiredToCreate", - "topColor", - "_defaultFromWritableTypeNames:", - "accessibilityIsMaxValueAttributeSettable", - "ensureGlyphsForCharacterRange:", - "_typeDescriptionForKey:", - "directories", - NULL, - "_tmpPasteboardWithCFPasteboard:", - NULL, - NULL, - "_fixSelectionAfterChangeInCharacterRange:changeInLength:", - "imageBrowser:backgroundWasRightClickedWithEvent:", - "playsSelectionOnly", - "_topLeftResizeCursor", - "alignment", - "setAutosaves:", - "superview", - "establishConnection", - "returnType", - "backingLocation", - "_removeTrackingRectTag:", - "initWithCompareSelector:", - NULL, - NULL, - "selectFirstNavPopupMenuItem", - "setupInspectorViews", - "_doCheckPreAuth", - "setTransitionImage:", - "coerceValueForScriptingProperties:", - "setHeader:withValue:", - "_rowButtonsRightHorizontalPadding", - "compareSelector", - "_trackMouse:", - NULL, - NULL, - NULL, - "clearTemporaryIDs", - "deallocAllExpandedNodes", - "cleanup:", - "setFetchLimit:", - "_finalize_QCImageTextureBuffer", - "adjustPageHeightNew:top:bottom:limit:", - "initWithCodecType:sizeMode:width:height:compressionSessionOptions:", - "AppleUseCoreUI", - "_selectIndex:scrollToVisible:", - "groupsByEvent", - "columnOfMatrix:", - "setPlaceholderString:", - "_typographyPanel", - "weekdayOrdinal", - "updateBackgroundColor", - "_setNeedsDisplayBeginingAtColumn:", - "dataWithContentsOfFile:", - NULL, - "addNormalAndDownAppearanceToDictionaryRef:", - "_setModelKeys:triggerChangeNotificationsForDependentKey:", - "_sortNodes:", - "_availableChannel", - "showRemainingTime", - "_createMediaBrowserDelegate", - "createPDFDocumentFromPDFPage:", - "_changeSpellingFromMenu:", - "_readMovieIntoRange:fromPasteboard:", - "textDidBeginEditing:", - "fillRect:color:context:", - "writeCellTerminator:atIndex:nestingLevel:", - "_knownPrimaryKeyForObjectID:", - "leafKeyPathForNode:", - "CA_stringByResolvingSymlinksInPath:", - "_noteToolbarDisplayModeChanged", - "createCopyWithBlur:context:", - "animationTimerFired:", - "setZoomFactor:", - "makeKeyAndOrderFrontWithEffect:canClose:", - "backgroundIsBlack", - "iconView:writeIndexes:toPasteboard:", - "nextDaylightSavingTimeTransition", - NULL, - "_obtainPermanentIDsForObjects:withContext:", - "addProperty:withLocalization:toMenu:", - "_removeTexturesInContext:", - "unregisterModelKeyPath:", - NULL, - "setCellsOutlineColor:", - "_updateCAConfigFileSerialNumber", - "_setEnabled:", - "_glyph", - "canStealContentsFromPreviewView:", - "_customImageData", - NULL, - "_setResizedWidth:", - "isPlanar", - "longValue", - "formattedAddressFromDictionary:", - "_minXTitlebarDecorationMinWidth", - NULL, - "setSupportedPreviewTypes:", - "doFilesystemCleanupOnRemove:", - "createCGPathArray", - "_retainedURIString", - "_doNameCheck:", - "_readSelectionFromPasteboard:types:", - "initWithSerializedRepresentation:", - "setupParameterView", - "setImageDimsWhenDisabled:", - "postEvent:atStart:", - "selectionForEntireDocument", - "filtersInDomains:", - "outlineView", - "_recount", - "mappedIntoRAM", - "newStatementWithSQLString:", - "closeboxRectForBounds:", - "_isCritical", - "_argumentValueFromParameterDescriptor:usingTypeDescription:", - "beginSheetForDirectory:file:modalForWindow:modalDelegate:didEndSelector:contextInfo:", - "tryToPerform:with:", - "rowIndex", - "_delegateRespondsTo_typeSelectStringForTableColumn", - "_setItemOwnerView:", - "_updateMouseMovedState", - "_resumeLoading", - "fields", - "_nodeForBrowserType:", - "increaseSizesToFit:", - "setExpandedGridFrame:", - "oneOrMoreDescriptionsForSubelementName:", - "creationTime", - "_accessibilityTitle", - NULL, - "variable", - "_cancelDelayedAutocomplete", - "nts_CachedRecordForUniqueId:", - "doubleValue", - NULL, - "_liveResizeHighlightSelectionInClipRect:", - NULL, - "offStateImage", - "imagePathChanged:", - "initPutWithSession:data:URI:includeRangeHeader:rangeStart:rangeEnd:token:", - NULL, - "_contentRectForCharRange:textContainer:", - "zoomAll:", - "foreignKey", - "_launchService:andWait:", - "installToolTips", - "_invalidateTimers", - NULL, - "hasCustomImage", - NULL, - "sourceExpression", - "openGLTextureIsPremultiplied", - "_importConfirmSheetDidEnd:returnCode:contextInfo:", - "publicRecord", - "parseKeyUsage:", - "_setWindowDepth", - "decimalNumberByAdding:", - "_calcHeightsWithMargin:operation:", - "textStorage:edited:range:changeInLength:invalidatedRange:", - "nts_IsPublished", - NULL, - "abdStoppedSyncing:", - "isRulerVisible", - "_takeApplicationMenuIfNeeded:", - "argumentsRetained", - "requestTimeout", - "setCropPRS:", - "encodeInvocation:", - NULL, - "_contentRectForTextBlock:glyphRange:", - "setAutoreverses:", - "movieBoxIsOpaqueChanged:", - "windowTitle", - "_recursiveTickleNeedsDisplay", - "_areAllPanelsNonactivating", - NULL, - "invalidateFilters", - "_beginDrawForDragging", - "_recentPlacesNode", - "allowsToggleToOff", - "canChooseFiles", - "focusRingEnabled", - "containsGroupName:", - "moveBackwardAndModifySelection:", - "setMetadata:forPersistentStore:", - "declareTypes:owner:", - "_changeIconViewTextPosition:", - "_updateLayerAnchorPointForUnflippedSuperview", - NULL, - "_restorePreviousKeyWindowFromSavedProperties", - NULL, - "constrainMeasurementsToInteger:", - "alertWithMessageText:defaultButton:alternateButton:otherButton:informativeTextWithFormat:", - "unarchiveObjectWithData:", - "_web_uniqueWebDataURL", - NULL, - "_getClientContext", - "recordForUniqueId:", - "_setCompoundPredicate:", - NULL, - "_searchForSoundNamed:", - "interpretKeyEvents:", - "minTimeForControlType:keyFrame:inTimeLine:", - "favoritesNode", - "_replaceAllItemsAndSetNewWithItemIdentifiers:", - "_checkLinksForRange:excludingRange:", - "unarchiver:willReplaceObject:withObject:", - "anchorPoint", - "setShowsControlView:", - "addTextLabelToDictionaryRef:", - "setTransitionFrame:", - NULL, - "validateBackupFileAtPath:", - "removeRepresentation:", - "nextTokenPeakSingle:length:", - "indicesOfObjectsByEvaluatingWithContainer:count:", - "splitView:constrainSplitPosition:ofSubviewAt:", - NULL, - NULL, - "superlayer", - "isSelectorExcludedFromWebScript:", - "_invalidateConnectionsAsNecessary:", - "_buttonAtIndex:", - "addGroupButton", - "spotlight:", - NULL, - "contextMenuRepresentation", - NULL, - "_setPreview:", - "_localizedColorListName", - "localizedColorNameComponent", - NULL, - NULL, - NULL, - "testScrollPerformancesWithDelta:withCount:", - "accumulatorFormat", - "blueReconstruction:green:phase:image:", - "removeFromRunLoop:forMode:", - "turnOffKerning:", - "scrollWheel:", - "setSave:", - "constantValue", - "_windowDidChangeScreens:", - "referenceObjectForObjectID:", - "_setVisibleInCache:forWindow:", - "_drawKeyboardUILoopStartingAtResponder:validOnly:", - "_writeInfoStringForKey:number:headerData:contentsData:", - "insertObjects:atArrangedObjectIndexes:", - "publicRecordsForClass:withDatabaseImpls:inAddressBook:", - "didStabilize", - "propertyForKey:inRequest:", - "noiseImage", - NULL, - "_setTransactionStarted:", - "_computeImageBufferParametersForProvider:withFormat:target:colorSpace:outSrcFormat:outSrcTarget:outSrcColorSpace:outDstFormat:outDstTarget:outDstColorSpace:relaxedFormat:softwareOnly:", - NULL, - "passwordView", - "_allowsAnyValidResponder", - "table", - "protocolFamily", - NULL, - "_closeFileSync", - "_updatedMetadataWithSeed:includeVersioning:", - NULL, - NULL, - "_okForOpenMode", - "initWithCards:duplicates:group:selectGroup:uiController:", - NULL, - "currentSelection", - NULL, - "movePath:toPath:handler:", - "_argInfo:", - "updateWindowsItem:", - "_forceMoveItemFromIndex:toIndex:", - "_rectsForBounds:", - "_reloadFontInfoIfNecessary:", - "oldIndexOfNewIndex:", - "doubleClick:", - "setMenuBarVisible:", - "windowDidBecomeVisibleNotification:", - "uniqueId", - "_willPresentOpeningError:forURL:", - "cardWillCommitChanges:", - "compare:options:", - "BMPRepresentation", - "_gutterFrame", - "createLocalPortWithTarget:", - "outlineView:performKeyEquivalent:", - "checkIdentifier:", - "_adjustScroller", - "cocoaSubVersion", - "_unregisterTableColumnBinder:fromTableColumn:", - "_beginListeningForApplicationStatusChanges", - "_setToDefaults", - "_startFadeOut:", - "isMovable", - "imagingModeForcedToGWorld", - "initWithFileName:", - "isARepeat", - "setLayerTreeHost:", - "_branchImageEnabled:", - "getFiltersInCollection:", - "adjustRect:", - "accessibilityStyleRangeForIndexAttributeForParameter:", - "_runAlertPanelForFileOverwritten:moved:renamed:inTrash:orUnavailable:thenSaveDocumentWithDelegate:didSaveSelector:contextInfo:", - "createTexturePackerAtIndex:", - "_setGlyphsPerLineEstimate:integerOffsetPerLineEstimate:", - "_newCompositionsDidLoad:", - "initWithSource:forRelationship:asFault:", - "selectedName", - "setAllowsToolTipsWhenApplicationIsInactive:", - "imageBrowser:writeItemsAtIndexes:toPasteboard:", - "textFileTypes", - "accessibilityIsEnhancedUserInterfaceAttributeSettable", - "_insertPopUpButtonItemInCellOrControl:title:representedObject:menuItemIndex:index:", - "checkBoundaries", - "_validateSingleValue:forKey:error:", - "_updateFrameOfDisplayedView:", - "accessibilityActionNames", - "_openListsForParagraphStyle:atIndex:inString:", - "isVRMovie", - "_readPersistentExpandItems", - "strikethroughGlyphRange:strikethroughType:lineFragmentRect:lineFragmentGlyphRange:containerOrigin:", - NULL, - "_presentDividerDragResult:withParams:", - "scanUpToCharactersFromSet:intoString:", - "newRowsForFetchPlan:", - "_openDrawers", - "_valueForParameter:", - "layoutManager:shouldUseSelectedTextAttributes:atCharacterIndex:effectiveRange:", - "appendSQL:", - "loadedBundles", - "wrapsAround", - "mainBundle", - "advanceToToken:throughTypes:", - "enableFreedObjectCheck:", - "_setNeedsReset", - NULL, - NULL, - "isKindOf:", - "_isFullWidthCellAtRow:", - "layoutManager:didCompleteLayoutForTextContainer:atEnd:", - "createViewController", - "drawRadioButton:inContext:", - "pathComponents", - "_askDelegateWithURL:proxy:forRequest:proxyURL:failureCount:failureResponse:protocol:withCallback:context:", - "_isPublicRecord", - "pageChanged:", - "requiredMinSizeFor:", - "_compositeToPoint:operation:fraction:", - "subcacheUsingRectFilteringFunction:rect:", - "wasFlattened", - NULL, - "_showToolTip", - "_commonInitNSColorPickerColorSpacePopUp", - "setCell:enabled:", - "outlineView:toolTipForCell:rect:tableColumn:item:mouseLocation:", - "createTextureBufferFromProvider:withFormat:target:transformation:bounds:colorSpace:options:", - "setDistributionIdentifier:forProperty:person:", - "_initInStatusBar:withLength:withPriority:hidden:", - "largeImagePath", - "indexPairForIndex:", - "_XMLStringWithCharactersOnly", - "updateSelection:", - "_updateMenuMatrix", - "print", - NULL, - "originalAspectRatio", - NULL, - "_shouldContinueExpandAtLevel:beganAtLevel:", - "initPropPatchWithSession:URI:updatingProps:token:inNameSpace:", - "_toggleUserVisibilityPriority:", - "isBinded", - NULL, - "_preflightSpellChecker:", - "_runInitBook:", - "_updateMetadata", - NULL, - "_updateIdentityPreference:domain:", - "searchIndexForRecordsMatching:", - "_copyDescription", - "metadataForPersistentStore:", - "_web_changeFinderAttributes:forFileAtPath:", - "accessibilityRTFForCharacterRange:", - "consumerSubpatches", - "_invokeSelector:withArguments:onKeyPath:ofObject:mode:raisesForNotApplicableKeys:", - "versionInfoDictionary", - "showsResizeIndicator", - NULL, - "autoScaleFactor", - "_mutableParagraphStyle", - "setLocalizesFormat:", - "addAppearanceForKey:toDictionaryRef:", - "newDeleteStatementWithCorrelation:", - "hasHorizontalScroller", - "_generateDocument", - "lineToPoint:", - "setEnableCustomAttributeFixing:", - "fileSize", - "movie:postNetworkDiagnosticUI:", - "recentsAutosaveName", - "bgColor", - "_nicestRederingCellIndexAtIndex:", - "showHelp:", - "tokenFieldCell:completionsForSubstring:indexOfToken:", - "addTool:frame:action:", - "fadeControlsPanel:", - "signal", - "_mutableArrayValueForKeyPath:ofObjectAtIndex:", - "pauseRenderingPatch:", - "_fillerRectHeight", - "_adjustFocusRingSize:", - "_operationFailed:", - "_mutateTabStops", - "captureOutput:didOutputAudioSampleBuffer:fromConnection:", - "setDashFromArray:", - "_setupMasterSynchronizers", - "launchFXPicker", - "_doUserPathWithOp:inContext:", - "postNicestRendering", - "newStreamWithRequestMessage:", - "initWithOriginalObject:modes:wait:", - "didEndShouldCloseSheet:returnCode:contextInfo:", - "_initWithAttributesNoCopy:flattenedPageFormatData:printSettingsData:", - "_coreCreationForKeys:count:", - "previewType", - "decodeSMPTETimeForKey:", - "_setResizeWeighting:", - "initWithProvider:options:", - "patchSetsTransform", - "drawResizeIndicator:", - "isSpecialGroupSelected", - "releaseNode:", - NULL, - "valueTransformerName", - "predicateWithFormat:argumentArray:", - "_setRotation:forGlyphAtIndex:", - "remoteSubscription", - "_GetInternalCFHTTPCookie", - "paletteLabel", - "_forgetWord:inDictionary:", - NULL, - "_fetchPreviewTypeForDocumentPreview:", - "entryNames", - NULL, - "_shouldTransformMatrix", - "_findLastViewInKeyViewLoop", - "_cancelFileControlCallbackTimeoutTimer", - "_getFullyFormedCellAtColumn:row:", - "_jobSavePathInPrintSession:printSettings:", - "allowsTypeSelect", - "_cancelMovementTrackingTimer", - NULL, - "_CGSadjustWindows", - "setAgeProfileView:", - "setNilSymbol:", - "cameraButton:", - "inputRampParams", - "minTimeForControlType:keyFrame:", - "initWithPerson:imageData:addressBook:", - "textColorForButtonState:", - "tag", - "wasPaused", - NULL, - "apertureMode", - "objectAt:", - "_termedDescriptionWithTabCount:propertyKindName:", - "_scriptingIndexesOfObjectsForSpecifier:", - "initializeFromDefaults", - "theaterDataSource", - "tableView:setObjectValue:forTableColumn:row:", - "niceMipmapItemForSize:forGLRendering:cacheIt:", - "_clockAndCalendarRetreatMonthButtonCell", - "_defaultTableHeaderSortImage", - "bundle", - "didPresentErrorWithRecovery:contextInfo:", - "initWithURL:method:", - "_updateVolumeFromPropertyListener", - "abArguments", - "setAuthorizationRights:", - "_decrementLocalProxyCount", - "orderedWindows", - "_updateEnabled", - "applicationDidBecomeActive:", - "_setRelativeOrdering:", - "shouldBreakLineByWordBeforeCharacterAtIndex:", - "startRendering", - "_createEditButtonIfRequired", - "setSliderType:", - "openGLInternalFormat", - "_changeFileListMode:", - "_trackingSegment", - "numberWithInteger:", - "animation", - NULL, - "_lockTokenForURI:", - "saveDocumentWithDelegate:didSaveSelector:contextInfo:", - NULL, - "selectedMember", - "setImagingModeForcedToSharedBuffer:", - "doClose:", - "positiveSuffix", - "menuTitlePath", - "currentSearchRow", - NULL, - NULL, - "zoomMinCallback:", - "accessibilityTitleAttribute", - "createToManyJoinIntermediateForProperty:lastStep:inScope:context:", - "backgroundWindowLevel", - NULL, - "browser:namesOfPromisedFilesDroppedAtDestination:forDraggedRowsWithIndexes:inColumn:", - NULL, - "_resizeTable:level:range:row:heightDelta:", - "_setNeedsDisplayForSelectedCells", - "upgradeForCropSize:", - "birthdayYearless", - "outlineView:nextTypeSelectMatchFromItem:toItem:forString:", - "updateEditButton", - "_retain_1", - "attributesWithStat:", - "_scriptingAnyDescriptor", - "CGBitsPerPixel", - "_memoryCacheTruncate:", - "_setDoNotShowBaselineSeparator:", - "_doAction:", - NULL, - "_userSelectRowIndexes:withNewSelectedRow:", - "setSelectionRect:", - NULL, - "deleteObject:", - "replaceTextStorage:", - "_setNeedsViewerLayout:", - "drawPieInteriorWithFrame:inView:", - "nts_SubscriptionListChanged", - NULL, - "addAnnotationFormField:", - "_ensureDatabaseOpen", - "buildRequest", - "copyPublicRecordForClass:withDatabaseImpl:inAddressBook:", - "updateScale:", - "displayedCard", - "setFileModificationDate:", - "createICUSubstringContext", - "getComputedStyle:pseudoElement:", - "currentEvent", - NULL, - "reloadSettings", - "shouldDrawColor", - "resumeAnimation:", - "_controlMenuKnownAbsent:", - "_minVisibleHeight", - "nicestRenderingLoop", - "containerNode", - "_computeMenuForClippedItems", - "outputAudioSampleBuffer:fromConnection:", - "isDeadKey", - "_customizationOfError:withDescription:", - "initWithData:usedEncoding:", - "imageWidth", - "subNodesAtIndexes:", - "labelFontSize", - "IK_TIFFRepresentationWithCompressionFactor:", - "refreshDetailContent", - "_recursiveSetDefaultKeyViewLoop", - "retainedRelationshipDataWithSourceID:forRelationship:withContext:", - "_delegateTypeSelectStringForTableColumn:row:", - "readMetadataFromFile:error:", - "connectionDidFinishLoading:", - NULL, - "_invitation", - "nextFrameDelayAtIndex:", - "setObjectStoreIdentifier:", - "usesFontPanel", - "transformForOrientationAndDPIWithTranslation", - "sendRenderState:didChangeMessage:withAttributes:", - "_loadNibDataFromPath:", - NULL, - "identifierAtIndex:", - "addRow", - "createCTTypesetter", - "formatDescription", - "reopenDocumentForURL:withContentsOfURL:error:", - "parseGeneralNames:indent:", - "currentHandler", - "spinRange", - "fidelityMask", - "restoreDefaultSearchOptions", - "_removeEntityNamed:", - "crop:", - "toolbarLabelFontOfSize:", - "zoomSliderAction:", - "_refreshInputSourceAttributes", - "_resignKeyFocus", - "SCTPerformDelayedSelector:withObject:", - "drawShadowedRect:blur:", - "setMaxIndexValue:", - "hasThumbnail", - "_allocDefaultView", - "setSubentities:", - "previewView:openExternalURL:", - "_observeFileAttributesOfChild:", - "pixelAlpha", - NULL, - "releaseConnectionWithSynchronizePeerBinders:", - "lightMetalBackgroundUsingTexture:", - "setDBSnapshot:", - "keyEquivalentRectForBounds:", - "gregorianStartDate", - "performSelectorDelayed:withObject:", - "_allowsOrdering", - "gridVisibleRect", - "index", - "initWithTitle:inputController:", - "_startLiveResizeForAllDrawers", - "setSelectedMember:", - "setActsLikeButton:", - "parseExtensionCommon:expect:", - "_setRotatedOrScaledFromBase:", - NULL, - "drawBezelGroupOverlay:", - "doesNotRecognizeSelector:", - "setInputBottomLineParams:", - NULL, - "stringFromDate:", - "_setNeedsDisplayForDropIndex:", - NULL, - "_attachedSupermenuView", - "connectionWithReceivePort:sendPort:", - "setStalenessInterval:", - "fontName", - "releaseLock:", - "createCGImage:", - "_propertyNamed:", - "endSecureMode", - "_checkPreAuth", - "accessibilitySetEnhancedUserInterfaceAttribute:", - NULL, - NULL, - "__move:context:", - "collection", - "_newRepresentation:", - "positionValueForAccessibleChildAtIndex:", - NULL, - NULL, - NULL, - "_hasSeenRightToLeft", - "getScale", - NULL, - "_validateCarbonNameAndCatalogInfo", - "minimizeSize:", - "currentGRLResolvedReconfiguredWindow:", - "includePhotosInVCards", - "addFontDescriptors:toCollection:", - "performSelector:onThread:withObject:waitUntilDone:", - NULL, - "setInputColor1:", - "texture", - "selectItem:atIndex:", - "URLProtocolDidFinishLoading:", - NULL, - "unionWith:", - "systemFontOfSize:", - "_justOrderOut", - "visibleLineCount", - "stringByAddingPercentEscapes", - "_createOutputConnectionsForInputConnection:", - "object:didRemoveObservance:", - "viewWillStartLiveResize", - "isAbstract", - "_windowMovedToPoint:", - "parseKey:", - "setValue:", - "_animateAtEndOfEvent", - "initWithElement:fauxParent:", - "maxPossiblePositionOfDividerAtIndex:", - "setProperty:withValue:", - "flattenIntoPath:", - "boundsForConnection:fromPoint:toPoint:", - "IKIPDrawNicelyScaledInRect:inView:operation:fraction:", - "containsObject:", - "_convertToNSRect:", - "_writeCacheFile:", - "browser:acceptDrop:atRow:column:dropOperation:", - "accessibilityAttachmentAtIndex:", - "stringWithContentsOfFile:", - "_isMoving", - "_setAnyUsage:", - "languageLevel", - "_setArrayContentInBackground:", - "_attributes:atPath:", - "changeWindowsItem:title:filename:", - "rewireDistributionListConfig:withPropertyValue:identifier:", - "rangeOfCharacterFromSet:options:", - "_installCarbonWindowEventHandlers", - NULL, - "addEntry:forKey:", - "shouldIgnorePanelFrameChanges", - "predicateOperatorType", - "reloadAllCellsData", - "defaultButtonTitle", - "writePostScriptWithLanguageEncodingConversion:", - "refreshUI", - "initWithPrincipal:", - "initWithCGColor:", - "initWithRow:tableColumn:", - "newestToggleFileWritingOperation", - "endPrimaryKeyGeneration", - "positiveInfinitySymbol", - "setWarningValue:", - "_scrollDown:", - "_isItemViewerMoveable:", - "_orderOutAllToolTipsImmediately:", - "_noteItemUserVisibilityPriorityChanged:", - "_queueForDealloc:", - "searchGroups", - "selectsAllWhenSettingContent", - "trackMouseForPopupMenuFormRepresentation:", - "updateSelectionFrame:", - "fixInvalidatedFocusForFocusView", - "_configureAndDrawImageWithRect:cellFrame:", - NULL, - "addKeyFrameAtTime:value:toTimeLine:preserveCurve:", - "_cancelDelayedKeyboardNavigationTabSwitch", - "convolveROI:forRect:", - "_stopAndTearDownGraph", - NULL, - "_previousNonHiddenColumnStartingAtColumn:", - "_recursiveDisplayViewsIntoLayersIfNeeded", - "createDirectoryAtAURL:andReturnResultCode:", - "_initWithNSImageSource:options:", - "rotateByAngle:", - "_newStringForIndexing", - "setPasswordFields:verify:original:", - "setPredicate:", - "dividerColor", - "conjoinedElementForProperty:keys:value:withComparison:", - "setNegativePrefix:", - "initWithContainerClassID:key:baseGetter:mutatingMethods:proxyClass:", - "sharedFontManager", - "suffixFieldPresent", - "windowRef", - "defaultKeyMarker", - NULL, - "setMovieVisualContext:", - "importCellsProgress", - "createTextureBufferFromPixelBuffer:target:bounds:options:", - "gotoNextPage", - "goBack:", - "setDoubleClickOpensEditPanel:", - "_updateFromPath:checkOnly:exists:", - "invalidateShape:", - "_mouseInGroup:", - "_newButtonOfClass:withNormalIconNamed:alternateIconNamed:action:", - "setHorizontalPagination:", - "alternateArrangeInFront:", - "isBordered", - "_lockfeContext", - "newWithCoder:zone:", - "_newItemFromItemIdentifier:requireImmediateLoad:willBeInsertedIntoToolbar:", - "_workerThread", - "_setUp", - NULL, - "showPreviewIcon", - "shouldCloseWindowController:delegate:shouldCloseSelector:contextInfo:", - "physicalMemory", - "_infoForOSAError:", - "maxIndex", - "_timebarRect", - "getPropertyValue:", - NULL, - "initWithContentsOfMappedFile:", - "_scriptingIndicesOfObjectsAfterValidatingSpecifier:", - "uploadTextureWithBaseAddress:releaseCallback:releaseInfo:bytesPerRow:", - "initWithFocusedViewRect:", - "gotoSheetDidEnd:returnCode:contextInfo:", - "setSelectedRange:", - "specifierTraverseLink:", - "_newWildSubStringForGlob:wildStart:wildEnd:", - "_setupGridWithCompositions:", - "initForBasicPropertiesWithFile:", - "isCompiled", - "allowsFloats", - "_loadFromUDIfNecessary", - "_displayedPreviewType", - "colorWithDeviceWhite:alpha:", - "initWithInternalFilter:", - "setIsEnabled:", - "resetState", - "setInputRampParams:", - "startingIconSize", - NULL, - "kuwaharaNagaoROI:destRect:userInfo:", - "displayModeChanged:", - "drawArrow:highlight:", - NULL, - "updateSubmenu:", - NULL, - "firstLineHeadIndent", - "temporaryAttributesAtCharacterIndex:longestEffectiveRange:inRange:", - "multiplier", - "icon", - "hotspotAtIndex:", - "sendDidStopBuffering:originalLength:", - "_setUpFoundationTranslations", - "_performPreHandler", - NULL, - "_fetchExpandedFrameSize", - "setDisplayedProperty:", - NULL, - "unfocusView:", - "setCertificates:", - "zeroOrMoreDescriptionsForSubelementName:", - "decodePointForKey:", - "_beginLoadingImageForPerson:forClient:orCallback:withRefcon:", - "_calendarContentAttributedStringWithSelectedDays:", - NULL, - "_generateSQLForFunctionExpression:allowToMany:inContext:", - "_setZoomValueWithDisplay:", - "_setBaseClass:", - "_addColumnToFetch:", - "numberOfPlanes", - "displayFlags", - "_createTruncationToken", - "_GFLogMessage:", - "cleanUp", - "_unlockFocusNoRecursion", - "isNSValue__", - "_startAnimationWithThread:", - "setPreprocessorColor:", - "cardTypeNameString", - "setTitle:ofColumn:", - "_didChangeValue:forRelationship:named:withInverse:", - "_validateItem:value:inRow:", - "selectedTextAttributes", - "setInputExtent:", - "_setModeInformation", - "windowDidBecomeMain:", - "_isButtonBordered", - "setMinimumLineHeight:", - "isTestingInterface", - "addImagesWithPath:recursive:toArray:", - "wrappedOrigin", - "removeRecent:", - "_focusDidChange:", - "_startRunWithDuration:firingInterval:", - "accessibilityIsEnabledAttributeSettable", - "_accessibilityToolbarItemViewerConfiguration", - "accessibilityArrayAttributeCount:", - "formattedValueInObject:errorEncountered:error:", - "sharedPreferences", - "setCropSize:", - "valueWithPoint:", - "compatibilityVersion", - "_fixedFailureReasonFromError:", - "_compareMultiNoLabelDictionaryKeyWithRecordValue:", - "sweepThumbnailQueue", - "setSpacing:", - "_clientPort", - "flushCache", - "addSource:", - "setTransformedRange:", - "valueWithBytes:objCType:", - "locationOfPrintRect:", - "classForEntity:", - "extractSearchAttributeAndValueFromChild:", - "_isLastNameFirst", - "flushKeyBindings", - "countForIndexPath:", - "_isStringDrawingTextStorage", - "_setValue:forBinding:errorFallbackMessage:", - "_adaptSlideshowTimerFireDate", - "destination", - "threadDied:", - "textView:doubleClickedOnCell:inRect:", - "_resize:", - "_prepareString:expressionPath:sensitiveOptions:wildStart:wildEnd:allowToMany:", - "_autoscrollScreenEdgeFactorFromPoint:", - "deletePropertyValues:withKey:andSaveDistributionListConfigs:inRecord:withContext:", - "accessibilityIsOverflowButtonAttributeSettable", - "_setBindingCreationDelegate:", - "pressedImageForControlTint:", - "wantsToTrackMouseForEvent:inRect:ofView:atCharacterIndex:", - NULL, - "validMipmapItems", - "initWithDir:cString:", - "imageWithContentsOfURL:", - "removeCursorRect:cursor:", - "editableStateAtIndexPath:", - "_handleAEOpen:", - "_indexForMoveDown", - "iconView:acceptDrop:atIndex:", - "_stepInUpDirection:", - "_dispatch", - NULL, - "wrapMode", - "_updateLabel", - "convertTime:fromLayer:", - "_shouldParticipateInBatchOrdering:", - "_genericDragCursor", - "XMLDataWithOptions:", - "__setValue:forPortKey:", - "_lineFragmentRectForProposedRectArgs", - "_fireWithSelection:", - "_incrementUndoTransactionID", - "_usableFrameForScreen:", - "leftTabMarkerWithRulerView:location:", - "_setWantsMouseMoveEventsInBackground:", - "recursivelyPerformNextActions:index:count:", - "setCurrentBrowserType:", - "initWithTableView:clipRect:", - "thisIsMe:", - "accessibilitySplittersAttribute", - "hasShadow", - "_imageSizeWithSize:", - "selectInputMode:", - "_addCornerDirtyRectForRect:list:count:", - "findAttributeNamed:value:", - "selectedDirectoryResults", - "standardWindowButton:forStyleMask:", - "_changeLanguage:", - "tabletProximity:", - "__setNodeSelection:adjacentToNode:inputNodes:selectedList:", - "blendedColorWithFraction:ofColor:", - "_scrollPageInDirection:", - "imageRepWithContentsOfURL:", - "clickedCert:", - "_menuWillSendAction:", - "removePasswordUI:", - "mapTableWithStrongToWeakObjects", - "_deltaForResizingImageRepView:", - "hasOpenTransaction", - "initWithGRLs:withTrigger:withIndex:withWindow:withWindowGRL:", - "replacementObjectForKeyedArchiver:", - "initWithFrame:editorView:", - "_sqlTypeForAttributeDescription:", - NULL, - "abortSchedule", - "_scaleEffectForItemFrame:transitionWindow:", - "setAutosavesConfiguration:", - "_drawLineForGlyphRange:type:baselineOffset:lineFragmentRect:lineFragmentGlyphRange:containerOrigin:isStrikethrough:", - "maxThumbnailViewFrameSize", - "_DOMHTMLTableCellElementClass", - "_sendFinishLaunchingNotification", - "_createButtonWithTitle:", - "_compileShader:withSource:onContext:", - "stuckPixelEliminationROI:destRect:", - "retainWireCount", - "setRequiresDirectKeyValueCodingCall:partialControllerKey:partialObjectKey:", - "freeTemporaryCacheProgress", - "_adjustTextColorOfObject:mode:", - "_coreUIDrawOptionsWithFrame:inView:", - "setAvoidableSpecifier:path:", - NULL, - "_scrollColumnToVisible:requireCompletelyVisible:", - NULL, - "isNSSet__", - "acceptValuesOfClass:", - "nonretainedObjectValue", - "_sortLabelsUsing:", - "accessibilityEnhancedUserInterfaceAttribute", - "initWithWindow:windowRegion:", - "perform", - "subentitiesByName", - "_filterStringsForNode:", - "initForIncrementalLoad", - NULL, - "key", - "_setTableNestingLevel:", - "_writeVersionsAndEncodings", - "isSuccessful", - "nextEscapedCharacter", - "_userInfo", - NULL, - NULL, - "setAttribute:value:", - "capsulePathInRect:", - "acceptsStyleChanges", - "willSetLineFragmentRect:forGlyphRange:usedRect:", - "imageState:image:options:", - "clearCachedPropertyValuesWithKey:", - "checkForRemovableMedia", - "initWithLocalFile:", - "collapsed", - "paddingPosition", - "compatibilityIssueCheck", - "getCaretPositions:forGlyph:maximumLength:", - "setUsesThreadedAnimation:", - "screenFontWithRenderingMode:", - "_addTracking", - NULL, - "_totalNominalTabsLengthWithOverlap:", - "_calendarHeaderFont", - "_forceFixAttributes", - "_finishModalOperation", - "cameraIsBusy", - NULL, - "_otherItemClick:", - NULL, - NULL, - "visitPredicateExpression:", - "unixToTypeName:", - "willChangeValuesForArrangedKeys:objectKeys:indexKeys:", - "getCountBadgeForCount:", - "_valueForKeyPath:ofObjectAtIndexPath:", - "_performActionWithCommitEditing:didCommit:contextInfo:", - "gridStyleMask", - "uniqueNodeForIndexes:count:indexPath:", - "transactionAborted:", - "stopSlideshow", - "_alignRect:force:", - "supportedRenderedTexturePixelFormats", - "_selectPart:", - "isLessThanOrEqualTo:", - "boundingRectForGlyphRange:inTextContainer:", - NULL, - "archive:contentsForEntryName:", - "setUserColumnResizingAutoresizesWindow:", - "_endTransitionWithLayer:", - "_dragCanBeginFromVerticalMouseMotion", - "_fullWidth", - "_createPDFImageRep", - "markers", - "gain", - NULL, - "_rowIndexForRowObject:", - "stopSlideshow:", - "_saveToURL:ofType:forSaveOperation:didSaveSelector:scriptCommand:", - "borderColorForEdge:", - "_setEventRef:", - NULL, - "_setFocusRingNeedsDisplay", - "addProperty:", - "subviews", - "arrayWithArray:copyItems:", - "getNumActiveProcessors", - "setBoundsAsQDRect:", - "initWithStore:fromArchivedData:", - "_initForPropFindWithDepth:lookingForProps:", - "receiveMessage:name:attributes:", - "activate", - "initWithURL:byReference:", - "titleBarFontOfSize:", - "characterBoundsAtIndex:", - "_ensureQueue", - "setHorizontalRulerView:", - NULL, - "sessionID", - NULL, - "fontPanelDidChooseFamily:", - "_trackingAreaInfoForTrackingRectTag:", - NULL, - "_initializeDTD:fromTidyNode:", - "setValueListAttributes:", - "addBinding:fromObject:", - "regionOf:destRect:userInfo:", - "operand", - "_createConnectionForOutput:fromInputConnection:error:", - "initWithUnavoidableSpecifier:path:url:isSymbolicLink:", - "IKGetComponentsRed:green:blue:alpha:", - "viewWillMoveToWindow:", - "setRelationshipCaches:", - "playButtonFrame", - "openRootForEditing", - "get:count:algorithm:", - "initWithAttributes:range:", - "attributesForPropertyPortWithKey:", - "currentModeView", - "_validateNewWidthOfColumn:width:", - "drawer:didChangeToState:", - "_trimWithCharacterSet:", - "_predicateOptionPairForBinding:", - "dataReferenceEnumerator", - "_writeRTFDInRanges:toPasteboard:", - "_convertPos:AndLen:", - "urlForModelVersionWithName:", - NULL, - "minFrameWidthWithTitle:styleMask:", - "setRootElement:", - "_isDingbats", - NULL, - "initWithFrame:optionFlags:", - "addTooltips", - "removeValueForProperty:", - "orderFrontTablePanel:", - "setStartAlpha:endAlpha:duration:", - "initWithInputController:", - NULL, - "allUniqueIds", - "internationalCurrencySymbol", - "foreignEntityKey", - "_createOtherValueGetterWithContainerClassID:key:", - NULL, - "_setWithOffset:", - "_fullPanelSetupIfNecessary", - "bestRepresentationForDevice:", - "enterCropMode", - "scheduleTaskPriority", - "configureForSortedByFileProperty:ascending:caseSensitive:", - "_setCenterPoint:", - "_slideShowItemAtIndex:", - "_ensureNoFetchInProgress", - "startTracking:", - "addAttribute:", - "_old_encodeWithCoder_NSTabView:", - NULL, - "bezierPathWithRect:", - "_titlebarHeight:", - NULL, - "_allocatePPDStuffAndParse", - "shouldFetchImageForEmail:withCacheDate:", - "isConfiguration:compatibleWithStoreMetadata:", - NULL, - "_computeToolbarItemKeyboardLoopIfNecessary", - NULL, - "setValueToDefault", - "setProps:forIndex:", - "showPanel", - "typeStringForColumn:", - NULL, - NULL, - "orderFrontLinkPanel:", - "setGlyphRange:characterRange:", - "filterChanged:", - "setBounds:forBox:", - "setActionState:", - "widgetCenterForResolutionData:", - "setCurrentSearchRow:", - "applicationDockMenu:", - "initForMetal:style:topHeight:bottomHeight:", - "accessibilityMinimizeButtonAttribute", - "objectForServicePath:app:doLaunch:limitDate:basePortName:", - NULL, - "addCellWithSettings:data:type:profile:index0:index1:index2:", - "_handleAEPrintDocuments:withSettings:showPrintPanels:", - "zoomToActualSize", - "saveMetadata:", - "guessesForWord:", - "openGLContext", - "_setDisabledTextColor:", - "usesFontLeading", - NULL, - "internalWritePath:errorHandler:remapContents:hardLinkPath:", - "catalogNameComponent", - "_stopTooltips", - "removeHeartBeatView:", - "removeTrackingRect:", - "indexOfAttributeBySelector:equalToObject:", - "setFullscreenController:", - "_nts_CalculatePropertyTypeForRecord:", - NULL, - NULL, - "connectionWithRegisteredName:host:", - "unmounted:", - "_dataSourceValueForColumn:row:", - "_setOverflowHeaderCellPrototype:", - "_preflightCrossCheck", - "getAttributeFirstValue:allowBinary:", - NULL, - "daylightSavingTimeOffsetForDate:", - "availableUserServers", - "_disposeMovieController", - NULL, - "sortDescriptors", - "createSymbolicLinkAtPath:pathContent:", - "_sheetEffectInset", - "_initWithName:URI:prefixIndex:", - "accessibilityIsAttributeSettable:", - "operationGroup", - "fullName", - "sourceTypes", - "cancelDelayedPerformWithTarget:selector:", - "stopPlay", - "correlationAlias", - NULL, - "decodeRetainedObject", - "outlineView:dataCellForTableColumn:byItem:", - "_ensureLayoutCompleteForVisibleRectWithExtension:", - "truncateFromPosition:", - "setAcceptsGlyphInfo:", - "timeOffset", - "applyWithManager:buffer:transformation:bounds:options:", - "setAllowsGroupEditing:", - "_localStoreContainingObjectID:", - "_resizeAllCaches", - "_keyViewFollowingOpacityViews", - "selectionDidChange", - "regionWithRect:", - "setBoolParameterValue:to:", - "pointerFunctionsWithOptions:", - NULL, - "_setKeychainFullPathName:", - "destinationOfSymbolicLinkAtPath:error:", - NULL, - "textureROI:forRect:", - "accessibilityIsSharedTextUIElementsAttributeSettable", - "_releaseAllCapturedScreens:", - "noteFileSystemChanged:", - "setRefusesFirstResponder:", - "leftExpressions", - "_daylightSavingTimeOffsetForAbsoluteTime:", - "_findRecord:ofType:", - "_updateDimensions", - NULL, - "insertTextContainer:atIndex:", - "_storeIdentifier", - "initWithProvider:imageManager:pixelFormat:transformation:bounds:colorSpace:options:", - "setWindow:", - "deletedPeople", - "_handleErrorCallbackWithParams:", - "canGoIntoSelectedDirectory", - "_needToFlushGlyph", - "processText:", - NULL, - "_controllerKeys", - "itemDelta", - "_referenceBindingValueAtIndexPath:", - "printDocumentWithSettings:showPrintPanel:delegate:didPrintSelector:contextInfo:", - NULL, - "managerForSourceModel:destinationModel:error:", - "_disabledTextColor", - "nts_AddMembersAndSubgroupsFromDictionaryRepresentation:withRecordMapping:recordsByUniqueId:", - "_setToolTip:forView:cell:rect:owner:ownerIsDisplayDelegate:userData:", - "edit:", - "publish", - "removeObject:inRange:", - "_mouseDownOnSlice:withEvent:", - "_insertionPointHelperForGlyphAtIndex:", - "useCoreUI", - "setRect:", - "intype", - "_mouseUp:", - "initWithTextStorage:range:", - "addCommon:docInfo:value:zone:", - "searchRecordClasses", - "_writeCharacterAttributes:", - "_dropHighlightEdgeColor", - "isTakingPicture", - "_drawMenuFrame:", - "_hasMultipleLinesOfText", - "validateObjectValue:", - "createPageArray", - "_reserved_SFChooseIdentityPanel", - "mouseEventWithType:location:modifierFlags:timestamp:windowNumber:context:eventNumber:clickCount:pressure:", - "findString", - "_updateTearOffPositionWithScreenPoint:", - "numberOfItems", - "rowCache", - "_isKVOA", - "willRemoveSubview:", - "menuChanged:", - "_addItem:toTable:", - "_closeForkAsync:", - "_nestingModeShouldHideSubtractButton", - NULL, - "insertAttribute:intoView:anchorPosition:forFilter:settings:configuration:objectController:", - "resignFirstResponder", - "writeToFile:atomically:error:", - "arrayWithResultsOf:", - "totalRequestedMemoryOfType:rendererID:", - "_setAEDesc:", - "handleSwitchToColumnsOnlyFrom:animate:", - NULL, - "setDomain:", - "_conflictsWithRowCacheForObject:andStore:", - "_isSmartGroupParentOfRecord:", - "frontWindow", - "fill", - "foundMatch", - "setURL:", - "finishProvideNewSubviewSetup", - "addFileButton:", - "__oldnf_stringWithSeparator:atFrequency:", - "_detectTrackingMenuChangeWithScreenPoint:", - "isRoomWellLit", - "_handleOptimisticLockingError:withError:", - "supportsCommand:", - "setMenu:", - "createDirectoryAtAURL:", - "setBorderWidth:", - "insertIdentityGroupsInDisplayedGroups", - "_old_encodeWithCoder_NSBrowser:", - "_postEventNotification:fromCell:", - NULL, - "_containsValue:", - NULL, - "viewDidMoveToSuperview", - "inputNeutralChromaticityY", - "attributesForCharacterIndex:lineHeightRectangle:", - "_windowWillClose:", - "_slideShowItemValidAtIndex:", - "characterCollection", - "setCharacters:", - "windowFrameTextColor", - "documentDidBeginPageFind:", - "_setRowSpan:", - "shouldUseOriginalLayerToDraw", - "_cfNormalize:", - "findRecordNames:ofType:matchType:", - NULL, - NULL, - "setStyle:", - "moveRight:", - "_isSymbol", - "_menuLocationHorizontalOffset", - "_queryOrderLocalizedDictionaries:withParent:", - "_clearMarkedRange", - "segmentCount", - "_windowBorderThickness", - "previewPanel:syncDisplayState:forURL:", - "_effectiveFocusRingType", - "setOriginOffset:", - "flattenMipmapItemIfNeededAndFreeUselessAdditionalCaches:withUID:", - "shadowComponent", - "_runCustomizationPanel", - "_invalidateGlyphsForExtendedCharacterRange:changeInLength:", - "_setClipIndicatorItemsFromItemViewers:", - "cacheData", - "SCTImageNamed:", - "_setupNormalFileListModeControl", - "_setInputRampParams:", - "_parseMain:", - "_setBackgroundColor:", - "_allowedItemIdentifiers", - "interpretKeyEvents:sender:", - "runOperationWithTimeOut:", - "_decodeDownloadData:", - "_parseCharacterAttributes1", - "symbolicLinkDestination", - NULL, - "connection:willStopBufferingData:", - NULL, - "msgid", - "destroyVisualContext", - "percentSymbol", - "_rawAddColor:key:", - "insertPageBreak:", - "help:", - "editorWithObject:", - "capacity", - "drawDebugGrid", - "dispatchNameSelection:", - "updateCell:", - "_mutableSetValueForKeyPath:ofObjectAtIndex:", - "setImages:", - "goForwardInHistoryIfPossible", - "clearClipping", - NULL, - "initWithCGLContext:pixelFormat:colorSpace:patch:", - "_insertText:forInputManager:", - "_sceneChangeType", - "_freeCache:", - "orderString:string:flags:", - "noteDirectoriesListChanged", - "_clockAndCalendarRetreatMonth:", - "insertPointer:atIndex:", - "_isNonactivatingPanel", - "_unitsForRulerLocation:", - "_loadData", - "dontExportCurrentItemToiPhoto", - "appendData:", - "selectRow:inColumn:", - "linkItemAtPath:toPath:error:", - "containsDayGranularityDate:forDatePickerCell:", - "searchSliceType", - NULL, - "drawTab:title:enabled:", - "_colorWithHue:", - "stopUsingDevice", - "runInitialization", - "objectByTranslatingDescriptor:toType:inSuite:", - "_pageFormatForSetting", - "downloadProgress", - "_rowHeightStorageBeginLayoutChange", - "_updateAttributesFromAudioChannelVolumesFromPropertyListener", - "setCertificationPathDisclosed:", - "backgroundWindow", - "moveWordLeft:", - "insertionPointColor", - "absoluteURL", - "_zoomWithSpeedFactorForX:speedFactorForY:", - "_invalidateImageTypeCaches", - "trackMagnifierForPanel:", - "persistentStores", - "setAppearance:", - "encodeLong:forKey:", - "accessibilityHeaderAttribute", - "dataCellForRow:", - "_setOriginalString:range:", - "_internalInit", - NULL, - "currentFilterURL", - "mainRunLoop", - "typeForParameter:", - "_createCells", - "_startInsertionOptimization", - "setRetainedObject:", - "textUnfilteredTypes", - "removeServer:", - "setWrapped:", - "searchField", - "_setUndoRedoInProgress:", - "check:", - "IK_GIFRepresentation", - "transformedImage:", - NULL, - "viewsNeedDisplay", - "accessibilityWindowPointForShowMenu", - "initWithPerson:", - "_entityMapping", - "absolutePathForAppBundleWithIdentifier:", - "_cachedDocumentPreviewForURL:", - "serializeAlignedBytes:length:", - "setDragWindowImage:", - "setStringValue:", - "_showEffects", - "dateWithNaturalLanguageString:date:locale:", - "_computeDisplayedSizeOfString:", - "setMinimalSizeForText:", - "menuZone", - "_updateLengthAndSelectedRange:", - "_thumbnailDone:", - NULL, - "startFadeout:", - "elementAtIndex:associatedPoints:", - "_isPresent", - "vmUsagePolicy", - "mipmapItem", - "_sizeModeIsValidForCurrentDisplayMode:", - "inputKeyBindingManager", - "_desiredKeyEquivalent", - "updateCountLabel", - "defaultFontSize", - "visitPredicate:", - "addJoinForToOneRelationship:sourcePath:destinationPath:", - "_attributesFromRangeViaGetSelectedText:", - "imageRepWithCGImage:", - "_allowAnimated_replaceSubview:with:", - NULL, - NULL, - "setPrimitiveAppleUseCoreUI:", - "_canImportGraphics", - "subdataWithRange:", - "_preventsActivation", - "addPreferenceNamed:owner:", - "_addTimer:", - "openTooltipOnWindow:withText:atLocation:alignment:", - "mapTableWithStrongToStrongObjects", - "removeConnection:", - "accessibilityIsChildOfApp", - "setAsynchronous:", - "_pmKeyForKey:", - "fontDescriptorWithName:size:", - "_drawTitleStringIn:withColor:", - "_setProxyPort:", - "displayNameForType:", - "_validateDeclarationString:forKey:", - "active", - "buttonResult:buttonImage:inlayImage:highlightImage:figure:stripeGradient:phase:", - "_setTrackingRects", - "filenameToDrag:", - "display", - "initWithFigFormatDescription:", - "_dragImageForIndices:", - "setIsMe:", - "_updateDataCellControlView", - "registerPort:name:", - "iconType", - "distributionIdentifierForProperty:person:", - "drawRect:withLineWidth:", - NULL, - "_maxYWindowBorderHeight", - "guessDockTitle:", - "netServiceBrowser:didFindDomain:moreComing:", - "_modelPathsFromBundles:", - NULL, - "diacriticInsensitiveOption", - "performActivity:modes:", - "copyPreviewIcon", - "__undoableMove:context:", - "hideShowLastImport:", - "setCurrentVoiceIdentifier:", - "_colorWithGradientImage:", - "concat:", - "inputDevices", - "_setKeyboardFocusRingNeedsDisplayForCellInRect:", - NULL, - NULL, - "_predicateForYearlessSearchOnDatePropertyKeyPath:toManyRelationshipName:futureOnly:allNotMatch:customPropertyPath:customProperty:searchValue:label:", - "_getSymbolForType:", - "propertyTableCount", - "_bottomRightResizeCursor", - "finishEncoding", - "appendLabel:toVCardRep:inGroup:", - "usingActiveDirectory", - "thumbnailInfoFromMipmapItem:fromMipmap:", - "encodeQTTimeRange:forKey:", - "_handleMouseEvent:numberOfObjects:startingPoint:commandKey:shiftKey:rubberband:", - "_setDrawDelegate:", - "setSingleFieldVideo:", - "getCompression:factor:", - "renameCollection:newName:", - "allowsSubrowSelection", - "setVisualMovieBoxBackgroundColor:", - "_datePreferencesChanged:", - "_makeWindowsPerform:forEvent:inWindow:standardWindowButton:", - "bounds", - "attributedSubstringForProposedRange:actualRange:", - "accessibilityClearButtonAttribute", - "_shouldFilterEntry:", - "_noteAttributes", - NULL, - "set_splitView:", - "_userSelectionIndexesForProposedSelection:", - "_lastDraggedOrUpEventFollowing:canceled:", - "_orderFrontRelativeToWindow:", - "handleAnimateScrollFromPt:toPt:", - "commitAllAdditionsToIPhoto", - "drawTitle:", - "hasVerticalRuler", - "revealText", - "isLenient", - "_disposeBackingStore", - NULL, - "_prepareNicestDraw:", - "renderAtTime:arguments:", - NULL, - "doubleClickOpensEditPanel", - "_inHideFaceMode", - "cancelScheduleSyncPageIndex", - "insertObjectsIntoMasterArrayRelationship:atIndexes:selectionMode:", - "protocols", - "prepareBeginsWith:", - "_web_initWithDomain:code:failingURL:", - "location", - "_initializeReader", - "dataSourcePath", - NULL, - NULL, - "normalURLString", - "mutableSetValueForBinding:resolveMarkersToPlaceholders:", - "selectionStart", - "loadColumnZero", - "updateSelectionListWithNewSelectionIndexes:withModifier:", - "freeUselessAdditionalCaches:", - "_menuForNode:", - "_clearCGImageRefIfNotPrimary", - "_canOptimizeDrawing", - "cellForRow:column:tableView:", - "analysisDidFinish:", - "stringArrayForKey:", - "setEntities:forConfiguration:", - "stringValueForFieldNamed:", - "outputConnectionFormatDescriptionDidChange:", - "_blocksActionWhenModal:", - "initWithFilterInfo:upperItem:", - "nts_initWithUniqueId:addressBook:", - "cellSize", - "_newImageName:", - "autoforwardsScrollWheelEvents", - "EPSOperationWithView:insideRect:toData:", - "negativeInfinitySymbol", - "measurementUnits", - "_newObjectForContainer:inValueForKey:withClassDescription:", - "_setDescriptorNoCopy:", - "setColumnTitle:forProperty:", - "whatIsKeyType:", - "initWithCGLContext:pixelFormat:options:", - "setIntParameterValue:to:inResolutionData:", - "trackCount", - "expandItem:", - "_compareMultiLabelArrayWithRecordValue:", - "moviePort", - "signInvitationFile:outPath:", - "setCurrentWindow:", - "_setValidatedPosixName:", - "SCTPerformSelector:withObjectsFromArray:", - NULL, - "_handleSyncCallbackWithMessage:", - "_truncatesLastLine", - "actualRowIndexWithGroupIndex:", - "_registerCoreDataStoreClass:forStoreType:", - NULL, - "_initSessionDataWithHost:port:scheme:", - "didCreateSchema", - "initWithName:password:owner:applicationID:", - "proxyForRulebookServer", - "_createShaders:", - "_debugLoggingLevel", - "_didUnmountDeviceAtPath:", - "disposeData", - "_appIcon", - "initIOKitNotifications", - "loadPopup:names:skip:current:", - "_randomIndexForCount:", - "initWithFrame:useToolbar:", - "splitView:didMoveDivider:distance:", - "controlLightHighlightColor", - "setFirstNameNormalized:", - "_locationsForApplications", - "setAutoupdate:", - "hideToolTipWindow", - "rightMouseUpDelegate:", - "_windowsForMenu:", - "_inResize:", - NULL, - "primaryKey", - "shouldCascadeWindows", - "insertObject:atIndex:", - "initMakePathWithSession:path:", - "setComposer:", - "sourceSize", - "initWithDescriptorType:bytes:length:", - NULL, - NULL, - "_finishPendingEdit", - "labelOnlyMenuDidSendActionNotification:", - "typeForKey:", - "restoreResolutionData:from:", - "_setKeySize:", - "initWithX:Y:Z:", - NULL, - "_setOwnedByPopUp:", - "_itemAtIndex:", - "subexpression", - NULL, - "_initWithOptionFlags:maxSize:maxAge:resources:maxResources:parent:root:function:userInfo:userInfoReleaseCallback:md5List:md5Indices:md5Count:", - "_setWantsToolbarContextMenu:", - "setUndoAttributes:", - "_cancelWithError:", - "shouldPreserveDisplayStateWhenNavigating", - "_renameFontDescriptorWithName:to:in:", - "_handleValidationError:description:inEditor:errorUserInterfaceHandled:bindingAdaptor:", - "clearMarkedRange", - "isShowAllItem", - "_setSearchResultsCountTo:", - "initWithBytes:length:copy:freeWhenDone:bytesAreVM:", - "alloc", - "mappingType", - "getValue:", - "_clear", - "isSuspended", - "setLoadItemIndex:", - "_sound", - "_handleArrowMovementForChar:", - NULL, - "preferredMuted", - "findVoiceByIdentifier:returningCreator:returningID:", - "documentDidFindMatch:", - NULL, - "previewDocumentFrame", - "serializedValueForStateKey:", - "recordDatabaseOperation:", - "threadedFindGRLsContainingString:limitResultsTo:", - "_initWithType:error:", - "print:", - "addTrack:copyMedia:error:", - "_setStandardLocalizer:", - "enqueueNotification:postingStyle:", - "dragRectForFrameRect:", - "_initUI", - "reverseTransformedValue:", - NULL, - "year", - "_applicableArrowLocation", - "sliderCallback:", - "nts_ClearCachedRecordsByUniqueId", - "setDefaultTextColor:", - "setRequestBodyWithData:", - "isPrimary", - "newWithOutputIntents:quartzFilter:", - "_restoreOrBecomeFirstResponder", - "runModalForSettings:keychain:", - "hostingWindow", - "_fontFromBindingsWithMode:referenceFont:fallbackFont:", - "isProtected", - NULL, - "datePickerElements", - "sendCBEvent:withData:", - "_initWithThemeType:", - "setContainerIsObjectBeingTested:", - "branchImage", - "parseABShowAs", - "_handleAEReopen", - "_000101:", - "setAvoidCrossing:", - "setLinkInWindow:string:delegate:", - "_prepPanel:message:showGroup:", - "enumeratorOfAppleUseCoreUI", - "mipmapImage", - "_getVRefNumForPath:", - "selectionRectAdded:", - "_prefix", - "ourViewWasDisclosed:", - "openCategoryFileForEditing:", - "setScriptCommand:", - "initWithInstrument:pitch:velocity:", - "_initSidebarAndPopups", - "lockDelegate", - "allowsDirectoriesSearches", - "_scriptFlagsForKey:containFlag:", - NULL, - NULL, - "URIRepresentation", - NULL, - NULL, - "printPanel", - "unarchiverDidFinish:", - "windowDidChangeKeyState:", - "setSource:ofType:", - NULL, - "directTakePicture", - NULL, - NULL, - "_redisplayColorProfileButtonIfNeeded", - "setStateToSelected", - "initWithCGRect:", - "releaseView:", - "editingColorAdjustableObject:", - "convertPoint:toView:", - "setFont:range:", - "_checkGrammarOfString:startingAt:language:wrap:inSpellDocumentWithTag:details:reconnectOnError:", - "setImageRep:forItemIdentifiers:", - "invalidateResourceCache", - NULL, - "scriptErrorString", - "displayNameForIndex:", - "suiteName", - "initWithAppleEventCode:presentableDescription:name:", - "objectZone", - "_setZoomFactor:centerPoint:", - NULL, - "showAll:", - "setBoundsRect:forTextBlock:glyphRange:", - "directoriesSelectionChanged:", - "cglContext", - "_getFocusRingFrame", - "delegateBased", - "findSubscriptionWithRemoteLocation:addressBook:", - "_createValuePrimitiveGetterWithContainerClassID:key:", - "FilterHelpButton", - "deselectSelectedCell", - "_canFocusCellAtRow:column:", - "stringValueSubstitutingEntitiesForNode:ranges:names:objectValue:", - "searchSubscribed", - "setSearchField:", - "_handleMessage:from:socket:", - "_keyFromName:", - "_ikThumbnailImage", - "removeControl:", - "attributesForKeyPath:", - "setValue:forKey:forCell:", - "_setSidebarWidth:maintainSnap:constrain:", - "_crayonRowAboveRow:", - "_getRenderedBufferWithContext:", - "initWithCIImage:", - "pathForNode:", - "originalItem", - "changeCount", - "_subentityNamed:", - "_createOutlineDelegate", - "clearCachedPropertyValue:withKey:", - "_convertPointToSuperview:", - "pixelFormatM_I16", - "_isGeneratedClass_1", - NULL, - "middleName", - "_readRTFDIntoRanges:fromPasteboard:", - "tagList", - "transform:", - NULL, - "_createGroup:", - "printRect:", - NULL, - "imageRepresentationForPage:scaleFactor:", - "_newObjectGraphStyleForSQLRow:withObject:", - "selectedValues", - "rendererVendor", - "accessibilityIsFocusedUIElementAttributeSettable", - "_setVerticallyCentered:", - NULL, - "defaultTokenizingCharacterSet", - "isInMotion", - "keyWithAppleEventCode:", - "parser:didStartElement:namespaceURI:qualifiedName:attributes:", - "setLevel:", - "hasFocus", - "reset", - "_superviewClipViewFrameChanged:", - "initWithActionDictionary:forDocument:", - "removeObject:", - "nodeWithFBENode:", - "_scriptingDateWithDescriptor:", - "_removePreviousPointersToMe", - "filterWithGenerator:", - "setupResources", - "setIndentation:", - "tabViewItemAtIndex:", - "_stepperCellTopAndBottomTrim", - "setImageProperties:imageUTType:", - "_discardEventsWithMask:eventTime:", - "qt_localizedErrorWithDomain:code:userInfo:", - "supportsMode:", - "compatibilityIssueChanged", - NULL, - "_changeWasDone:", - "initWithRTFD:", - "setConditionallySetsEnabled:", - "_newItemFromInitPListWithItemIdentifier:", - "setNotANumberSymbol:", - "parseDistributionPoint:", - "boundingRectWithExtraEffects:", - "setPrimitiveModificationDateYearless:", - "removeFromCache:resolution:", - "_cleanUpAfterTransaction", - "isNativeType:", - "_prepareContentWithNewObject:", - "_setCachedMembers:", - "filesystemItemRemoveOperationWithPath:", - "scrollHorizontalBy:", - "removeKeyFrame:", - "nextItemDelta", - "indexOfTabViewItem:", - "_selectCell:inColumn:", - "correlation", - "_removeObject:objectIDMap:", - "toggleAutomaticLinkDetection:", - "addObserver:selector:name:object:", - "sourceDictionary", - "statusBar", - "setToolTip:", - "grls", - "_configureForShowingInPanel", - "_poppedTopHandling", - "_currentAttachmentRect", - "updateThumbnailForLayer:fromThumbnail:", - "doTextEntered:", - "_allowAnimated_setContentFilters:", - NULL, - "_drawScrollViewFocusRing:clipRect:needsFullDisplay:", - "setDrawsTrackAsColorScaleType:", - "currentClipRect", - "forgetRowForObjectID:", - "_nameWithStrictRequiredExtensionCheck:", - "halfSizePicture:pattern:image:", - "_setActsAsPalette:forToolbar:", - "unlockRequestWithSession:URI:lockToken:", - "nts_CreateSharedAddressBook", - "setValues:", - "countdownTabView", - "dsDataBuffer", - "documentAttributes", - "numLines", - "carbonPickerWindow", - "stream:handleEvent:", - "subscription", - "isBindingKeyOptional:", - "shadowOpacity", - "QTTimeValue", - "_stopPeriodicEventsForSource:", - "whiteDeviceColor", - "_setFocusForCell:forView:withFrame:withFocusRingFrame:withInset:", - "_groupsOnly", - "findRecordTypes", - "columnAtIndex:", - "_updatedPorts:", - "_registerForNotificationsWithCoordinator:", - "_coreUILinearDirection:", - NULL, - "didChangeValue", - "_transformationForString:dictionary:", - "extendSelectionAtEnd:", - "_windowWillGoAway:", - "numberOfMajorTickMarks", - "_table", - "_setMouseMovedEventsEnabled:", - "setMaxCount:", - "selectionBounds", - NULL, - NULL, - "_setBackgroundStyle:", - "_popupImage", - "validateFindPanelAction:forClient:", - NULL, - "getState:", - "authorizationViewReleasedAuthorization:", - "_stopAnimation:", - "initForLayer:imageLayer:flags:", - "deactivate", - "_maxXTitlebarWidgetInset", - "scriptingContains:", - "_partAtLocation:", - "parentNode", - "initWithPredicateOperator:leftExpression:rightExpression:", - "isRemovedOnCompletion", - NULL, - "handleDelegateMovedDiplayedProperty:toIndex:", - "setThreadPriority:", - "removeSuiteNamed:", - "_setInputWhiteParams:", - "nts_UpdateDateRelatedSmartGroups", - "_tableView:willRemoveTableColumn:", - "fileManager:shouldCopyItemAtPath:toPath:", - "_isCtrlAltForHelpDesired", - "setCache:", - "currentButtonClicked:", - NULL, - "_setIsEditable:", - "isDirectory", - "_sendDelegateSelectionIndexesForProposedSelection:", - "_numericIndicatorCell", - "assign:key:", - "_updateSize", - "_suiteDescriptionsByName", - "_prepareConst:inToMany:", - "rawFormat", - "setEmpty", - "importedObjects", - "waitImage:", - "_invokeDidChange:", - "initWithColorProfile:", - NULL, - "accessibilityIsSizeAttributeSettable", - "initWithClass:", - "_deleteMetaDataForPeople:withLock:", - "frameEndTime:", - "vectorWithX:Y:", - "realAddDirNamed:", - "_lookUpIndefiniteRangeInDictionaryFromMenu:", - "colorForIndex:", - "isHorizontallyCentered", - "itemObjectValueAtIndex:", - "jobDisposition", - "pasteRuler:", - "rulerView:shouldAddMarker:", - "backupFileExtension", - "_clearRollOver", - NULL, - "_rowEntryForRow:requiredRowEntryLoadMask:", - "endSetup", - "_collapseAutoExpandedItems:", - "tokenBackgroundColor", - "_workspaceSessionIsActive", - "exactSizeToCellsSize", - "ruleEditor", - "setSidebarIsOpen:", - "_canUserSetVisibilityPriority", - "setAlternateTitleWithMnemonic:", - "_startObservingSelectionIfNecessary", - "_keyValueBindingAccessPoints", - "menuItemCellForItemAtIndex:", - "_sizeWithSize:attributes:", - "setAllowsEditingMultipleValuesSelection:", - "_sizeListChanged:", - "_trackAttachmentClick:characterIndex:glyphIndex:attachmentCell:", - "copyDictionary", - "lineBreakMode", - "isIndexed", - "_popupSelectionAction:", - "changeAffineTransform:", - "_adjustTrailingNewline", - "_internalNetServiceBrowser", - "updateInvalidatedTextColor:forObject:", - "scheduleInRunLoop:forMode:", - "rollbackTransaction", - "trim:", - "_typesFilterableFromType:", - "exceptionDuringOperation:error:leftOperand:rightOperand:", - "heightAdjustLimit", - "DTD", - "objectIDAtIndex:", - "addAddressMultiValues", - "takeFloatValueFrom:", - "movieUnfilteredFileTypes", - "setInputOrder:forKey:", - "_lastScopeButtonX", - "accessibilityHitTest", - "newCreateIndexStatementForColumn:", - "initWithProtectionSpace:proposedCredential:previousFailureCount:failureResponse:error:sender:", - "defaultCStringEncoding", - "keyWindowChanged:", - NULL, - "_rowButtonsInterviewHorizontalPadding", - "dictionaryInfo:", - "_prepareEffectsUndo:", - "setDefaultInformation:", - "makeUntitledDocumentOfType:", - "_shouldUseTrackingAreasForToolTips", - "_multipleValueForKeyPath:atIndexPath:", - "setFBENode:", - "populateIdentifiers:values:labels:primaryIdentifier:withDataFromRecord:managedObject:property:", - "_sheetEffect", - "updatePreviewFrame", - "cellsStyleMask", - "_draggableFrame", - "writeDateDocumentAttribute:withRTFKeyword:", - "setObject:forDatabaseKey:", - NULL, - "_lightYellowColor", - "tagName", - "fillsPicker", - "setSidebarOnRight:", - "windowsMenu", - "parser:resolveExternalEntityName:systemID:", - "setToolbar:", - "_setFrameForAnimating:", - "supportsCorrelatedSubqueries", - "askSaveChangesWithFile:message:action:", - "writableTextFileTypesForDocumentTypes", - "tokenizeAppearanceString:", - "selection", - "viewWillDraw", - "mostCenteredImageIndex", - "_removeBinding:byReplacingWithRemainingBindingsInArray:", - "isEqualToNumber:", - NULL, - "_blueHighlightColor", - "quickTimeTrack", - "RTFDFileWrapper", - "beginUpdatePixels:colorSpace:", - "beginUploadTexture:colorSpace:virtualScreen:", - "_openBlocksForParagraphStyle:atIndex:inString:", - "changeCompanyStatus:", - NULL, - "_checkColumnsOnly", - "attributedStringForNotANumber", - "_sendCommitEditingSelectorToTarget:sender:selector:flag:contextInfo:delayed:", - "createMetadata", - "initWithFormat:arguments:", - "initWithRequest:cachedResponse:client:", - "_rowsInRectAssumingRowsCoverVisible:", - "currentMainStructure:", - "transformedValueClass", - "_isAncestorOfViewIdenticalTo:", - "movieEnumerator", - "_toggleOrderedFrontMostWillOrderOut", - "_setDragRef:", - NULL, - "keyForNode:", - "setPropagatesDeletesAtEndOfEvent:", - "addKeyFrameAtTime:value:preserveCurve:", - "iDiskUser", - "setPortKey:", - "_setHidesOnDeactivateInCache:forWindow:", - "_drawSelectionArea:", - "hasCropBox", - "_attachListener", - "_restoreDefaultSettingsCommon", - "allowLoadingOfUnsupportedPreviewTypes", - "reloadItem:", - "initWithSearchResult:", - "ruleEditor:predicatePartsForCriterion:withDisplayValue:inRow:", - "propertyDescription", - "controlView", - "boundingRectForGlyph:", - "isWrapped", - "predicateOperator", - "initializeComponents", - "setExtendedAttribute:forKey:atPath:error:", - "_tidyWithData:error:isXML:detectedEncoding:", - "_setLocalizationPolicy:", - "blueRange", - "removeObjectIdenticalTo:", - "cellsOutlineRed:green:blue:", - "_getComputedFloat:forNode:property:", - "_addOneRepFrom:toRep:", - "isGroup:parentOfRecord:", - "_setDisplayName:", - "_endToolbarEditingMode", - "startSequenceGrabber", - "integerForKey:", - "hiddenState", - "ISS__ay_postNotification:inThread:beforeDate:", - "expandedNodes", - "tabStops", - "addEntries:forKey:", - "_updateThumbnails", - "_createBrowserDelegate", - "doURLStuff:createdStubFile:error:options:", - "shouldCreateEmptyDatabase", - "_invalidateDateFormatter", - "handlePortCoder:", - "dispatchDoubleAction:", - "previousSibling", - "columnResizeButtonRect", - "_lineBreakMode", - "decimalNumberByAdding:withBehavior:", - "_adjustCharacterIndicesForRawGlyphRange:byDelta:", - "_promiseTypeNameForIdentifier:", - "_drawerBottomOffset", - "_prepareControllerTree", - "_isReferenceBinding:", - "_setCurrentActivation:", - "_scrollRectToVisible:fromView:", - "setAlternateImage:", - "IMService", - "_addListDefinition:forKey:", - "unableToSetNilForKey:", - NULL, - "changeDisplayedColorName:", - "setURI:", - "initWithData:error:", - "trackMarker:withMouseEvent:", - "rangesForUserParagraphAttributeChange", - "selectionRect", - "identifierForTimeLine:", - "displaysPageBreaks", - "ab_timeIntervalFromTodayYearLess", - "_autoscrollResponseMultiplier", - "_computeOrderedItemViewersOfType:inRange:resizeableOnly:", - "_createAddressFromSockaddrBuffer:", - "_allowsMultipleTextSelectionByMouse", - NULL, - "drawInContext:atPoint:withFontName:size:alignement:", - "_queryChild:ofItem:withRowType:", - "_stashOrigin:", - "_decrementSelectedSubfield", - "lastObject", - "lozengeROI:forRect:userInfo:", - "_drawUnifiedToolbar:", - "commitComposition:", - "sharedKeychainSettingsPanel", - "initWithCoreUIDrawOptions:size:", - "setKeyboardFocusRingNeedsDisplayIfNeededInRect:", - "drawTitle:withFrame:inView:", - "newStatementWithoutEntity", - "_initWithImage:optionsList:", - "cgImageFromSelection:", - "resetLDAPManager", - "_newUnknownItemWithItemIdentifier:", - "_setOptions:forBinding:", - "_indexForIncrementMove:", - "_scriptingEnumeratorOfType:withDescriptor:", - "_mergeChangesStoreUpdatesTrumpForObject:withRecord:", - "ignoresSSLCertificateErrors", - "isViewableByThisApp", - "SCTTitleColumnColor", - "releasePluginView:", - "_updateSubfieldStringsForDateChange", - "initWithAttributeDictionary:", - "getAllFiltersNotInCategories:", - "refreshColorProfile", - "_addTypeSelectAttributesForString:", - "interfaceStyle", - "caseInsensitiveCompare:", - NULL, - "entitiesByName", - "_webResourceClass", - "unselectItemsInRange:", - "rulerLineColor", - "setSearchString:", - "_sendingSocketForPort:", - "cancelButtonRectForBounds:", - "lineFragmentWidth", - "setOrder:forConsumerSubpatch:", - "_setDefaultButtonIndicatorNeedsDisplay", - "_setTabRect:", - NULL, - "draggingSource", - "fieldOfView", - "_sharedCertificatePanel", - "_startObservingUndoManagerNotifications", - "accessibilityCurrentEditor", - "resetTooltipView", - "decodeObjectForKey:", - "_updateAndWriteDictionaryAsNonSigned:newDictionary:", - "_createValueListQueryForAttribute:", - "_setToSMIME", - "isInteractive", - "saveFileName", - "selectItemWithTitle:", - "updateNote:changes:", - "_getVisibleRowRange:columnRange:", - "_changeSpellingToWord:", - "ikView", - "redo", - "createElementContentFromString:", - "_keyboardModifyRow:column:withEvent:", - "PDFOperationWithView:insideRect:toPath:printInfo:", - "parentContext", - "availableTypeFromArray:", - "adjustPageWidthNew:left:right:limit:", - "setShowsToolbarButton:", - "_peoplePickerSearch:", - "_setInlinePreviewVisible:animate:", - "classAttributes", - "_finalize_QCGraphicsContext", - "addSubpatch:", - "isBindingReadOnly:", - "__restorePosition:context:", - "setObservingBinder:", - "metadataColumns", - "accessibilityIsSelectedChildrenAttributeSettable", - "willChange:valuesAtIndexes:forKey:", - NULL, - "captionTextField", - "applyDisplayedValueHandleErrors:typeOfAlert:canRecoverFromErrors:discardEditingCallback:otherCallback:callbackContextInfo:didRunAlert:", - "_prepPanel:keychain:", - "_positionAllDrawers", - "getRects:count:", - "activeColorSpace", - "installPerspetiveViewportForPicking:location:", - NULL, - "setMovieClipRegion:", - "_copySource:toDestination:", - "_resizeTable:level:range:column:widthDelta:", - "_setDefaults:", - NULL, - "extensionsForMIMEType:", - NULL, - "parseForBasicProperties", - "setAutorecalculatesKeyViewLoop:", - "_addNumberOfIndexes:toSelectionIndexesAtIndex:sendObserverNotifications:", - "_hideHODWindow", - "_computePriorFirstResponder", - "_removeLayerIfOwnedByAppKit", - "imageBrowser:titleOfCellAtIndex:didEndEditing:", - "setAttributedString:", - "shouldDisableSync", - "fileDescriptor", - "setSidebarMode:", - "_currentDeadKeyChar", - "isFrontWindow", - "methodReturnLength", - "_layoutGlyphsInLayoutManager:startingAtGlyphIndex:maxNumberOfLineFragments:maxCharacterIndex:nextGlyphIndex:nextCharacterIndex:", - "updateWidth", - "setLocation:forStartOfGlyphRange:coalesceRuns:", - "shouldFlip", - "setDrawFocusRing:", - "browser:selectRow:inColumn:", - NULL, - "nts__isCompany", - "_posixPathComponentsWithPath:", - "roundedCornerRadius", - "createClassDescription", - "_forceKnowsPageRangeMessage", - "registerUndoWithTarget:selector:arguments:argumentCount:", - "bestRecordMatching:inPeople:", - "stepForward", - "_excludedFromVisibleWindowList", - "pushTextWidgetUndo", - "_setInactiveStateShowsRollovers:forSegment:", - "application:printFiles:withSettings:showPrintPanels:", - "_finalize_Noise", - "_postNotificationForEvent:notificationName:parent:child:fbeProperty:", - "_setMouseTrackingInRect:ofView:", - "updateRunLoop", - "recordPrimaryKey:forInsertedObject:withSQLEntity:", - "_makeSelfMutable", - "_createCacheNodeFromXMLElement:", - "countOfInputExtent", - "nodeEnumeratorWithMovie:", - "_characterIndexForMoveLeftFromSelectedRanges:", - "initWithMantissa:exponent:isNegative:", - "_nodeFromGraph:atIndex:", - "_getTiffImage:ownedBy:asImageRep:", - "_registerDragTypesLater", - "PDFRepresentation", - "setWithArray:", - "_systemTimeChanged", - "_doUserExpandOrCollapseOfItem:isExpand:optionKeyWasDown:", - NULL, - "insertEntity:intoOrderingArray:withDependencies:processingSet:", - "quartzFilterWithProperties:", - "_checkIfSpeakingThroughSpeechFeedbackWindowIsFinished:", - "setGoodEntropyRange:", - "_isAbsolute", - "initWithItem:dataSource:", - "reconcileSubdescriptionsToSuiteRegistry:", - "_infoForPage:", - "mouseHit:", - "dismissPopUp:", - "setMaxDoubleValue:", - "initWithFrame:menuView:", - "_fixedSelectionRangeForRange:affinity:", - "fullNumber", - "imageBrowser:titleOfCellAtIndex:didChangeTo:", - "contentRectForFrameRect:", - "animationManager:processCell:channel:", - "_iconForCarbonIcon:size:", - "stringRepresentation", - "setIconType:", - "hudWidthForControlArray:", - "portCoderWithComponents:", - "_layoutViewsVerticallyAndResize", - "_dataSourceSetValue:forColumn:row:", - "initWithObjects:forKeys:", - "baseThread", - "toolbar:willAddItem:", - "objectValueOfSelectedItem", - "_web_URLComponents", - "initWithDate:timeInterval:", - "_bindingCreationDelegate", - NULL, - "filenames", - "maidenNameFieldPresent", - "nicestRenderingIsDone", - "displaysLinkToolTips", - "renameListSheetDidEnd:returnCode:context:", - "setDefaultLineCapStyle:", - "uppercaseWord:", - "mutableArray", - "_resortCachedChildrenForNode:", - "values", - "_setWindowDepth:", - "mutableSetValueForKeyPath:", - "removeFilterFile:", - "imageEffectsView", - "gotoNextPage:", - "findAttachement:", - NULL, - "nts_SetTracksModification:", - "objectInInputWhiteParamsAtIndex:", - "handleWindowDidBecomeKey:", - "setFill", - "_startSearch", - "_sendDelegateValidateDropForDragInfo:", - "_prefetchRelationshipKey:sourceEntityDescription:sourceObjectIDs:prefetchRelationshipKeys:inContext:", - "tableView:frameOfCellAtColumn:row:originalFrame:", - "switchToListNamed:", - "yearOfCommonEra", - "_invalidateDictionary:newTime:", - "deviceGlobalID", - "sharedScriptExecutionContext", - "_openGLContextForCurrentLayerBackingState", - "numberWithFloat:", - "_setupControls", - "initWithUndoManager:", - "_drawAttributedString:withBoundingRect:", - "drawWithFrame:inView:", - "tableViewAction:", - "certificatesFromInvite:sharedSecret:certs:", - "_setStopError:", - "setupViewForPatch:", - "_setNoteColor:", - "transitionFlags", - "drawDisclosureBox:inContext:", - "coversCharacter:", - "operators", - "setTitleAlignment:", - "updateNameMap", - "_unlockViewHierarchyForModification", - "_updateSavedFrames", - "centerOfPriorityRange", - NULL, - NULL, - "_disableScreenUpdatesUntilRunLoop", - "operationHasAborted", - "showDeminiaturizedWindow", - "scaleValue", - "initialValue", - NULL, - "isEndMark", - NULL, - "_writeURLNameInRange:toPasteboard:", - "indexOfItemWithSubmenu:", - "scrollToBeginningOfDocument:", - "initWithCVImageBuffer:", - "queryLDAPServer", - "_targetViewFrameRect", - "setAllowedFileTypes:", - "textColorInvalidationCapableObjectForObject:", - "_delegate_shouldTypeSelectForEvent:withCurrentSearchString:", - "selectAll", - "isAutomaticQuoteSubstitutionEnabled", - "_computeOrderedItemViewersOfType:", - "_viewFromExpressions:", - "_web_setInt:forKey:", - "scrollClipView:toPoint:", - "_managedObjectContextDidSave:", - "_coreUILinearKnobIndicatorOnly:", - "_descriptorByTranslatingTextStorage:ofType:inSuite:", - "errorAction", - "_proxyParentedChild:", - "setParentPDFView:", - "initWithImageProvider:userInfo:size:format:flipped:colorSpace:", - "_coreUIImageWithName:", - "gotoNextSelectionPoint", - "_presentableResultDescription", - "importQuality", - NULL, - "_setMetrics:", - "secureURLString", - "_setKeyboardFocusRingNeedsDisplayInRect:force:", - "setBody:", - "_setVectorX:Y:Z:W:", - "valueAtIndex:", - "editorCenter", - "outputs", - "toManyForSourceObjectID:relationshipName:after:", - "_printDocumentWithSettings:showPrintPanel:delegate:didPrintSelector:contextInfo:", - NULL, - "cacheInsertStatement:", - "submenuRepresentedObjectsAreStale", - "_processElement:tag:display:depth:", - "_setAccessibilityStringsForNormalFileListModeControl", - "_createAssociationsBySource:withDestination:forEntityMapping:", - "inputImageIsModified", - "setInputCount:", - "_checkGrammarStartingAt:detailRange:detail:", - "localizedShortName", - "flushCaches", - NULL, - "showControls", - NULL, - "hasMediaType:", - "dateFromComponents:", - "_addExpandedNodeToObservedNodeMappingForExpandedNode:", - "classDescriptionsByName", - "setVersion:", - "_reCalcQualityBarWidth", - "enumeratorOfInputExtent", - "_handleFauxDisabledNodeClicked:", - "_firstHighlightedCell", - "moveToBeginningOfParagraph:", - "replyWithException:", - NULL, - "annotations", - "selectIndex:", - "groupsPane", - "_hitTestTextFieldWithStepper:inRect:ofView:", - "scrollIndexToVisible:", - "_adjustPanelForMinWidth", - "_timer:", - NULL, - "_clockAndCalendarStartTrackingAt:inView:", - "managedName", - NULL, - "_createMutationMethodsForClass:forKey:", - "setAllowGroupSelection:", - NULL, - "writeTableHeader:atIndex:nestingLevel:", - "cleanUpCardState", - "currentBrowserType", - "_setSharedDocumentController:", - "_loadingViewForPreview:documentPreviewView:", - "_specifiesSingleIndexedObjectPerContainer", - "setSelectionFromPasteboard:selectionHelper:", - "outline", - "drawSelection", - "thumbnailRefreshTimer:", - "runModalSession:", - "initWithTitle:action:keyEquivalent:", - "setUndoableValue:forKeyPath:updatesState:", - "setCompressionOptions:forConnection:", - "movie", - "lightImageResult:", - "positionOfGlyph:forCharacter:struckOverRect:", - "_addObject:forKey:", - "setAnimates:", - "eraseColor", - "addressValueWithEntity:", - "nts__fullName", - "_initializeFromKeychain", - "_sendViewWillDrawInRect:", - "dividerRowItem", - "setPanAngle:", - "_startMove", - "replyAppleEventForSuspensionID:", - "_setDTDString:", - "addPathComponentCell:", - NULL, - "_invokeSelector:withArguments:onKeyPath:ofObjectAtIndex:", - "_overwriteExistingFileCheck:", - "setPrivateAnimationMask:", - "saveCache:intoFile:", - "accessibilityParameterizedAttributeNames", - "_centerOnScreen", - "junctionForComparison:value:", - "cellIndexAtLocation:", - "_computeMaxItemViewHeight", - "_clearInsertions", - "orderOutToolTipImmediately:", - "documentEdited", - "emptyIconDatabase", - NULL, - "_rulerAccViewPullDownAction:", - "initWithInt:", - "zoom:", - "_setNeedsToUseHeartBeatWindow:", - "_alternatingRowBackgroundColors", - "setRemovable:", - "maximizeWindow:", - "_postCleanUltraFastRendering", - "_parserableStringDescription:", - "defaultNamespaceForPrefix:", - NULL, - "advancePastEOLUnicode", - NULL, - "noteWindowClosed:", - "handleReleasedProxies:length:", - "sizeRequisition", - "isRevocationStatusCode:", - "initWithTextureName:releaseCallback:releaseInfo:context:format:target:width:height:mipmapLevels:flipped:colorSpace:options:", - "_debugHeightBucketArrayDescription", - NULL, - "accessibilitySelectedChildrenAttribute", - "CATransform3DValue", - "createAttributeChildOnNode:forAttribute:type:andValue:", - "audioSampleRate", - "selectCellWithTag:", - "drawSelection:selected:inView:withRoundedLeftEdges:", - "neverPurgeHint", - "_attributesRequestPostHandler:", - "abortToolTip", - "setValue:forKey:inObject:", - "addFormField:", - NULL, - "installInputManagerMenu:", - "_userLibraryPath", - "_tabOrientation", - "_bumpTimeout", - "_minXmaxYResizeRect", - "userSpaceScaleFactor", - "_makeSureItemViewersInArray:areSubviews:from:to:", - "rate", - "isDescendentOfPath:", - "nativeTextureTarget", - "sendSelectionChangedNotification", - "setVariable:atIndex:", - "setFilestreamBlockLength:", - "getFloatValue:", - "_selectUpstream:", - "setCurrentSize:", - "readSelectionFromPasteboard:type:", - "_getKeyEquivalentListTable", - "setMaximumSize:", - "setPositiveSuffix:", - "scrollColumnsLeftBy:", - "weekdaySymbols", - "userColumnResizingAutoresizesWindow", - "setColumnsAutosaveName:", - "_userCanSelectIndex:withNewSelectedIndexes:", - "__setValue:forIvar:", - "thumbnailImageAtIndex:", - "sliderType", - "startQueryForString:withServers:userInfo:exactString:", - "_titleRectForCellFrame:", - NULL, - "setCloseAction:", - NULL, - "setFindString:writeToPasteboard:updateUI:", - "accessibilityRTFForRangeAttributeForParameter:", - "_displayChangedDepth", - "responses", - "_listDefinitions", - "localSnapshotForGlobalID:", - "addTooltipsForVisiblePages", - "imageWithCVImageBuffer:options:", - "_sendAVCDeviceOpcode:playbackMode:", - "setBounds:", - "_supposedNumberOfItems", - "_setIgnoreForKeyViewLoop:", - "drawFrame:", - "_executionMode", - "markedRange", - "setValue:forKey:", - "edited", - "_sizeAllDrawersWithRect:", - "tableView:toolTipForCell:rect:tableColumn:row:mouseLocation:", - "__restoreSelection:context:", - "setArgument:atIndex:", - "definitionForComparison:withPropertyDefinition:", - "dictionarypath", - "initWithObjectsAndKeys:", - "removeCommandDescriptions:", - "_resizeButton:imageNamed:", - "_scriptingRemoveValueForSpecifier:", - "disableScreenUpdatesUntilFlush", - "ISS__ay_performSelector:withObject:inThread:beforeDate:", - "_handleBoundsChangeForSubview:", - "browser:willDisplayCell:atRow:column:", - "sortMembers:", - "relinquishFocus", - "setController:", - "minimalFormInContext:", - "getSpinnerFrame", - "previewView:willLoadPreviewForURL:", - "_newPersistentPropertiesWithRelationshipFaultsIntact", - "_accessibilitySearchFieldCellBounds", - "issueSetImageCommandWithSmallImage:largeImage:clippingRect:", - "initAddressWithPeerFromSocket:", - "pauseNotifications", - "_accessibilityParentForSubview:", - "disconnect", - NULL, - "rubberBand:rectangleFrom:to:withEvent:", - "replaceString:withString:ranges:options:inView:replacementRange:", - "_setInstalled:", - "layerBeingDrawn", - "_isSelectedPart:", - "sendDidReceiveData:originalLength:", - "existsInKeychain:", - NULL, - "_doUserParagraphStyleLineHeight:fixed:", - "handleInitialContentRenderSkip", - "_effectiveFrameForDrawnFrame:ofDividerAtIndex:", - "addLanguageToChoices:", - "initWithExtent:format:options:", - "stringWithCString:", - "fidelity", - "captureOutput:didFinishRecordingToOutputFileAtURL:forConnections:dueToError:", - "constrainScrollPoint:", - "contentResizingMask", - "setSound:", - "initWithNode:delegate:", - "wait", - "initWithCachedResponse:request:key:", - NULL, - "switchedToToFullScreen", - "setAttributeRuns:", - "willChangeValueForKey:forIndexes:", - "initWithTreeNode:", - "movieFileTypes:", - "_clearFormatDescription", - "_chooseSizeFromField:", - "setPrimaryKeys:", - "_shutDrawer", - "focusImageAtIndexAndRedisplay:", - NULL, - "setTokenizingCharacterSet:", - "addObjectsFromArray:", - "groupPropertyTypes", - "_resetFirstResponder", - "setWidgets:", - "isPeoplePicker", - "_windowRef", - "toolbar:didRemoveItem:", - "_addOverride:forKey:", - "_slicePlusButtonClick:", - "animationCurve", - "valueForStateKey:", - "cacheUsedByProxyBitmapRep", - "defaultRecentPictureWithOriginalData:cropSize:", - "selectionIndexes", - "_forceClosed", - "isSubviewCollapsed:", - "setNumberOfLights:", - "_goThroughWhitespace:forPosition:", - "tokenField:shouldUseDrawingAttributes:forRepresentedObject:", - "_timeout", - "revertToContentsOfURL:ofType:error:", - "_notifyObservers", - "synchronizeBackBufferIfNeeded", - "autoPositionMask", - "policyValuesForTrust:", - "contextWithPixelFormatAttributes:options:", - "_generateSQLBeginsWithStringInContext:", - "removeParamDescriptorWithKeyword:", - "rowForDisplayValue:", - "_openOldFavorites", - "setDisplaysPageBreaks:", - "setRecentsAutosaveName:", - "prepareIn:swap:", - "_loadPickerBundlesIn:", - NULL, - "_showHideToolbar:resizeWindow:animate:", - "_dimmedImage:", - "_isMenuMnemonicString:", - "isUndoRegistrationEnabled", - "_saveUserPanelValues", - "validateResourceURL:withOptions:", - "_launchSpellChecker:", - "removeKeysForObject:", - "accessoryControllers", - "_coreUILinearBarNoIndicator:", - "setDisabledImage:forControlTint:", - "__patchUpdated:", - NULL, - "mouseEntered:withFrame:inView:", - "_removeOldestSubthumbnail", - "_pathForFSRef:", - "_allSubviewsAreOpaque", - "_updateLayerOpacityFromView", - "_askDelegateWithURL:realm:forRequest:failureCount:failureResponse:protocol:withCallback:context:", - "setLocalizationDictionary:", - "singlestep:", - "initWithEffectName:", - NULL, - "internalNameForEntityName:version:", - "_initForPropPatchWithPatchDict:deleteProperties:", - "minimumGroupWidth", - "draggedImage:movedTo:", - "switchToImageWithTransition:orientation:autoPlay:", - "setFrame:display:", - "observedNode", - "hideOtherApplications:", - "createLayerForTool:event:", - "significantText", - "foldComparisonPredicate:", - "generatePageViewBounds", - "defaultBackupManager", - "initTitleCell:", - "_enableTrackingArea:", - "addBorderToDictionaryRef:", - "systemTimeZone", - "secondaryInvocation", - "writeToPasteboard:", - NULL, - "draggingImageForRowsWithIndexes:inColumn:withEvent:offset:", - "runLoopModes", - "setupLayers", - "greenPreBlurROI:destRect:", - "enlargedBounds:withOffset:andCount:", - "removeAllExpandedNodes", - "clearSearchField", - "_stringByResolvingSymlinksInPathUsingCache:", - "initWithScheme:host:path:", - "formData", - "insertLineBreak:", - "highlight:", - "decimalNumberByDividingBy:", - "didUpdateValueForKey:forCell:", - "isCompatibleWithSubscription:", - "_specialServicesMenuUpdate", - "displayStringsForAttributes:includeBoldItalic:", - "_setTitleNeedsDisplay", - "frameAtIndex:animationValue:", - "_showsNode:", - "_indentationForRow:withLevel:isSourceListGroupRow:", - "initWithKey:value:", - "elementCount", - "_drawContextMenuHighlightForIndexes:clipRect:", - "_textAttributes", - "altersStateOfSelectedItem", - "nibInterface", - "valueForTag:client:", - "didChangeAttributeForKey:", - "disableUndoRegistration", - "_invalidateForSubviewFrameChange:oldSize:oldTopLeft:", - "changeDirectoryForGoIntoNode:", - "addValue:withLabel:", - "matrixReloaded", - "_editor:didCommit:withOriginalDelegateInvocation:", - "endModalSession:", - "_useTigerMetricsForLeftUnborderedOffset", - "_types", - "_drawerCloseThreshold", - "titleComponent", - "_postColumnDidMoveNotificationFromColumn:toColumn:", - "openCodeFile:withEncoding:", - "appendBezierPathWithRoundedRect:xRadius:yRadius:", - "_visibleRectOfLayer:", - "drawInContext:withBounds:", - "startQueryForString:withServers:", - "_convertStringToNumber:", - "gestalt:forDisplayID:", - "imageWithPath:", - "_setValue:type:forParameter:", - "primitiveSortingFirstName", - "languageName", - "_pageDownWithEvent:", - "hasRunLoop:", - "registerPlugin:forType:", - "writeWithBackupToFile:ofType:saveOperation:", - "_markSelfAsDirtyForBackgroundLayout:", - "_endEditingIfNecessaryWhenDeselectingColumnRange:", - "showAtPoint:", - "photoCacheDirectoryPath", - "movieWithAttributes:error:", - "spaceItemSize", - "_userCanSelectCell:", - "removeBookmark:", - "indexOfCrayon:", - "setTopLevelObject:", - "contextExpression", - "escapeKey:", - "maximumRange", - "_portInvalidated:", - "imageRepsWithContentsOfFile:", - "ejectButtonCell", - "openURLs:withAppBundleIdentifier:options:additionalEventParamDescriptor:launchIdentifiers:", - "enterSlideshowFullScreen", - NULL, - "getComputedStyle::", - "setPrintJobTitle:", - "instanceMethodDescriptionForSelector:", - "_attributesFromComposition:", - "runMode:untilDate:", - "initWithBytesNoCopy:length:encoding:freeWhenDone:", - NULL, - "nts_DescriptionDictionary", - "_setShowOpaqueGrowBox:", - "_createFontPanelSizeRep", - "encodeSMPTETime:forKey:", - "tableView:heightForRow:", - "filterInfo", - "serializeDataAt:ofObjCType:context:", - "_setActualSize:", - "addDrawerWithView:", - "hasOpenPopupAnnotations", - "grouping", - "_setPlaceholderForValue:inObject:", - "attemptRecoveryFromError:optionIndex:", - "rootContext", - NULL, - "_compareSingleDictionaryKeyWithRecordValue:", - "mouseDownMovesWindow", - "initWithKey:type:access:isHidden:", - "beginLoadingImageForEmails:forClient:", - "didFailWithError:", - "setImageWithURL:", - "miniwindowImage", - "setTransformStruct:", - "isFinished", - "_setRTFDFileWrapper:", - "previewPanelSelectPreviousItem:", - NULL, - "openHandCursor", - "addAdditionalField:", - "valuePointerFunctions", - "setJobStyleHint:", - "isEnabled", - "_isEditable", - "textView:clickedOnCell:inRect:", - "graphicsContextWithWindow:", - "_windowAnimationVelocity", - "aeDesc", - "_rangeForMoveDownFromRange:verticalDistance:desiredDistanceIntoContainer:selectionAffinity:", - "sortedPropertyValuesWithKey:addressBook:", - "processGRLs:currentGRL:withTitle:withCurrentPriority:pruneList:", - "objectForKey:inDomain:", - "updateButtons", - "imageWithPDF:atSize:angle:center:intoRect:fillWith:redB:greenB:blueB:redW:greenW:blueW:", - "initWithStart:len:", - "cgImageRepresentation", - "prepareEditorWithString:attributes:", - "clockPreferencesChanged:", - NULL, - "_dataAtIndex:", - "shadowComponentSize", - "_subviewsOrDividersHaveChangedSinceAdjustment", - "deselectIdentifier:forPerson:", - "longCharacterIsMember:", - "_keyboardDelayForPartialSearchString:", - "copyAnyResource", - "setAllowsCursorRectsWhenInactive:", - "baseSetter", - "setViewFrame:inCellFrame:inView:", - NULL, - NULL, - "setNotificationDelegate:", - "_setBundleForHelpSearch:", - "validateForUpdate:", - "_hashMarkDictionaryForDocumentView:measurementUnitName:", - "minDate", - "unlockOperations", - "_computeToolbarItemKeyboardLoop", - "getRed:green:blue:alpha:", - "_nodeFromArchive:", - "cyanColor", - NULL, - "initListMembersWithURL:showHidden:", - "actualIndexForIndex:filtered:", - "_convertPointFromSuperview:test:", - "removeCIFilter:", - "exportedKeys", - "fieldDataForOid:inCert:auxData:", - "preloadURL:", - "setMovableByWindowBackground:", - "removeViewFromSuperview", - "_testPartUsingDestinationFloatValue:", - "_lastPageNumber", - "_sharedOidParser", - "initWithGroup:members:showAs:addressBook:", - "_displayValueForPredicateOperator:", - "imageTransform", - "peoplePane", - "imageNamed:", - "_setTransactionAborted:", - "setValueTransformer:forName:", - "_drawsNothing", - "synchronizeTableViewSelectionWithText:", - "enterFullscreenForView:withEffect:frame:fromPanel:", - "addView:", - "initWithSelector:argumentArray:", - "setDataSourceIndex:", - "addObject:", - "initWithRole:parent:", - "setAllProperties:", - "directoryContentsAtPath:matchingExtension:options:keepExtension:", - "doIconify:", - "modes:", - "setStore:", - "rotateByRadians:", - "_initializeAccessorStubs", - "address", - "heightFieldFrom:radius:", - "writePaperSize", - "transactionDidRollback", - "encryptComponents:", - "_delegateWillDisplayOutlineCell:forColumn:row:", - "mutableArrayValueForKey:", - "tracksModification", - "_compressorDidRenderConnection:busNumber:processHints:sampleBuffer:", - "initWithFrame:text:", - "_initWithCGColorSpaceNoCache:", - "baseAddress", - "saveList:", - "restOfKeyPathIfContainedByValueForKeyPath:", - "_isMetadataDirty", - "_dirtyRectUncoveredFromOldDocFrame:byNewDocFrame:", - "indexOfDirectory:", - "_children", - "_handleText:", - NULL, - "selectedNodes", - "setSelected:", - "_printDocumentsWithContentsOfURLs:settings:showPrintPanels:delegate:didPrintSelector:contextInfo:", - "dequeueAllOperations", - "_keyValuePairArrayForDictionary:reuseKeyValuePairsFromArray:", - "_certView", - "setMaximumFractionDigits:", - "setControllerVisible:", - "infoWindowController", - "displayNameAtIndex:", - NULL, - "_defaultValueForAttribute:range:", - "didChange:valuesAtIndexes:forKey:", - "ISS__ay_postNotificationName:object:inThread:", - NULL, - "_loadXMLData", - "setParentCrayonView:", - "deleteToBeginningOfParagraph:", - "processXMLDeclaration:", - "apply:context:", - "initWithContainerClassDescription:containerSpecifier:key:test:", - "_classSynonymDescriptionsFromImplDeclarations:presoDeclarations:", - "_toolTipManagerWillRecomputeToolTipsByRemoving:adding:", - "_handleAEQuitWithActivating:documentSaving:", - "_initInfoSession", - "_endListeningForApplicationStatusChanges", - "accessibilitySelectedTextRangeAttribute", - NULL, - "readPixelsFromBounds:toBaseAddress:withBytesPerRow:pixelType:", - "accessibilitySetSelectedTextRangesAttribute:", - NULL, - "selectedCells", - "undoMenuTitleForUndoActionName:", - "accessibilitySetPositionAttribute:", - "_createAttributedSubstringWithRange:", - "_inScaledWindow", - "_bitBlitSourceRect:toDestinationRect:", - "readDataOfLength:buffer:", - "_dynamicToolTipManagerInstances", - "inputElement", - "languageCode", - "initSpecialRecordWithUniqueId:addressBook:", - "linkedToLayerType", - "_endedLoadingURL:documentPreviewView:result:", - "_removeSubentity:", - "_performSwitchToIconMode", - "matchesPattern:", - "decodeBoolForKey:", - "_resizeWindowWithMaxHeight:", - "_shiftBucketDataFromIndex:by:insertionData:", - NULL, - NULL, - NULL, - "initWithExternalName:", - "createSymbolicLinkAtPath:withDestinationPath:error:", - NULL, - "newListName:", - "clearCacheForGroup:", - NULL, - "useCGForNicestRendering", - "dataRefType", - "finalizeForWebScript", - "registerDefaults:", - "resetQueryForChangedAttributes:", - "displayForLayerTime:displayTime:", - "setObjectID:", - "setRoundingIncrement:", - "cornerView", - NULL, - "drawListBox:inContext:", - "_appendSanitizedTextBytes:length:encoding:isSymbol:attributes:", - "copyStandardSidebarNodeTitles", - "setup", - "initWithFrame:scale:", - "_setOutlineImagesForRow:", - "forgetWord:language:", - "remoteLocation", - "_runLoop:removePort:forMode:", - "setGutterWidth:", - "beginEntityMapping:manager:error:", - "setURL:blockingUntilLoading:timeoutDate:", - NULL, - "_dataSourceRespondsToWriteDragData", - "_propagatePendingDeletesAtEndOfEvent:", - "instantiateNibWithOwner:topLevelObjects:", - "_lockForWriting", - "_convertRect:toAncestor:", - "_postWillScrollNotification", - "newInsertStatementWithRow:", - "_menuPanelInitWithCoder:", - "_validateWithSchemaAndReturnError:", - "cost", - NULL, - "_isTerminating", - "customPropertyDefinitionWithName:addressBook:", - "setPixelBufferAttributes:", - "directionForPort:", - "setFullPath:", - "moveDown:", - "_initWithEntity:withID:withHandler:withContext:", - "_releaseResources", - NULL, - "_setFilterPredicateNoCopy:", - "viewHasToolTips:", - "_menuLocationForEvent:inCellFrame:ofView:", - "setOpenGLPixelFormat:", - "noteMembersSelectionChanged:", - "numberOfSelectedRows", - "username", - "isMainInputController", - "mapForClass:", - "_loadPreview:withDocumentPreviewView:", - "animateTransition:", - "setMigrationManager:", - "_changed", - "kernelsWithString:messageLog:", - "maximumAge", - "advanceMonthButtonCellForDatePickerCell:", - "managedObjectContextForAddressBook:", - "revertPaste:", - "addSingleButton", - "classNameForClass:", - "initForContext:", - NULL, - "_checkGrammarInString:language:details:", - "_alignFirstVisibleColumnToDocumentViewEdge:", - "maximumRangeOfUnit:", - NULL, - "_reverseCompare:", - "contentsRect", - "preservesSelection", - "mappingForAttribute:forConfigurationWithName:", - "removeLayoutManager:", - "_themeTabAndBarArea", - "_addInput:forKey:", - "setPerson:", - "_loadFromDocument:", - NULL, - "progressPanel", - "_noteNote2:", - "pointerValue", - "mask", - "_retainedObjectsFromRemovedStore:", - NULL, - "tableOptionsPanel:", - "_parameterValues", - "updateTimebase:", - "trackedCell", - "initWithSet:copyItems:", - "_appendBezierPathWithRoundRect:cornerRadius:", - "decimalNumberBySubstracting:withBehavior:", - "setUsingDefaultVoice:", - "commitEditing", - NULL, - "_renameCollection:to:", - "setTrustValues:", - "restoreKeyboardFocus:", - "navNodeClass", - "_setUtilityWindow:", - "_scrollByDelta:", - "tickMarkPosition", - "_activate", - "mutableDictionary", - "_fillGlyphHoleForCharacterRange:startGlyphIndex:desiredNumberOfCharacters:", - "presentationWindowForError:originatedInWindow:", - "addItemWithTitle:action:keyEquivalent:", - "nts_MoveIntoAddressBook:", - "_addBindVarForConstVal1:inContext:", - "setContainerClassDescription:", - "adjustOffsetToNextWordBoundaryInString:startingAt:", - "_supportsVariableHeightRows", - "enableUpdates", - "_hasCursorRects", - "initWithCGColorSpace:", - "copyCustomAttributes:", - NULL, - NULL, - "_bindItemImageInVRam:domain:vramNode:", - "startRectForSheet:", - "removeObject:range:identical:", - "_direction", - NULL, - "scaledImageSize", - "arrayWithArray:", - "_addToolbarItemToToolbarFromMenuItem:", - "setMovieAttributesFromUserData", - "textField", - NULL, - "setWeek:", - "_brightColorFromPoint:fullBrightness:", - "perform:", - "updateControls", - "fileSystemAttributesAtPath:", - "CA_pathWithComponents:", - NULL, - "performFindPanelAction:", - "_setSurface:", - "seekToFileOffset:", - "requiresValue", - "dispatchInstruction:", - "addAlreadyAddedToiPhotoButton", - "setParagraphGlyphRange:separatorGlyphRange:", - "_unnestListAtIndex:markerRange:", - "writeDate:", - "_web_rangeOfURLResourceSpecifier_nowarn", - "_allowAnimated_setBoundsOrigin:", - "hasRAMCache", - "sharedNetworkController", - "_insertNewItemWithItemIdentifier:atIndex:notifyDelegate:notifyView:notifyFamilyAndUpdateDefaults:", - "invalidateLastSelectedIndex", - "nextActions", - "setCustomizedName:", - "initWithOptions:refcon:callbacks:", - NULL, - "_fileWrapperOfType:", - "_senderIsInvalid:", - "setFrameFromContentFrame:", - "__selectionFilter:", - "widthTracksTextView", - "freeAttributes", - "webPlugInCallJava:method:returnType:arguments:", - "setOnStateValue:", - "parseField:atIndex:", - "objectByApplyingXSLTAtURL:arguments:error:", - "saveTrustValuesInDomain:", - "_parseText1", - "appendTransform:", - NULL, - "_appendColorPicker:", - "_addPlugInsFromPath:allowNonExecutable:checkForExistingPlugIn:", - "setDescriptionFunction:", - "_enablePrivateEditing", - "_draggingTypes", - "capitalizedString", - "hasNodeLabel", - NULL, - "currentTime", - "_isAnyFontBindingBoundToController:", - "_applyAudioChannelVolumesFromAttributes", - NULL, - "setUsesIndexLabels:", - "_initWithRequest:delegate:directory:", - "_descriptorByTranslatingArray:ofObjectsOfType:inSuite:", - "initWithImageSource:options:", - "storeMin:andMax:ofObject:", - NULL, - "_searchCriteriaWithSlices:anyAttribute:", - "isVerticallyResizable", - "createRenderingContextForCharacterRange:typesetterBehavior:usesScreenFonts:hasStrongRight:maximumWidth:", - "peopleOrCompaniesSelection", - "nodeType", - "shouldStartTaskNamed:", - "resultCount", - "rangeOfNominallySpacedGlyphsContainingIndex:", - "setCompositionParameterView:", - "_newMappingForPropertiesOfRange:", - "startWithView:itemIndex:", - "_sendMenuClosedNotification", - "_servicesMenuHasBeenBuilt", - "setUpSourceForData:", - NULL, - "setBool:forKey:", - "expressionType", - "setDestinationOrigin:travelTimeInSeconds:", - "_insertGlyphs:elasticAttributes:count:atGlyphIndex:characterIndex:", - "toolbarType", - "addObservedKey:", - "inputConnectionFormatDescriptionDidChange:", - NULL, - "endSelectionProcess:", - "_searchForImageNamed:", - "shapeDepth", - NULL, - "mainWindowFrameColor", - "attachColorList:systemList:makeSelected:", - "_pushHandling:", - "_pageLayout:wasPresentedWithResult:inContext:", - "accessibilityIsDocumentAttributeSettable", - "setCanRead:", - "showsCertButton", - "addPathToLibrarySearchPaths:", - "traceWithFlavor:priority:format:arguments:", - "isExpansionToolTipInView:withDisplayInfo:", - "tokenFieldCell:menuForRepresentedObject:", - "setRenderingFlags:", - "setOrderedState:", - "_enableObserving", - "_rectsForMultiClippedContentDrawing", - "_setGraphView:", - "alternateMnemonic", - NULL, - NULL, - "sound:didFinishPlaying:", - "_setKeyViewGroupBoundaryNeedsRecalc:", - "autoresizesOutlineColumn", - "appleEventCode", - "printInfoDidChange:", - "setTitle:ofItemWithIdentifier:", - "saveParameter:to:", - "_validatePropertiesWithError:", - "setComposition:", - "endRenderTexture", - "_setRecents:", - "_acceptsFirstResponderWhenSelectableWithFullKeyboardAccess", - "_shouldDrawTwoBitGray", - "_ensureNoStatementPrepared", - "binderSpecificFlagAtIndex:", - "drawKeyEquivalentWithFrame:inView:", - "setEntryType:", - "initWithBulletCharacter:length:", - "_insertObjectWithGlobalID:globalID:", - "_listResources:", - "trackingTokenTextView:", - "nilSymbol", - "pixelFormatRGB8", - "orderedByStart", - "retainResource", - "needsPanelToBecomeKey", - "_postRedoLayout", - "_calculatePreviewThumbnailImageWithMaxSize:isThumbnail:", - "setLineWidth:", - "emulateUpdateCard:withImportedCard:changes:", - "setupLoadedNib", - "parseAuthorityKeyId:", - "_willPresentDisablingAutosavingError:forURL:", - "calcSize", - "usesAlternatingRowBackgroundColors", - "canGoBack", - NULL, - "finalValueForKey:forCell:", - "newForeignKeyID:entity:", - "clearGLContext", - "storeObject:forUID:forResolution:forKey:", - "computeContentSize", - "_includeSubslicesForSlicesAtIndexes:", - "_findRecordsOfTypes:withAttribute:value:matchType:retrieveAttributes:allowBinary:", - "_learnSpellingFromMenu:", - NULL, - "encodeArrayOfObjCType:count:at:", - NULL, - "precomposedStringWithCompatibilityMapping", - "forceSetMode:", - "serializePropertyList:", - "drawNode:bounds:view:", - "_shouldLinkItemAtPath:toPath:", - "syncToViewUnconditionally", - "setValueSelectionBehavior:", - "checkSpellingOfString:startingAt:", - "convertFromAncestor:toView:clipTo:", - "memberForKey:", - "constraints", - "bestLocationRepFromURL:", - "_entryForSpecifier:", - "runModal", - "rangeToParent", - "setDisplayLinkLock:", - NULL, - "_sendPartialString", - "_defaultSelectedKnobColor", - "opaque", - "eject", - "_endDragging", - "linesOfFile", - "initWithPath:logonOK:", - "valueWraps", - "setTitleColor:", - "scheduleDelayedUpdate", - "_queryViewOptions", - "windowDidMiniaturize:", - "_panelMessage", - "_caseSensitiveCompare:", - "_changedObjectIDs", - "_addEditableSubfieldForElement:dateFormat:", - "outputImageKey", - "setOriginalTemplate:", - "eventParameterWithData:type:size:", - "_showNewestSubthumbnail", - "boundsAsQDRect", - "setUpdatePreviewSize:", - "_performServiceFromDictionary:withPasteboard:", - "PDFViewWillChangeScaleFactor:toScale:", - "resignMainWindow", - "attachmentFrame", - "negativeSuffix", - "setInlinePreviewURL:", - "removeFontTrait:", - "_finishAutosavingWithSuccess:context:", - "checkIfCanStartSlideShow", - "_eventRefInternal", - "stringParameterValue:", - "_initWithFontAttributes:options:", - "scriptingIsLessThanOrEqualTo:", - "removePageAtIndex:", - "findVisiblePages", - "prefetchThumbnailsProgress", - "vector", - "_compareNode:withDisplayName:toNode:withDisplayName:", - "deleteToBeginningOfLine:", - "insertAppleUseCoreUI:atIndexes:", - NULL, - "_ignoresViewTransformations", - "_discardCursorEventsForWindowNumber:criteria:", - NULL, - "timeIntervalSinceNow", - "dictionaryAtURL:errorCode:securely:", - "_validatePagination", - "createRepresentationFromProvider:ofType:withOptions:", - NULL, - "windowDidMove:", - "_parseHeader", - NULL, - "_inFavMode", - "PDFViewPerformGoToPage:", - "mouse:", - "_appendEventDeclarationsToAETEData:includingParts:", - "setRightChild:", - "_resizeLeftCursor", - "_sendClientMessage:arg1:arg2:", - NULL, - "setCell:selected:", - "speechFeedbackServicesTimer", - "initWithName:password:applicationID:", - "relatedMatchesForName:label:givenLastName:", - "deviceDeltaZ", - NULL, - "cachedImageForItemClass:", - "restoreGraphicsState", - "_computeTargetItemsByRegenerating:", - "_noteToolbarSizeModeChangedAndPostSyncSEL", - "enabledStateAtIndexPath:", - "deinterlaceVideo", - "sendDidFinishLoading", - "_registerForDocViewFrameAndBoundsChangeNotifications", - "_iChatEncryptionUsage", - "_valueClassIsSortableWithBinding:", - "_customTitleFrame", - "writePrintInfo", - NULL, - "copy", - "openUntitledDocumentAndDisplay:error:", - "method", - "isAdditive", - NULL, - "updateMovieControllerBounds", - "_copyCoreUILinearBarDrawOptionsWithView:", - "isConcurrent", - "_badgeForString:", - "SCTPerformDelayedSelector:withObject:afterDelay:", - "customCall:inputData:outputData:", - "refreshControlBarIfNecessary:", - "_eventDataDictionary", - "_windowMoved:", - NULL, - "_prepPanel:identities:", - "removeElementsInRange:", - "availableFontNamesWithTraits:", - "colorPanelColorChanged:", - "unregisterSearchDataSource:", - "_removeSubrowsForRow:fromSet:", - NULL, - "setKeysAndEncoding:", - "_documentPreviewFailedToLoad:", - "senderDidResignActive:", - "scriptCommand", - "databaseVersion", - "showPeopleButton", - NULL, - "_proxyShare", - "_setNeedsDisplayFromMainThread", - "underlyingDataAreVolatile", - "allPropertyKeys", - NULL, - "_stringByStandardizingPathUsingCache:", - "invalidateShadow", - "resourcesInit", - "modificationDateYear", - "configureForDisplayedFileProperties:", - "loadThumbnailForURL:", - "_installHeartBeat:", - "_setColumnName:", - NULL, - "_web_guessedMIMEType", - "_buildGraphUnitsForInputConnection:error:", - "setType:", - "_shiftDown::::", - "setNumberOfRows:", - "backgroundQueue:invocationExceededQueueLimit:", - "_imagesWithData:hfsFileType:extension:zone:expandImageContentNow:includeAllReps:", - "CA_stringByDeletingPathExtension:", - "_setRef:toObj:", - "cgImage", - "_kitNewObjectSetVersion:", - "initWithPointerFunctions:", - "updateGRLResults:", - NULL, - "_addTrackingTag:", - "contentAspectRatio", - "_setLocality:", - "segmentedBuffer", - NULL, - "allowsGroupEditing", - "cachedSize", - "_setIsFlattened:", - "stringWithKey:", - "imageRepWithData:", - "clearGroupsSelection", - "addOutput:error:", - "columnTitleForIdentifier:", - "_resourceLoadLoop:", - "isDragging", - NULL, - "_appendSubThumbnail:", - "getResolutionData:carbonMetricsTop:left:bottom:right:", - NULL, - "_attachedSheet", - NULL, - "initWithKey:isStored:", - "_registerDragTypes:", - "passesFilterAtIndex:", - "decodedValueForKey:ofClass:fromDictionary:", - "setControlView:", - "_retrySavingAndReturnError:", - NULL, - "__isPatchInUse:", - "_viewKnowsPages", - "accessibilityWindowAttribute", - "removePersistentDomainForName:", - "setNotationName:", - "_setValue:forKeyPath:ofObject:mode:validateImmediately:raisesForNotApplicableKeys:error:", - NULL, - "loadUI", - "copyObject:", - "_writeURLStringsWithNamesInRange:toPasteboard:", - NULL, - "_primitiveSetDefaultNextKeyView:", - "displayStateForNode:", - "_getReadableNotWritable:types:forDocumentClass:", - "adjustScroll:", - NULL, - "datasourceDidChange", - "eventNumber", - "rulersVisible", - "_metrics", - "setTemplate:", - "GFDictionaryEnumerator", - "_doClickAndQueueSendingOfAction:", - "advanceToString", - "setKey:atIndex:", - "_isValidRelationshipDestination", - NULL, - "_cacheUserKeyEquivalentInfo", - "_useSimpleTrackingMode", - "queueLimit", - "setEndSubelementIndex:", - "errorMessages", - "countFiltered:", - "_acceptableRowAboveRow:minRow:", - "newSmartGroup:", - "childNodesMatchingString:", - "_draggedFilenameFromPasteboard:", - "directorySubpathsOperationAtPath:", - "reassignFilterChain:", - "_rotateCoordsForDrawLabelInRect:", - "_web_initWithDomain_nowarn:code:URL:", - "_oldSizeDuringLiveResize", - NULL, - "_sendDataSourceSortDescriptorsDidChange:", - "setMarkerLocation:", - "uid", - "_notePendingRecentDocumentURLsForKey:", - "timeSlider:setCurrentTime:", - "setLoadingProgressValue:", - "initWithUniqueId:addressBook:", - "_000102", - "rectIncludingShadow", - "_complete:", - "_writeDocument:toPath:", - "wasGeneratedWithIconServices", - "_colorSyncProfileClass", - NULL, - "CA_addValue:multipliedBy:", - "isEditingCanceled", - "_displayToolTipIfNecessaryIgnoringTime:", - NULL, - "processPendingChanges", - "_AEDesc", - "wantsToTrackMouseForEvent:inRect:ofView:", - NULL, - "_saveRecents", - "setMipmapImage:", - "setTabKeyTraversesCells:", - "growBoxWithParent:", - "classForArchiver", - "initWithCompatibilityVersion:", - NULL, - "_orderOutRelativeToWindow:", - "_preferredScript", - "policyString", - "_setupRendering", - "setDefaultDuration:", - "setWidth:type:forLayer:edge:", - "setRequestTimeout:", - NULL, - "rendererType", - "_initWithEntities:", - "setMuted:", - "drawKnob:", - "allowFlushing", - "accessibilitySharedCharacterRangeAttribute", - "initWithCGSource:options:", - "_setMetadata:", - "dataReferenceEnumeratorWithQTMovie:", - "_isUsedByCell", - "_decrementImagePointerToCGImageRefCache", - "queryString", - "asyncInvokeServiceIn:msg:pb:userData:menu:remoteServices:unhide:", - "pointerArrayWithPointerFunctions:", - "_keysForValuesAffectingValueForKey:", - NULL, - "setAttribute:atIndex:", - "_scrollViewForColumnsWillTrackHorizontalScroller:", - "_pauseUIHeartBeatingInView:", - "_drawsWithinMenuBar", - "createScaledImageByX:Y:fromX:Y:", - "stopInlineSlideshow", - "legendHidden", - "implementationClassName", - "getBytes:length:", - "objectRegisteredForID:", - NULL, - NULL, - "_characterIndexForMoveRightFromCharacterIndex:", - "computeLinearA:andB:fromX0:y0:x1:y1:", - "_setCustomizesAlwaysOnClickAndDrag:", - NULL, - NULL, - "blurHalfSizeImage:radius:image:", - "initWithString:calendarFormat:", - "attributedStringToEndOfGroup", - "_endUpdate", - "updateSearchFieldWithPredicate:", - "_setDeselectsWhenMouseLeavesDuringDrag:", - "reconnectBindings:", - NULL, - "primaryIdentifier", - "unpackROI:forRect:", - "windowWillOrderOnScreen:", - "_windowChangedNumber:", - "primaryKeyGeneration", - "insertSegmentOfMovie:timeRange:atTime:", - "drawInRect:fromRect:operation:fraction:", - NULL, - "outlineView:objectValueForTableColumn:byItem:", - "initInNode:recordRef:type:", - "setTypesetterBehavior:", - "failureResponse", - "isCanonical", - "searchTypeLabelAtIndex:", - "_transaction", - "initWithKey:typeDescription:appleEventCode:presentableDescription:name:", - "initWithContentRect:styleMask:backing:defer:screen:", - "addSubgroup:", - "drawerWillResizeContents:toSize:", - NULL, - "panelShouldHaveFullScreenActualSizeButton", - "nts__fullPhoneticName", - "plugInKeys", - "initWithRowCharRange:containerWidth:rowArray:collapseBorders:", - "imageByApplyingState:backgroundStyle:", - "indexOfItemWithRepresentedNavNode:", - "start:curve:", - "panel", - "versionHashModifier", - "_sizeOfTitlebarFileButton", - NULL, - "_isEnabledAndHasEnabledSubitem", - "progressIndicatorColor", - "_initWithParentObjectStore:", - "_clearUpdates", - "handleQuitScriptCommand:", - "_monitors", - "updateWindowForProgress:", - "runModalWithPrintInfo:", - "textContainers", - "reSetAcceptsMouseMovedEvents", - "containerIsObjectBeingTested", - "setValue:forBinding:atIndex:error:", - "setScrollZEnabled:", - "sourceHref", - "_coreUIDialCallbacksMap", - "setOperation:", - "sendAction:to:", - "_coreUICircularState:", - "initPropFindWithSession:withDepth:URI:lookingForProps:includingParent:", - "decrSize:", - "_endEditingIfNecessaryWhenSelectingRowRange:", - "_createRelationshipDescriptionForNode:", - "initWithFile:", - "setShowsCompositionNames:", - "_currentTableCell", - "_hasPublicAccess", - "resizeLeftRightCursor", - "currentVoiceIdentifier", - "dateValueYearless", - "_setImage:fromWindow:", - "previewView:didLoadPreviewForDocumentURL:", - "_isCached", - "bundleForCurrentNib", - "_setupOpenPanel", - "addCollection:", - "_backing", - NULL, - "_actualIndexForMouseEvent:", - "__layoutUpdated:", - "logMessage:", - NULL, - "decimalSeparator", - "objectValueInvalidationCapableObjectForObject:", - "_dispatchKind:", - "_requestTypeForOperationKey:", - "previewPanel:didShowPreviewForURL:", - "_searchFieldSearch:", - NULL, - "mountNewRemovableMedia", - "endRenderTextureAndFinish:", - "_dragParamsOfDividerAtIndex:", - "_scriptingInsertObjects:atIndexes:inValueForKey:", - "createProxyPortWithOriginalPort:forKey:", - "setEventsTraced:", - "_markMovementTrackingInfo", - "_isPendingDeletion", - "_updateSearchResultsCount:", - "drawImage:", - "wraps", - "setShouldCreateUI:", - "toggleKeepVisibleToolbarItem:", - "raiseWithStatus:", - NULL, - "reconcileToSuiteRegistry:suiteName:recordTypeName:", - "initWithCredentials:andOwner:", - NULL, - "panel:compareFilename:with:caseSensitive:", - "writePath:docInfo:errorHandler:remapContents:hardLinkPath:", - "variableExpression", - NULL, - "initializeButtonStructureAtX:y:forResolution:", - "initWithKey:mask:binding:", - "_populate:", - NULL, - "setMinColumnWidth:", - "_changeShadowBlur:", - "recordsMatchingSearchElementNoHinting:takeLock:", - "publicRecordClassForImplClass:", - "isPlaceholderForMarkerExplicitlySet:", - "scaleXBy:yBy:", - "localizedNameForKey:", - "_namespaces", - "_drawBorder:inRect:", - "_popState", - "_recentMenuItemTitlesFromLocationComponentChains:includingIcons:", - "_setWidth:", - "iconForFileType:", - "getNearestOutline:forDestination:", - "setRootNode:makeHistory:notify:", - "components:fromDate:", - "levelsOfUndo", - NULL, - "_postEventNotification:", - NULL, - "_parseText1Fast", - "_setLastSelected:", - "_removeNextPointersToMe", - "currentTaskIndex", - NULL, - "boundsRectForBlock:contentRect:inRect:textContainer:characterRange:", - "uniqueID", - "pathExtension", - NULL, - "textView:shouldSetColor:", - "canDRMInteractWithUser", - "vendor3", - "initialSearchRow", - "valueForKey:withInputs:exists:", - "attributesForOutputPort:nodeIdentifier:", - "baseWritingDirection", - "_surfaceMoved:", - "allCompositions", - "dataWithData:", - "holeROI:forRect:userInfo:", - "pasteboardChangedOwner:", - "movieContentView", - "__patchActivated:", - "addCharactersInRange:", - NULL, - "_old_encodeWithCoder_NSTableColumn:", - "setObjectValue:", - "_syncToChangedToolbar:itemInserted:", - "_createCFAuthChallenge", - "invalidateRect:", - "lockAfterClicked:", - "_setDraggingMarker:", - "decodedObject", - "readFromData:options:documentAttributes:", - "setCurrentProgress:", - "nts_SendAddressBookDidSaveNotificationsWithPublicUserInfo:privateUserInfo:privateTablesChanged:", - "setInputImage:", - NULL, - "usesStrongWriteBarrier", - NULL, - "resetProfiling", - "isDying", - NULL, - "_setName:", - "supportedTextureBufferFormatsForManager:", - "attachColorList:", - "endSheet:", - "symbolCharacterSet", - NULL, - NULL, - "_glyphAtIndex:characterIndex:glyphInscription:isValidIndex:", - "_setAutoSize:", - NULL, - "removeObject:fromBothSidesOfRelationshipWithKey:", - "_dockDied", - NULL, - NULL, - "_newReplicatePath:ref:atPath:ref:operation:fileMap:handler:", - "_ql_validateURLSecureAccess:forPreview:", - "updateOutlineColumnOutlineCell:forDisplayAtIndexPath:", - "compatibilities", - "_isUsingManagedProxy", - "URLToAddressWithScheme:andPort:URI:", - "abPeopleFromUniqueIdsWithAddressBook:", - "_helpBundleForObject:", - "_handleError:withError:", - "_lastDraggedEventFollowing:", - "_thumbnailLayerHitTest:", - "_autoResizeState", - "makeSearchFieldKey", - "quartzFilterManager:didSelectFilter:", - "allocBatch:withEntity:count:", - "stringWithoutAmpersand", - NULL, - "invalidateFocusedIndex", - "initWithBitmapData:bytesPerRow:size:format:options:", - "frameStartTime:", - "updateDisplayName", - "_elementFromTidyDoc:element:encoding:elementClass:nodeClass:", - "accessibilitySetSelectedRowsAttribute:", - "_close", - "_pulseFindIndicator:", - "outputVideoFrame:withSampleBuffer:fromConnection:", - "scanInteger:", - "newScriptingObjectOfClass:forValueForKey:withContentsValue:properties:", - "_presetToCreateCA", - "createAllImagesFromData:options:", - "propertyNamed:", - "canConnect", - "resolveInstanceMethod:", - "browser:shouldTypeSelectForEvent:withCurrentSearchString:", - "_declaredKeys", - "_updateTrackingRects", - "setSelectedRange:affinity:stillSelecting:", - "initWithEntity:sqlString:", - "addSelectionCore:normalize:", - "saveToFile:saveOperation:delegate:didSaveSelector:contextInfo:", - "localURL", - NULL, - "initWithJPEGFile:", - "imageWithPDF:atSize:angle:center:intoRect:redB:greenB:blueB:redW:greenW:blueW:outlineLocation:outlineWidth:outlineOpacity:", - "realElementRect", - "ikMouseDown:", - "drawStrikethroughForGlyphRange:strikethroughType:baselineOffset:lineFragmentRect:lineFragmentGlyphRange:containerOrigin:", - "_initWithSharedBitmap:rect:", - "_feSampler", - "_forceSetColor:", - "_nameFieldContentsAsPosixName", - "_applicableShowsFocus", - "prepareKeychainToSync:", - NULL, - "_rowEntryForChild:ofParent:requiredRowEntryLoadMask:", - "childAtIndex:", - NULL, - "_iconForOSType:creator:", - "_comparison", - "setFirstImageScheduled:", - "cascadeTopLeftFromPoint:", - "setupFilterChain", - "setOriginalImageSize:", - "groupingSeparator", - "_setTargetViewFrameRect:", - "initWithManager:resolution:", - "_drawDragImageCellAtColumn:row:withCellFrameUnion:", - "_addButtonWithTag:inFrame:", - "resizeFlags", - "resetCancelButtonCell", - NULL, - "configureForTreatsFilePackagesAsDirectories:", - "_setJobDisposition:savePath:inPrintSession:printSettings:", - NULL, - "autosaveTableColumns", - "comment", - "_windowWillShowToolbar", - NULL, - "_setAllowedClasses:", - "drawForLayerTime:displayTime:", - "graphWillStopForSession:dueToError:", - "_temporaryAttribute:atCharacterIndex:longestEffectiveRange:inRange:", - "transactionDelegate", - "_setCursorForMouseLocation:", - "_resizeLeftRightCursor", - "setEraseColor:", - "setError:info:fatal:", - NULL, - "setOutlookWebAccessPath:", - "invalidateCachedCTM", - "menuForEvent:inRect:ofView:", - "orderedIndexAtIndex:", - "editedToolbar", - "toolTipTextColor", - "setPortMinValue:", - "primitiveCreationDateYear", - "allHeaderFields", - "setNumRowsToToggleVisible:", - "URLHandleResourceDidBeginLoading:", - "_rectOfColumnRange:", - "_defaultKnobColor", - "_minXTitlebarDecorationMinWidth:", - "_setLayerTreeRendererSurfaceGone:", - "focusRingType", - "_sizeButtonToFit:", - "instancesImplementSelector:", - "rootGraph", - NULL, - "setHiddenUntilMouseMoves:", - "_autoUpdateCellContents", - "_propertyDescriptionForKey:checkSubclasses:", - "allocWithZone:", - "initWithProperties:", - "_createMutableSetValueGetterWithContainerClassID:key:", - "initWithCondition:", - "_realNodeForNode:", - "endSubelementIndex", - "animationBlockingMode", - NULL, - "initWithDelegate:name:", - "allowsPrinting", - "accessibilityIsFocusedAttributeSettable", - "setBitsPerSample:", - "_setFrameCommon:display:stashSize:", - "_ql_waitForKey:toBeEqualTo:timeout:", - "isFilePackageAtPath:", - "setAlwaysVisibleWhenStopped:", - "markAsViewed:", - "systemInputPorts", - "_drawRatingWithFrame:inView:", - "addInkListToDictionaryRef:", - "removeCacheWithUID:", - NULL, - "_binderClassForBinding:withBinders:", - "defaultLineCapStyle", - "removeOutputUnitsForConnection:fromGraph:ofCaptureSession:", - "outlineView:itemForPersistentObject:", - "generalPasteboard", - "setVerticalPageScroll:", - "_setupPopUpButtonCell", - NULL, - "setImage:rect:", - "drawButton:inView:", - "titleForPerson:identifier:", - "setTypeDescription:forReconcilingToSuiteRegistry:", - "gotoNextItem:", - "attribute:atIndex:longestEffectiveRange:inRange:", - "_animationTargetRect", - "setPixelBuffer:cubeMapFace:mipMapLevel:currentVirtualScreen:", - "keyUpDelegate:", - "prepareForDifferentCard:", - "createDictHashTable:", - "_startRearrangementObservingForSuppressedContentObjects:", - "ISOCurrencyCodes", - "undoActionName", - "_setContentsDirtyForNodeWithIdentifier:", - "handleDelegateConfirmedSelection", - NULL, - NULL, - "moveToPoint:", - "correctBufferSizeWithSize:", - "convertPointFromWindowToView:", - "_scriptingArrayOfObjectsForSpecifier:", - "_updateNumberOfTitleCellsIfNecessary:", - "_dateStringToDraw", - "numSlices", - "filterBrowserViewWithOptions:modal:", - "deviceIDList:", - "_evaluateRelativeToObjectInContainer:", - NULL, - "_patchUpdated:", - "objectAtRunIndex:length:", - "__stateUpdated:", - "_updatevideoPreviewConnectionFromVideoPreviewOutput", - "startRenderingPatch:options:", - "setOriginalImageSizeCache:", - "setIndentationMarkerFollowsCell:", - "_newSortingFirstName", - "_rulerAccViewRightTabWell", - NULL, - "showItem:", - "_sharedSecureFieldEditor", - "setLocalizedName:", - "initWithBaseString:", - NULL, - "maxScaleFactor", - "mandatoryClient", - "convertViewPointToImagePoint:", - "_endListeningForSessionStatusChanges", - "registerPort:forName:", - "setPatchSetsTransform:", - "applicationDidFinishLaunching:", - "initWithStringsBundle:", - "sendsSearchStringImmediately", - "isRelationship", - "markedTextAttributes", - "provideNewView:", - "_displayNodes", - NULL, - "setValue:forStateKey:", - "_cleanUpForCarbonAppTermination", - "_getCharacters:length:fromKeyTranslation:", - "tableColumn:didChangeToWidth:", - "_findFirstUserSelectableRowStartingFrom:to:selectedRowsOkay:byExtendingSelection:", - "_old_readColorsFromGlobalPreferences", - "setPageOrder:", - "_hasCredentials", - "_sendMenuOpeningNotification", - NULL, - "_unlinkCIEffect:", - "_setDocModal:", - NULL, - "appendChild:", - "_shouldManageVisibilityOnlyIfVisible:", - "setNumberOfDataSourceItems:", - "createToOneJoinIntermediateForProperty:lastStep:inScope:context:", - "getInputBottomLineParams", - "playing", - "previouslyIndexedWindows", - "hasLearnedWord:", - "computeRowAtPoint:cacheHint:", - "selectDefaultRange", - "initWithType:error:", - "keyPathsForValuesAffectingPreview", - "_preflightChosenSpellServer", - "_initWithAccount:host:port:scheme:", - "initWithContainerClassDescription:containerSpecifier:key:uniqueID:", - "_protectionSpaceForURL:realm:", - "goToNode:", - "patternPhase", - NULL, - "dragImageForRowsWithIndexes:tableColumns:event:offset:", - "initWithDomain:eventCode:userInfo:", - "abRankOfPhoneNumberMatchingString:", - "checkCurrentVersionCompatibleWithCoder:", - NULL, - "_titleForSimpleQueryString:", - "initWithArray:", - NULL, - "_keyEquivalentForNode:", - "_labelPatternColorForLabelIndex:", - "orangeColor", - "ISS_initWithDirtyString:", - "shouldRefresh", - "_finalize", - "clearsFilterPredicateOnInsertion", - "_referenceBindingValue", - "deleteConnectionForKey:", - "_openCollections", - "addCustomGroupBox", - "rangeOfVisibleIndexes", - "_shouldMiniaturizeOnDoubleClick", - "setAllowsFileLoading:", - "IKStringFromSize:", - "_setMainWindow:", - "setPrimitivePhoneticFirstName:", - "_clearTemporaryAttributes", - "setExcellentEntropy:", - "initWithFrame:controller:", - "_updateSizeIfNeeded", - "setCurrentAnimationStep:", - "_initWithClassDescription:synonymDescription:", - "currentContext", - "commitPendingChanges", - "_setFileSpecifier:", - "continueTracking:at:inView:", - NULL, - "_animationDuration", - "updateRow:", - "setMarkupType:", - "_willInitWithCoder", - "reconcileToCarbonWindowBounds", - NULL, - "setForUseWithModel:", - "userDataRef", - "_distForGlyphLocation:", - "markedTextSelectionChanged:client:", - "setDestination:", - "validateForDelete:", - "_locationTemporary", - NULL, - "_observeKeyPathForRelatedBinder:registerOrUnregister:", - "_applyTargetConfigurationWithAnimationMoveAndResize:show:hide:", - "ramManager", - "doPageChangeAnimation", - "_scriptingDictionaryOfType:withDescriptor:", - "_childrenChanged:", - "initWithUTF8String:", - "setFormattingStringsFilename:", - "imageWithData:options:", - "setAcquireFunction:", - "automaticallyRearrangesObjects", - "previewView:didChangeDisplayStateForURL:", - "currentMigrationStep", - NULL, - "lockDocument", - "_isCurrentlyGapStyleDropTarget", - "renewRows:columns:", - NULL, - "keyFrameSelected:", - "showPicker", - "emailHasAssociatedCert:", - "setDisableHighlight:", - "_setTrackingRects:insideList:owner:userDataList:trackingNums:count:", - "destinationOptionsForMigration:sourceMetadata:error:", - "bundlePath", - "phoneticLastName", - "_refreshList:", - "memberAtIndex:", - "currentFilter", - "_closeButtonOrigin", - NULL, - "stopPeriodicEvents", - "genericRGBColorSpace", - "navNode", - "updateTrackingAreaWithFrame:inView:", - "abBackupPath", - "initWithObject:animation:", - "setTXTRecordData:", - "keys", - "_vCardRepresentationAsString", - "_getTitleSize", - "findPreferredLanguage", - "_forwardEvent:location:", - "_writeStringInRange:toPasteboard:", - "directoryCanBeCreatedAtPath:", - "replacementObjectForPortCoder:", - "quickTimeVersion", - "__performUndo3:", - "_menuFormRepresentationForOverflowMenu", - NULL, - "getAttrValuePtrForTypeNode:value:", - "_hasActiveAppearance", - "drawBackgroundInRect:inView:highlight:", - "keyEquivalentFont", - "_copyCacheWithFunction:userInfo:userInfoReleaseCallback:md5List:md5Indices:md5Count:", - "fastDrawString:attributes:containerSize:padding:inRect:onView:pinToTop:sizeOnly:size:", - "_enabled", - "setOptimizesParameters:", - "_makeMiniView", - "removeObjectAt:", - "_setContentRect:", - "_delayedWriteColors", - "initWithName:appleEventCode:fieldDescriptions:isHidden:presentableDescription:", - "initWithDictionary:copyItems:", - "_recalcSubviews", - "accessibilityCloseButtonAttribute", - "indexOfLastSpecialGroup", - "setBulletCharacter:", - "tabletEvent", - "baselineThreshold", - "baselineDeltaForCharacterAtIndex:", - NULL, - "deserializeString:", - "_setEditOnSingleClick:", - "attributedStringForNil", - "_detachListener", - NULL, - "_darkBlueColor", - "_startObservingModelObject:", - "_toolTipRectForCell:withFrame:", - "numberOfRangesOnPage:", - "stringFromNumber:", - NULL, - "_getPositionFromServer", - "creator", - "nts_ParentGroups", - "isZoomed", - "_primitiveTypeDescription", - "dateWithYear:month:day:hour:minute:second:timeZone:", - "marshalEvent:obj:obj2:", - "toManyRelationships", - "_isReservedWordInParser:", - "_restoreExpandedState", - "_doEditOperation:", - "_handleMouseMovedForEvent:withFrame:inView:", - "purpleColor", - "proxyPropertiesForURL:", - "_savedDelegate", - "shouldLoadAttributes", - "_indexOfColonInString:", - "rectOfPathComponentCell:withFrame:inView:", - "customizationPaletteIsRunning", - "_fromContainerInfo:andKeyCode:getAdjustedContainerInfo:andKey:", - "setHasUndoManager:", - "startupImages", - NULL, - "selectMemberRow:subrow:byExtendingSelection:", - "drawHighlightWithFrame:inView:", - "IKIPDrawNicelyScaledInRect:operation:fraction:", - "resolveWithTimeout:", - "modalWindow", - "grabberImage", - NULL, - "dragColor:withEvent:inView:", - "_setOwnsRealWindow:", - "_pointWithinBounds:", - "_finalize_QCImageKernel", - "findPreviousOccuranceOfAttributeNamed:startingRange:", - "setRelevance:", - NULL, - "greenROI:destRect:", - "__graphDidChange:", - "_shouldPowerOff", - "doubleAction", - "_recursiveGainedHiddenAncestor", - NULL, - "initWithTypefaceInfo:key:", - "_doUserSetListMarkerFormat:options:inRange:level:", - "addEffectWithName:type:position:", - "IKViewWillResignFirstResponder:", - "tableView:willDisplayCell:forTableColumn:row:", - "_finishMessagingClients:", - NULL, - "nicestRenderingDelay", - "setColorRenderingIntent:", - "isRegularToolTipVisible", - "positionAtIndex:", - "removeTableColumn:", - "didPerformMigrationWithManager:", - "initWithWindowRef:", - "initWithFireDate:interval:target:selector:userInfo:repeats:", - "shortStandaloneMonthSymbols", - "_setTabView:", - "animation:valueForProgress:", - "infoForFilesInContainer:andReturnResultCode:", - "setHasThousandSeparators:", - "enterSlideshowFullScreenWithStartRect:", - "cachedResponse", - "_ignoreGrammarFromMenu:", - "addObserver:toObjectsAtIndexes:forKeyPath:options:context:", - "superentity", - "valueTypeForDimension:", - "trackEnumerator", - "_setEffects:", - "nts_ImportMacBuddyMeCard", - NULL, - "_setCallbackHandler:", - "_hideAllDrawers", - "_addImageToCache:", - "_setKeySegment:", - "dateControlFrame", - "_trimRegionInvalidatedDuringDisplayToRectsJustDrawn", - "_thread:", - "doClick:", - "prefersEnabledOverEditable:", - "createTextLayer", - "chooseFormat:", - "browser:nextTypeSelectMatchFromRow:toRow:inColumn:forString:", - "_accessibilityMinValueWithoutCollapsing", - "provideImageTexture:bounds:userInfo:", - "_knownEntityKeyForObjectID:", - "_collectElasticRangeSurroundingCharacterAtIndex:minimumCharacterIndex:", - "closeDataFile", - "registerWithCFURLProtocol", - NULL, - "_fireFirstAndSecondLevelFaultsForObject:withContext:", - "checkAndMarkMipmapAsInvalid", - "addColumn", - "getMatrixFrom:toPatch:matrix:ignoreWithin:includeFromTransform:", - "readFromFileWrapper:ofType:error:", - "_showField:identifier:", - "_shouldUseAliasToLocate:", - "currentPoint", - "layoutAlgorithm", - "originalImageName", - "setUsesPreferredLanguage:", - "_desiredLayerBounds", - "authenticationMethod", - "propertyName", - "setOscPortsConfiguration:", - "_addSpellingAttributeForRange:", - "_stopAnimation", - "expressionForSubquery:usingIteratorVariable:predicate:", - "_getDirtyRects:clippedToRect:count:boundingBox:", - "updatePoofAnimation", - "valueTransformerForBinding:", - "tiltAngle", - "appSmartFoldersNode", - NULL, - NULL, - "isCachedSeparately", - "slideshowDontExportToiPhoto:", - "initWithPixelFormatAttributes:options:", - "_copyOfCustomView", - "currentInputSourceBundleID", - NULL, - "coachMarkExpired:", - "setupCarbonMenuBar", - "manyToManyRelationships", - "_updateReadyStatus", - "descriptionForOptionalSubelementName:", - "iDiskNode", - "getHyphenLocations:inString:wordAtIndex:", - "init", - "_selectObjectsAtIndexesNoCopy:avoidsEmptySelection:updateItems:", - "_updateDockWindowIDAndDisplayIfNeeded:", - "setMinNumberOfRows:", - "session:addAuthHeaderToMessage:", - "filterChainChanged:", - "setRecentSearches:", - "_updateForVersion:", - "_registerForClipBoundsDidChangeNotificationIfNecessaryForSuperview:", - "objectInInputImageAtIndex:", - "orderFrontStandardAboutPanel:", - "_printerForPrinter:", - "_handleRootNodeChanged", - "_web_HTTPStyleLanguageCode", - "_shouldTerminateWithDelegate:shouldTerminateSelector:", - "unbindNonManagedItems", - "_sendBindingAdapterWillDisplayCell:forColumn:row:", - "setNotShownAttribute:forGlyphAtIndex:", - "_dragLocalSource", - "_parseArchivedList:", - "addScaled:", - "moveUpAndModifySelection:", - "_alreadySpecifiedCertAuthorityValues", - "initWithAnimation:progress:start:", - "_keyViewPrecedingPickerViews", - "setWantsToBeColor:", - "_collapseItemEntry:collapseChildren:clearExpandState:recursionLevel:", - "_dataSourceRespondsToSortDescriptorsDidChange", - NULL, - "registerNSTags:withNamespace:", - "initWithImageProxy:", - "_initWithPath:bundle:", - "_transferCache:", - "_loadImageWithName:", - "setDouble:forKey:", - "isKeyWindow", - "settingsView:setSetting:forKey:", - "startProfiling", - "initWithObserver:name:object:", - "_okToStartTextEndEditing", - "criteriaForRow:", - "isFauxDisabled", - NULL, - "setMouseTracker:", - "deleteProxyPortForKey:", - "replaceIndexReferenceModelObjectArrayWithEqualCopy:", - "addressBookLockFile", - "beginSheetForWindow:modalDelegate:didEndSelector:contextInfo:certificates:showGroup:", - "_arrowsConfig", - "_finalizeWithReferenceCounting", - "_adjustFocusRingLocation:", - "_unicodeTextEventFromString:", - "_writeCharacters:range:", - "setValues:forParameter:", - NULL, - "ISS_uri", - "hasCacheForUID:withSize:", - NULL, - "typeDescription", - NULL, - "initWithRole:parent:tableView:row:", - "_setNextSizeAndDisplayMode", - NULL, - "_web_URLByRemovingLastPathComponent_nowarn", - "setSelectedTextAttributes:", - "addAddress:stringAttribute:endOfRange:", - "parseForBasicPropertiesWithByteOrder:", - "_collectApplicableUserInfoFormatters:max:", - "removeTrackingRects", - "setPlaceholder:forMarker:isDefault:", - "textRectForControlView:cellFrame:", - "performOperationUsingObject:andObject:", - "_drawnByAncestor", - NULL, - "_showsControlCharacters", - "initWithContentRect:comboBoxCell:", - "_scriptingTypeDescriptor", - "addBookmark:", - "isEdited", - "_distanceInNonDragDirectionBeforeAbortingDragAttempt", - NULL, - "scrollerWidthForControlSize:", - "isSeparatorItem", - "persistentStoreTypeForFileType:", - "referenceBinder", - "scriptingIsEqualTo:", - "insertNewlineIgnoringFieldEditor:", - "localizedDescriptionForFilterName:", - "primaryKeyForEntity:", - "launchWithDictionary:", - "_isManagedController", - "IK_PNGRepresentationWithCompressionFactor:", - "animationStep:", - "renderImageWithCIPipeline:inRect:", - "onStateValue", - "addressBookSaveFile", - "setMinValue:", - "menu:updateItem:atIndex:shouldCancel:", - "_reconfigure", - "popupViewClose:", - "waitForThreadsToFinish", - "columnWidthForColumnContentWidth:", - "initWithString:nodeType:", - "subtitleFrame", - "glyphIndexForPoint:inTextContainer:fractionOfDistanceThroughGlyph:", - "deleteKey:", - NULL, - NULL, - "_markColumnWidthsNotYetCompared", - "_usesToolTipsWhenTruncated", - "setOpenGLEnabled:", - "allowsCopying", - "_disableSelectionPosting", - "_allowsEmptyCompoundRows", - "nodeResignsFirstResponder:view:", - "_chooseBestMatchingFace", - "inputContext", - "_setBlockCapacity:", - "determineCharacterSetSizes", - "_doOpenInSeparateWindow:model:", - "_postRuntimeError:", - "setBidiProcessingEnabled:", - "peopleAtRemoteLocation:", - "isMaster", - "_coreUILinearBarFocusStyleWithView:", - "colSpan", - "rangeValue", - "subpathsAtPath:", - "_addSubfieldsForICUDateFormatString:", - "layoutControls", - "_internalNextTypeSelectMatchFromRow:toRow:inColumn:forString:", - "_bundleForClassPresentInAppKit:", - "_isUtilityWindow", - "_postDidFinishNotification", - "gutterBoundsForPage:", - "_containerViewOfTitles", - "_rebuildGraph", - "refreshAfterUndo:", - "currentBrowsingNodePath", - "arrayWithContentsOfFile:", - "_addAnimatedColumn", - "_scriptingObjectCountInValueForKey:", - "selectionFromPoint:toPoint:", - "_acceptExpressions:flags:", - "isProgrammable", - "adjust:brightness:andContrast:", - "_coreUIIsFocused:", - "innerRect", - "_sortByIdentifiers:", - "dragOperationForDraggingInfo:type:", - "makeSmall", - "_scheduleAnimationTimer", - "createVisualContext", - "cellIndexesAtLocation:", - "makeWindowControllers", - "noteFontCollectionsChanged", - "registerCallbackObserver:", - "doAwakeFromNib", - "goToPreviousPage:", - NULL, - "startWaitCursorTimer", - "_adjustLineScrollWithSnap:", - "_updateProxySettings", - "setRulerViewClass:", - "_isInUILayoutMode", - NULL, - "adapterOperations", - "drawTextureWithContext:inRect:", - "_displayName:", - "_invalidateKeyToIndexTable", - "setPercentSymbol:", - "isValidOnContext:", - "setPaperName:", - "initWithFontDescriptor:", - "_unregisterForToolbarNotifications:", - "_metadataXML", - "encodeValue:forKey:intoDictionary:", - "sharedCertificateTrustPanel", - "drawDisclosureGroupHeader:inRect:", - "registerNodeWithName:constructor:instantiateSelector:attributesSelector:info:", - "_showAllInsertionPointsForGlyphRange:atPoint:", - "accessibilitySetSelectedText:", - NULL, - "tightenKerning:", - "setMinimumDaysInFirstWeek:", - "_importThreadBegan:", - "frameForElementAtIndex:", - NULL, - "_fixSharedData", - "_modelAndProxyKeysObserved", - "setMarkers:", - "outputFormat", - "setTitles:", - "canWrite", - "fade", - "rowForUpdate", - "_showQueryProgress", - "setAllowsExpandingMultipleDirectories:", - "_documentInfoDictionary", - "_getLocalizedLabels:andLocalizedValues:", - "_updateFocusRingsForOldLastSelectedRow:", - "bezierPathWithRoundedRect:xRadius:yRadius:", - "_setAppleUseCoreUI:", - "setFreeFormLayoutMode:", - "isUniform", - "addTypePopupWithTypes:popupExtension:saveType:saveCreator:optionFlags:", - "_bindAncestorNamespaces", - "setCustomizationSheetWidth:", - "initWithThumbnailSize:", - NULL, - "initWithRemoteName:", - "updateFilter:withParameters:", - "_setValue:forKeyPath:ofObjectAtIndex:", - "_forceUpdateDimpleLocation", - "reflectionWithInitialAlpha:height:", - "slideDraggedImageTo:", - "_canAcceptRichText", - "isList", - "initTextCell:pullsDown:", - "setTextAttributesForNegativeValues:", - "setAttributedStringForNil:", - "changeBaseWritingDirection:", - "webScriptNameForSelector:", - "sharedIconCache", - "ikKeyDown:", - "getObjectValue:forString:range:error:", - "rightMouseUp:", - NULL, - "createCurrentImageFromView:", - "alphaControlAddedOrRemoved:", - "userAction", - "_refreshSuspendedAttributeFromCallback", - "_reconcilePrintSessionAttributes", - "_menuItemClick:", - "screens", - "_untitledDocumentNumber", - "setCornerView:", - "initWithRole:parent:goesNext:", - "_unmapRunLoop:", - "nts_SaveAndTriggerSync:updateModificationDate:", - "initWithDomain:type:name:port:", - "IKPBVRamManagerDomainForResolution:createIfNotExisting:", - "thumbnailQuality", - "setFromValue:", - "searchAttributes:allowBinary:", - "destroyArrays", - "_pathLength", - "window:willPositionSheet:usingRect:", - "previewView:gotDocumentPreview:forURL:", - "nts_AddMember:toGroup:", - "nts_syncGroupSmartGroupPropertiesWithLock:", - "setDestinationEntityExternalName:", - "setDocumentAttributes:", - "handleCocoaWindowEvent:callRef:", - "setTextStorage:", - "QTTimeRangeValue", - "_descriptionValues", - "backgroundIsDark", - "_userCanSelectAndEditTableColumn:row:", - "minItemSize", - "__deselect:context:", - "coerceTextStorage:toString:", - "_isGroup:parentOfAllMembers:", - "_setCurrentInputFilepath:", - "_displayDelayedMenu", - "_selectedCrayon", - "dsNodeReference", - "containsKey:", - "indices", - "pathControl:willPopUpMenu:", - NULL, - "_firstPresentableName", - "titlePosition", - NULL, - "registerPluginClass:forObjectClass:andBinderClass:", - "appearance", - "_wsmOwnsWindow", - "isInert", - "sharedPreviewView:willStopSharingWithPreviewPanel:forURL:", - "accessibilitySetSelectedAttribute:", - "undoAttributes", - "_getSourceListColorFor:startColor:endColor:bottomColor:", - "cellIndexesInRect:", - "addItemsWithTitles:", - "cacheDepthMatchesImageDepth", - "validateAccess", - "addOperation:", - "writeToConsumer:withOptions:", - NULL, - "_keyFrames", - "setIntegrate:", - "switchedToIndexMode", - "initWithCapacity:origin:image:yOffset:", - "mapRepresentationIntoRAM:", - "ageStatisticsForIndex:", - "drawWithRect:options:", - "importToValueSetter:", - "drawThemeContentFill:inView:", - "draggedImage:endedAt:operation:", - "accessibilityAttributeValue:", - "proxyData", - "_bindingInfoForBinding:", - "_rename:", - "dataSource", - "_endTableCell", - "setDelegate:", - "joinsForRelationship:", - "_scriptingDescriptorOfValueType:orReasonWhyNot:", - NULL, - "isSharedInstance", - "_setNoDataConnections:", - "_applicableLabelsArrayForDisplayMode:isInPalette:", - "_attributedStringFromDescriptor:", - NULL, - NULL, - "updateLanguagesFromDefaults", - "startSpeaking:", - NULL, - "_documentViewAlignment", - "closeSidebar:", - "_selectFromIndex:toIndex:scrollIndexToVisible:", - "_unregisterForCompletion:", - "accessibilityIsFrontmostAttributeSettable", - "setDefaultImage:", - "_diskCacheDefaultPath", - "imagingModeForced", - "_makeHODWindowsPerform:", - "_outlineTableColumnIndex", - "removePointer:", - "newCount:", - "_markCursorRectsForRemovedView:", - "_createCA", - "systemColorsDidChange:", - "_clearMouseTracking", - "insertDoubleQuoteIgnoringSubstitution:", - "_simpleInsertGlyph:atGlyphIndex:characterIndex:elastic:", - "_flushAnimations", - NULL, - "handleOpenScriptCommand:", - "outlineViewShouldSlideBackAfterDragFailed:", - "fileHandleWithNullDevice", - "intersectSet:", - "_startHeartBeating", - "initWithManyToMany:fk:invfk:", - "initWithResponseClass:", - "elementName", - NULL, - "setOutputPortOrder:forKey:", - "GFArrayEnumerator", - "_deferredWindowChanged", - "_clearDirtyRectsForTreeInRect:", - NULL, - "yAtRow:", - "executeAndReturnError:", - "calculateFigureCenter:", - "invalidateCoreGraphicsImage", - "_jumpToHereMode:", - NULL, - "_sanityCheckPListDatabase:", - NULL, - "_setDecipherOnlyUsage:", - "_applyObjectValue:forBinding:canRecoverFromErrors:handleErrors:typeOfAlert:discardEditingCallback:otherCallback:callbackContextInfo:didRunAlert:", - NULL, - "_unsetInputs", - "keyPathForBinding:", - "descriptionForClassMethod:", - "objectInInputRampParamsAtIndex:", - "__ikVisibleRect", - "getExternalMovie:", - "insertSublayer:atIndex:", - "operations", - "initWithOperatorType:modifier:", - "isAnIcon", - NULL, - "deserializeInts:count:atCursor:", - NULL, - "_handlesSelectAll", - "setIgnoresAntialiasThreshold:", - "_keyFrameAtIndex:", - "getResolutionData:labelMetricsTop:left:bottom:right:baselineY:", - "resetToolMode", - "paramDescriptorForKeyword:", - "_scrollPoint:fromView:", - "_endColumnAnimationOptimization", - "initWithACENode:", - "setAcceptsDrop:", - "dragImageForRows:event:dragImageOffset:", - "stalenessInterval", - NULL, - "_valueBuffer", - "max", - NULL, - "drawSelectionAroundTextRect:", - "handleMouseDownEvent:at:inPart:withMods:", - "_windowSideTitlebarTitleMinWidth:", - "setMaxAnimationFrameRate:", - "_setCertAuthorityBasicConstraintsPresent:", - NULL, - "setAnimationDelay:", - "_configureAndDrawTitleWithRect:cellFrame:", - "willOpen", - "_stripAttachmentCharactersFromAttributedString:", - "addToDirectoryResults:", - "editPerson:", - "performRubberBandingWithEvent:", - "accessibilityIsValueAttributeSettable", - "navNodeWithQueryString:searchScopes:title:", - "imageFlow:didLoadItemAtIndex:", - NULL, - "documentContentKind", - "componentsSeparatedByCharactersInSet:", - "_drawThemeComboBoxButtonWithFrame:inView:", - NULL, - "_URL", - NULL, - "browser:canDragRowsWithIndexes:inColumn:withEvent:", - "initWithMetadataManager:recordUniqueIds:", - "_isStrictByParsingExcludedElements", - "_updateGrammar", - "peoplePickerView", - "_opaqueRect", - NULL, - "_didImportCellsAtIndexes:", - "objectInstanceDescription", - "_chooseFace:", - "_includeObject:intoPropertyWithKey:andIndex:", - "_enableEnablingKeyEquivalentForDefaultButtonCell", - "fileHandleWithStandardInput", - "_clearDeletions", - "isOnLocalHost", - "onSliderMouseDown:event:", - "addObject:toBothSidesOfRelationshipWithKey:", - "_sweepDirectionForGlyphAtIndex:", - "_insertionOrderForPicker:", - "_widthOfPackedGlyphs:count:", - "_validatedPosixName", - "creationDate", - "_inTexturedWindow", - "shouldReportNamespacePrefixes", - NULL, - "dataWithEPSInsideRect:", - "_backstopView", - "SFElement", - NULL, - "materialWarp:pull:choke:edge:flat:", - "copyStream:to:length:", - "logs", - "_setNeedsDisplay:", - "updateSpellingPanel", - "_characterIndexForMoveLeftFromCharacterIndex:", - "serialize", - NULL, - "_invalidateForLiveResize", - "rectForPage:", - "startSync", - "_setCustomAreaSize:", - "_setUpAppKitTranslations", - "trackScrollButtons:", - "_web_looksLikeIPAddress", - "_unbind:", - "sendEOF", - "volatileRepresentation", - "_doneLoadingImage:", - "_genericValueForKey:withIndex:flags:", - "members", - NULL, - "addSubItem:", - "_glyphRangeForCharacterRange:actualCharacterRange:okToFillHoles:", - "saveToPath:", - "_inLiveResize", - "addPropertiesAndTypes:withAddressBook:acquireLock:save:", - "setShowsBaselineSeparator:", - "defaultBackupFileNameConvertingFromHFSToPosix:", - "showsBorderOnlyWhileMouseInside", - "normalSpeakingRate", - "_savedMode", - "initWithContentsOfFile:encoding:error:", - "shadowFrom:red:green:blue:opacity:", - NULL, - "_writableTypeForType:saveOperation:", - "statusStringForCode:domain:", - "defaultRenderingOptions", - "indexAtLocationOfDroppedItem", - "loadOurNib", - "setTextColor:", - "_imageFromNewResourceLocation:", - "makeObjectsPerformSelector:", - "addModificationDateToDictionaryRef:", - "descendsFrom:", - "_hideLanguagePopUp", - NULL, - "resetCommunication", - "convertRectFromFrameToBounds:", - "_drawerLeftOffset", - "_collectionsChanged:", - "colorWithString:", - NULL, - "_drawFrameInterior:clip:", - "boundsForTextCell:", - NULL, - "setNegativeInfinitySymbol:", - "undoMenuItemTitle", - "setLevelsOfDetail:", - "initWithName:host:", - "_offset", - "valueHandler", - "_sendEventToThreadLocked:", - NULL, - "_potentialMaxSize", - "_drawFrameShadowAndFlushContext:", - "_setSessionData:", - "initWithFrame:", - "nameColumnTag", - "_visibleItemViewers", - "_initValueTransformers", - "animationResizeTime:", - "writePluginInformationIntoDictionary", - "_autosaveRecordPath", - NULL, - "imageFlow:startResizingWithEvent:", - "fontInstanceForFontDescriptor:size:affineTransform:renderingMode:", - "_cfindexOfObject:range:", - "initWithPredicate:inScope:", - "_web_RFC1123DateString", - "keyPathExpressionForString:", - "_undoManager", - "pageOrder", - "_shouldHighlightCellWhenSelected", - "_addToTypingAttributes:value:", - "setTargetValue:forObject:keyPath:duration:", - "_scriptingTypeWithDescriptor:", - "decompressionSessionOptionsForConnection:", - "decimalNumberByMultiplyingByPowerOf10:withBehavior:", - "infoWithAddressBook:", - "shownValueInObject:errorEncountered:error:", - "_shouldEnforcePixelAlignment", - "_inputPorts", - "_registerExtraFunctions", - "_setUpAutomaticRearrangingOfObjects", - NULL, - "setContinuousSpellCheckingEnabled:", - "poolCountHighWaterResolution", - NULL, - "isEqualToData:", - "removeObject:fromPropertyWithKey:", - "titleFrameOfColumn:", - "isSteppable", - "_indexForMoveLeft", - "_growFrameForDropGapStyleIfNecessary", - "setLaunchPath:", - "_createPixelBufferFromImageBuffer:bounds:needsClipping:flippedState:options:", - "_allowsScreenFontKerning", - "loadNSImageNamed:fromBundle:into:", - "_audioCompleted1", - "_undoDeletionsMovedToUpdates:", - "initWithShort:", - "setMessageText:", - NULL, - "_predicateRestrictingSuperentitiesForEntity:", - "_preferredFocusLocationMask", - "registeredObjects", - NULL, - "_defaultTimeout", - "_setObject:forAttributeKey:", - "setAllowedInputSourceLocales:", - "appendBezierPath:", - "hasGizmo", - "setJavaEnabled:", - NULL, - "_abCompareNotWithinIntervalAroundToday:", - "_setMultipleValue:forKeyPath:atIndexPath:", - "_initFromRangeRecord:", - "filter:valueForKey:", - NULL, - "mouseMovedDelegate:", - NULL, - "initUnlockWithURL:lockToken:", - "setDatabaseOperator:", - "fogShader", - NULL, - NULL, - "fontNameWithFamily:traits:weight:", - "IKSlideshowWrapAround", - "_bidiLevels", - "export:", - "respondsToProperty:", - "indexOfSegmentContainingPoint:inCellFrame:", - "objectValues", - "_alwaysDrawsActive", - "setImageAlignment:", - NULL, - "eventSize", - "deserializeList:", - "initWithContainerClassDescription:containerSpecifier:key:", - "isUsableWithObject:", - "resizeEdgeForEvent:", - NULL, - "archiver:willEncodeObject:", - "shadeColorWithDistance:towardsColor:", - "openWithFinder:", - "_windowResizeBorderThickness", - NULL, - NULL, - NULL, - "_setCurrentThread:", - "_gray221Color", - "windowWillChangeFrame:toFrame:", - "indexOfObject:range:identical:", - "initWithRect:", - NULL, - "initWithGroups:addressBook:", - "_setDefaultItems:", - "setShouldAntialias:", - "writeInt:", - "initWithPasteboardDataRepresentation:", - "setMipmapItem:", - "dragFile:fromRect:slideBack:event:", - "_setObject:forProperty:usingDataSize:", - "commandDescriptionsByName", - "removeChapters", - "_drawLineForGlyphRange:inContext:from:to:at:thickness:lineOrigin:breakForDescenders:", - "selectedTextBackgroundColor", - NULL, - "newCreateTableStatementForManyToMany:", - "setPanelType:", - NULL, - "contentResizeIncrements", - "scrollStepInDirection:", - "reloadCriteria", - "setProperties:", - "pasteAsPlainText:", - NULL, - "_updateDependenciesWithPeerBinders:", - "noteNewRecentDocument:", - "currentTask", - "removeFromWindow:", - "_populateReplyAppleEventWithResult:", - "initWithIncrements:parent:", - "initRemoteWithProtocolFamily:socketType:protocol:address:", - "_currentLocalMousePoint", - NULL, - "_removeAllToolTips", - "extensions", - "setAllowsOpenGLAcceleration:", - "openTempFile:", - "_createMatrixRowsAndColumns", - "setTightenThresholdForTruncation:", - "_createMenuItemWithTitle:", - "_getRestOfFile", - "setAllowEditing:", - "_countWithNoChangesForRequest:error:", - "_printerInPrintSession:", - "didChangeValueForKey:forIndexes:", - "_filenameForCollection:", - "_bezelBottomOffset", - "_expandedCFCharacterSet", - "_validateLinkTargetSpecifier", - "cropPRS", - "_setExcludedFromVisibleWindowList:", - "waitUntilAllOperationsAreFinished", - "setClassDescription:", - "cancelPerformSelector:target:argument:", - NULL, - "invalidateCredentials:", - "_sendDataSourceSetObjectValue:", - "accessibilityIsParentAttributeSettable", - "nextSingleByteBase64Line:", - "removeDescriptorWithKeyword:", - "accessibilityIsSelectedRowsAttributeSettable", - "_mouseActivationInProgress", - "setIntAttribute:value:forGlyphAtIndex:", - "_newLazyRepresentation:::", - NULL, - "autosaveCache", - "_addRangeToArray:", - "_moveDownAndModifySelection:", - "hour", - "temporaryAttribute:atCharacterIndex:longestEffectiveRange:inRange:", - "timeDateFormatter", - "decodeNXObject", - "_resizeRightCursor", - "_drawRoundedBorder:radius:mapRadius:groupType:texOut:texIn:lineWidth:", - NULL, - "nts_ValueInTemporaryCacheForProperty:", - "initWithQCImageBuffer:options:", - "_setForceTailTruncation:", - "_setSuppressNotification:", - "accessibilityWindowsAttribute", - NULL, - "_delayedFreeRowEntryFreeList", - "_newLegalSizeFromSize:force:roundDirection:", - "_contentToFrameMinXWidth:", - "decimalNumberByMultiplyingBy:", - "unionWithRect:", - "localeIdentifier", - "scalingFactor", - "ensureGlyphsForGlyphRange:", - "_countDisplayedDescendantsOfItem:", - "_getRidOfCacheAndMarkYourselfAsDirty", - "_alignCoords", - NULL, - "minWidth", - "insertionContainer", - "_forceUpdateCompositions", - NULL, - "initWithCharacterRange:isSoft:", - "_setDocumentPreview:", - "createPillBezier:inContext:", - "pictureTaker:willPopupRecentItems:", - "maxRenderingSize", - "_stringForRepresentedObjects:", - "_doResizeDrawerWithDelta:fromFrame:", - "timeMachineController", - "setCancellationDelegate:wasCancelledSelector:contextInfo:", - NULL, - "_isHelpMenu", - "setIsInPriorityList:", - "_effectiveCalendar", - "MIMETypeForExtension:", - "coreFindString:", - "abortTakePicture", - "directoryDataHasArrived:", - "netServiceDidPublish:", - "beginSheetWithPrintInfo:modalForWindow:delegate:didEndSelector:contextInfo:", - "setSource:", - "_grayHighlightColor", - "description", - "_layoutTabs", - "_generateSQLForConst:inToMany:inContext:", - NULL, - "setModalDelegate:", - "connection:didReceiveResponse:", - "output", - "_setLetOverrideDefaults:", - NULL, - "inputSourcesFromInputSourceLocales:", - "columnAtX:", - NULL, - "getFileSystemRepresentation:maxLength:withPath:", - "setTitleWithMnemonic:", - "knownKeyValuesPointer", - "invalidateCacheAndStorage", - "sharedMemory", - "accessibilityColumnsAttribute", - "quartzfilter", - "scriptingColorWithDescriptor:", - "_updateAntialiasingThreshold", - "setSelectedComposition:", - "_initWithOutput:", - "elementWithName:", - "CA_encodeObject:forKey:conditional:", - NULL, - NULL, - "makeImmutable", - "_characterIndexForMoveWordRightFromCharacterIndex:", - NULL, - "setMasksToBounds:", - "validateForInsert:", - "typeOfCustomProperty:addressBook:", - "draggedImageForFreeFormLayoutWitClickedPoint:hotPoint:", - "_setNeedsDisplayForItemViewers:movingFromFrames:toFrames:", - NULL, - "enumeratorOfInputTopLine", - "_propertyDescriptionForKey:checkSubclasses:superclasses:", - "editCard:", - "_accessibilityValue", - "checkForGLError", - "_setLocalName:", - "_splitView", - "_attachmentAtGlyphIndex:containsWindowPoint:", - "accessibilityIsDescriptionAttributeSettable", - "quickTimeMedia", - "searchForString:inBooks:withResponseTarget:options:", - "setCanChooseDirectories:", - "initWithMachPort:options:", - "nextToken", - NULL, - "setIrisClosed:", - "insertSegmentOfTrack:fromRange:scaledToRange:", - "clipToQDRegion:", - "viewGRLWithView:withParent:", - "_titleIsRepresentedFilename", - NULL, - "_setCARenderAnimation:", - "_finishHideAnimation", - "download:didCancelAuthenticationChallenge:", - "setGraph:", - "_createMutableArrayValueGetterWithContainerClassID:key:", - "isSharedWithContext:", - "_reallyChooseGuess:", - "screenRectCG", - "typeOfProperty:forTable:", - "registerServicesMenuSendTypes:returnTypes:", - "backingReleaseCallback", - "_contentView", - "sourceInstancesForEntityMappingNamed:destinationInstances:", - NULL, - "initWithOptions:capacity:", - "initRootWithKey:withGRLIndex:", - "numberWithUnsignedLong:", - "initWithArray:forTarget:withReferenceValues:andRange:andCopyItems:", - "setPassphrase:", - "minimalSharedContextForCurrentThread", - "__isRoomWellLit:size:bpr:skipFirstComponent:spp:", - "__addToSelection:context:", - "boundsForPage:", - "_findLastFieldLabelforAttribute:startingAt:", - "archivedDataWithRootObject:", - "removeClassDescriptions:", - "_loadFromQueryData", - "decrDBRetainCount", - "recipeDifference:with:", - "mergeFontFeaturesInto:", - "_typeDescriptionsFromEnumerationImplDeclarations:presoDeclarations:valueTypeDeclarations:", - "_usesFastJavaBundleSetup", - "_insertStatusItem:withPriority:", - "_drawDebugRange:withOffset:", - "setNextUndoManager:", - "closePanel", - "maxDate", - "pushDestination:", - "_userLoggedOut", - "setThumbnailsFitOnScreen:", - "_helpWindow", - "registerUndoWithTarget:selector:object1:object2:object3:object4:", - "_undoRedoInProgress", - "_initWithNib:", - "_setLastHitView:", - "_noise2d:y:min:max:", - "selectedObjects", - "_calcOutlineColumnWidth", - "valueForTag:", - "_preEventHandling", - "smartInsertDeleteEnabled", - "setCharactersToBeSkipped:", - "splitterWithIndex:parent:", - "_updatePreview", - "adjustScroller", - "_deactivateOverlayControls", - "_indexSheetTransitionFrame", - "minimumSignificantDigits", - "selectIntermediate", - "_removeExtension:", - "_invokeMultipleSelector:withArguments:onKeyPath:atIndex:", - "_recursivelyPropagateCocoaDirtyRectsToCarbonForHIView:", - "evaluatePredicates:withObject:substitutionVariables:", - "setMovieAttributes:", - "contextHelpForObject:", - "_drawRect:liveResizeCacheCoveredArea:", - "removeTemporaryAttribute:forCharacterRange:", - "_drawDelegate", - "makeDocumentWithContentsOfURL:ofType:error:", - "_historyControlCell", - "rowCountRange", - "_fillLayoutHoleForCharacterRange:desiredNumberOfLines:isSoft:", - "sortingFirstName", - "setCurrentTab:", - "trackID", - NULL, - "_loadPreviewSucceededForDocumentPreviewView:", - "canStoreColor", - NULL, - "_sumForKeyPath:", - "selectKeyViewPrecedingView:", - "setAlternateParentClass:", - "noteRollOverPath:", - "windowChangedMain:", - "numberWithUnsignedLongLong:", - "colorWithColor:", - "netService:didNotPublish:", - "doubleValueOfProperty:", - "_oldFontSetNames", - "_expandItemEntry:expandChildren:startLevel:", - "setShowsBorderOnlyWhileMouseInside:", - "_updateSelectionIndexPaths:", - "deliverResult", - "_validateObjects:forOperation:error:exhaustive:forSave:", - "wantsToDrawIconIntoLabelAreaInDisplayMode:", - "hasHiddenParts", - "getProperties", - "addressBook", - "numberWithLongLong:", - "setAlignmentRect:", - NULL, - "_growFrameForDropGapStyle", - "_timerFired:", - "setDestinations:forRelationship:", - "_cfAppendCString:length:", - "dataLength", - "setMovable:", - "_preloadWithQuality:", - "dictionaryWithCapacity:", - "setQCComposition:", - "purgeExtras", - "processCDATA:", - "loadData:MIMEType:textEncodingName:baseURL:", - "_addTargetAnimation:start:atProgress:", - "drawerDidOpen:", - "mouseDraggedOnCharacterIndex:atCoordinate:withModifier:client:", - "addGroupsFromPasteboard:toGroup:", - "receiversSpecifier", - NULL, - "registerModel:", - "grl", - "_distanceFromBaseToTopOfWindow", - "saveFontCollection:withName:", - NULL, - "_hide:", - "_userCanSelectSingleRow:", - "reason", - "zoomRange", - "sourceObject", - "blackSubtractAndPremultiply:pattern:factors:blackLevels:image:", - "_removeLockTokenForURI:", - "_validateDropForDragInfo:", - "darkPaperBackgroundUsingTexture:", - "cancel:", - "hasPosterImage", - "_createNewNodePreviewHelper", - NULL, - "_removeToolTipAndTimer", - "personValue", - "noHolesZoomRange", - "movieTypesWithOptions:", - "setMaxWidth:", - "setCurrentNode:", - NULL, - NULL, - "getGlyphsInRange:glyphs:characterIndexes:glyphInscriptions:elasticBits:bidiLevels:", - "setSegmentCount:", - "pemEncodedTextData", - "keyNavigationView", - "windowWillGoAway:", - "finishWindowModal", - "_setPartialKeysWithTableBinder:forTableColumnBinder:", - "isVertical", - "groupsController:outlineView:shouldEditTableColumn:item:", - "addJoinIntermediate:", - NULL, - "clearViewport:", - "setJoinType:", - "nts_GroupsWithAddressBook:", - "didClose", - "_fontNameForFamily:face:", - "center:didAddObserver:name:object:", - "resetFormForFields:", - "groupsAtRemoteLocation:", - "_cleanUpAfterSave", - "_canAutoGenerateKeyboardLoops", - "addToPageSetup", - "cycleToNextInputServerInLanguage:", - "capitalizeWord:", - "_validateCredentialsWithPath:andDAVSession:", - "setFlipped:", - "layoutType", - "_decrementInUseCounter", - "nts_SetNeedsToRestoreAddressBookFromMetaData:", - "_unhide", - "_commonName", - "_printStructure:toString:linePrefix:", - "_initWithWindowNumber:scaleFactor:", - "_indexPath", - "imageAndTitleOffset", - "_setPostHandler:andTargetObject:", - "operationQueue", - "PMPageFormat", - "activateIndexSheetWithAnimation:", - "tracksWithCharacteristic:", - "setOutlineTableColumn:", - "nts_InsertInArray:", - "_installOpenRecentMenuOpeningEventHandler:", - "IKIPSetFrame:constrainedToScreen:display:animate:", - "rotateRight:", - "miniDocumentPreviewFrame:forItemAtURL:withItemFrame:", - "_needsDisplay", - "nts_ClearInstanceCaches", - "setCacheMode:", - NULL, - "_baseKey", - "initSymbolicLinkWithDestination:", - NULL, - "_insertionIndexPathAppendChildIndex:", - "setIntParameterValue:to:", - NULL, - "nts_GroupsAtRemoteLocation:", - "_alignPoint:force:", - "allowsNaturalLanguage", - "_getItemsAndValuesToAddForRow:ofType:", - NULL, - "_getInputWhiteParams", - "setShowsiChatTheaterButton:", - "_setNullForKey:", - "presentError:", - "initWithRect:options:owner:userInfo:", - "setSelectionIndexes:", - "defaultTypesetterBehavior", - "minScaleFactor", - "_editedDocumentCount", - "minPossiblePositionOfDividerAtIndex:", - "initWithCVImageBuffer:options:", - NULL, - "_hasOverrideForSelector:", - "_versionReference", - "_freeTextures:", - NULL, - "path", - "_attributes2ForPageOffset:entryOffset:blockType:baseAttributes:", - "convertFont:toHaveTrait:", - "viewForObject:", - "initForBasicProperties", - "_coreUILinearOrientation:", - "_queryNumberOfChildrenOfItem:withRowType:", - "validateMetaData", - "setLanguage:", - "_rulerAccViewStylesAction:", - "browser:isColumnValid:", - "_filenamesWithAlwaysIncludingDirectories:", - "exportFileAtPath:info:", - "comparisonsForProperty:", - "_dragIndexes:withEvent:pasteboard:source:slideBack:", - "localizedDefaults", - "slider", - "_endEditingIfEditedCellIsChildOfItemEntry:", - "initWithGRL:invocation:", - "setDefaultMiterLimit:", - "groupsController:outlineView:willDisplayOutlineCell:forTableColumn:item:", - "configureForLayoutInDisplayMode:andSizeMode:inToolbarView:", - "selectionBoundingBox", - "pictureTakerShouldClearRecents:contextInfo:", - "yellowComponent", - "insertDescriptor:atIndex:", - "converterProperties:allObjects:images:imageBPC:imageRenderingIntent:", - "accessibilityIsRoleAttributeSettable", - "stringByFoldingWithOptions:locale:", - "initAppearingAnimationWithItems:diff:", - "setPrimitiveCreationDateYearless:", - "_internalTypeSelectStringForColumn:row:", - "setAttributes:", - "moveToBeginningOfDocument:", - "adjustMatrix:numberOfRows:", - "setUndoActionName:", - "shouldEnableRollOverIdentifier:withSelection:", - "stopControl", - "_scanImages", - "documentAttribute:", - "_attributeDescription", - "setScrollerValueFromSelection", - "updateMatrices", - "_indexOfKey:", - "_initWithSuiteName:className:implDeclaration:presoDeclaration:", - "inertia", - NULL, - "clearAllModelObjectObserving", - "_releaseUndoManager", - "executionMode", - "_highlightsWithHighlightRect", - "segmentedCell", - "alertWithError:", - "darkMetalBackgroundUsingTexture:", - "objectDidBeginEditing:", - "parseKeyHeader:", - "autorecalculatesContentBorderThicknessForEdge:", - "_ql_waitForKey:toBeEqualTo:", - "setPage:", - "transactionDidCommit", - "invfk", - "addGuidesLayer:", - "curveToPoint:controlPoint1:controlPoint2:", - NULL, - "valueWithNonretainedObject:", - "imagePosition", - "incrementRefCount", - "_minimumFrameHeight", - "_isDoingOpenFile", - "sliceIsEditable", - "defaultValue", - "movieNamed:error:", - "runToolbarConfigurationPalette:", - "_refreshLayoutAndContent", - "instanceMethodForSelector:", - "popupHit:", - "fireTime", - NULL, - "cacheRelease:", - "_resetMoveAndRenameSensing", - "tokenFieldCell:shouldUseReadablePasteboardTypes:", - "setSizeFunction:", - "drawBackgroundInClipRect:", - "_changedFlags", - "currentCursor", - "initWithCertificate:", - "_generateSQLContainmentStringInContext:", - "menuFormRepresentation", - NULL, - "_specifiedIndexOfObjectInContainer:", - "registerDragTypes:forWindow:", - "pdfViewResized:", - "createPixelBufferFromImageBuffer:withFormat:transformation:bounds:colorSpace:options:", - "applicationShouldTerminate:", - "decodeObject", - "sessionUID", - "_uri", - "setMe:", - "setInformationalString:", - "labelViewClass", - "_encodePropertyList:forKey:", - "_graphIsRunning", - NULL, - "_localizedKeyFromBundleStringFileForKey:", - "insertTable:", - "setStandardInput:", - "PDFView", - "predicateWithSubpredicates:", - "updateProgress:", - "_updateLayerFiltersFromView", - "_data:len:", - "setRepeatDuration:", - "_trackedConnection", - "indentation", - NULL, - "serviceType", - "_loadAnimation", - "keySpecifier", - "_closeWithEffect:canReopen:", - "searchNode", - "exitFullscreen", - "_changeHistory:", - "accessibilityIsZoomButtonAttributeSettable", - "properties", - "providerMD5", - "_runAsSheet", - "controllerForBinding:", - "_updatedCardWithChanges:", - "setTextAttributesForNegativeInfinity:", - "_startEditingColumn:row:event:", - "reinitialize", - "predicate", - NULL, - "initWithSourceObject:sourceKey:targetObject:targetKey:userInfo:", - "isVariableBasedKeypathScopedBySubquery:", - "drawingRectForBounds:", - "_drawRect:liveResizeFill::::cacheCoveredArea:", - "updateSyncIndicators", - "_drawGradientInRect:", - NULL, - "_thumbnailView", - "initRecordDescriptor", - "isEventCoalescingEnabled", - "setupSearchView", - "changeAddressFormat:", - "getThreadArgument", - "_borderView", - "installCarbonEventHandler", - "_selectTextOfCell:", - "_attemptToEditFocusedColumn", - "_scaleFactorForStyleMask:", - "initWithURL:options:documentAttributes:error:", - "_parseFonts1", - "pauseWritingOperationWithScheduledTime:", - "_disableResizedPosting", - "isSingleAttribute:", - "_willShowDisplayableView:", - "optionsFromPanel", - "_setSubmenu:", - NULL, - "shouldCreateUI", - "__computePreLiveColumnResizeWidthsByColumn", - "changeToolbarDisplayMode:", - "CA_attributesForKeyPath:", - "shouldShowMediaBrowser", - "_liveResizeCachedBounds", - "_setVisibleRectOfColumns:", - "initWithButtonID:", - "isBindingKeyless:", - "property:matchesPieces:forPerson:", - "loadFindStringToPasteboard", - "addAccessoryController:", - "accessibleChildren", - "initWithObject:entity:", - "rectArrayForGlyphRange:withinSelectedGlyphRange:inTextContainer:rectCount:", - NULL, - "loadPluginForRight:engineRef:pluginView:", - "deleteBackwardByDecomposingPreviousCharacter:", - "_stringByTranslatingTextDescriptor:toType:inSuite:", - "initWithPrintInfo:purpose:", - "compositingFilter", - "reloadSlideshowItemAtIndex:", - "setThumbnail:withSize:", - "addNode:forKey:", - "_maxXWindowBorderWidth:", - "abUniqueIds", - "menuClassName", - "statusMenu", - "setMouseCell:", - "classForActionDictionary:", - NULL, - NULL, - "numberOfCharactersSelectedOnPage:", - "registerURLHandleClass:", - NULL, - "locationInWindow", - "_isUserRemovable", - "newlineCharacterSet", - "setDividerStyle:", - "_wantsLiveResizeToUseCachedImage", - "newPasswordField", - "thumbnailImage", - "unscriptRange:", - "_arrowScrolling", - "startClearSearchTimer", - "_accessibilityIsInCustomizationSheet", - NULL, - "autorelease", - "_web_parseAsKeyValuePairHandleQuotes_nowarn:", - "objectInSubNodesAtIndex:", - "_locationFromUnitsValue:", - NULL, - "setOnOpenGLContext:", - "entityForID:", - "_rootRowsArray", - "_itemEnabledStateChanged", - "initWithReferenceToData:", - "initWithDate:", - "_wantsRevealoverAtColumn:row:", - "caseSensitive", - "_allocRowHeightCache", - "_positionSheetConstrained:andDisplay:", - "headerRectOfColumn:", - "decimalNumberWithDecimal:", - "_itemChangedToolTip", - "_typeAhead:", - "setSpoolPath:", - "nts__RealCompositeName", - "initWithElement:frame:dateFormat:stringValue:", - "_errorWasPresentedWithRecovery:inContext:", - "_uninstallRemovedTrackingAreas", - "_uniqueMessageNumber", - "abbreviationDictionary", - "_clipViewAncestorWillScroll:", - "_rootNode", - "_surfaceDidComeBack:", - "preferredVolume", - "appendClause:forKeyPathExpression:allowToMany:", - "setMouseRow:", - "_menuDidSendAction:", - "displayChanged:", - "predicateString", - "_pointInPicker:", - "_removeHelpKeyForObject:", - "supportUnitsForConnections", - "_auxStorage", - "_mappingNamed:", - "_rulerAccViewUpdateStyles:", - "_scriptingDescriptorOfRecordType:orReasonWhyNot:", - "_shouldAddObservationForwardersForKey:", - NULL, - "advanceToEOL", - "_sqlTokenForPredicateOperator:inContext:", - "isMiniaturizable", - "_keyFramesSelected", - "_drawPart:withFrame:", - "setFoundMatch:", - "objectForKey:", - "_texturePattern", - "accessibilitySelectedText", - "setBorderColor:", - "saveFilter:notification:", - "_deleteNote:", - "setCreationOptionFlags:", - "animateCompositions", - "_beginTransaction:", - "loadThumbnail", - "checkSpelling:", - "sendSynchronousRequest:returningResponse:error:", - "abCaseInsensitiveIsEqual:", - "exitSlideshow:", - "setArrowsPosition:", - "_adjustLayoutForTextAreaFrame:", - "toolbarBackgroundColor", - "_descriptionOfView:", - NULL, - "_performKeyEquivalent:conditionally:", - "accessibilitySelectedChildren", - NULL, - "_startLoadWithRequest:delegate:", - "browser:numberOfRowsInColumn:", - "_isInheritedPropertyNamed:", - "_moveToPreviousBlock", - "setVisualContextRef:", - "_doUserComplete", - "initWithLongLong:", - "imageWithCallback:param:", - "_frameDidDrawTitle", - NULL, - "_unicodeInputEventReceived", - "setConstraints:", - "fastImageForSize:forGLRendering:", - "_browserDoubleAction:", - "initWithControlPoints::::", - "outlineView:selectionIndexesForProposedSelection:", - NULL, - "initWithFrame:inStatusBar:", - "endOffset", - "handleFailureInFunction:file:lineNumber:description:", - "_noop:", - "_forciblyStopFileWritingForRunningOperation", - "class", - "insertObject:inAttributesAtIndex:", - "deleteCharactersInRange:", - NULL, - "insertObject:range:", - "_drawMouseCoordinates", - "becomeSingleThreaded:", - "_enableScreenUpdates", - "_stopTimerIfRunningForToolTip:", - "_ensureCellIsLoaded", - "glRendererEnabled", - "setActiveKnob:", - "glyphIsEncoded:", - "decodeRectForKey:", - "initWithReferenceToFile:", - "propertyList", - "baseGetter", - "streamWithObjectToken:track:", - "_willUnmountDeviceAtPath:ok:", - "setAutoAlternates:", - NULL, - "_minCellSize", - "setCanClickDisabledFiles:", - "whereClause", - "_performDragOfCell:fromMouseDown:", - "wantsToTrackMouse", - "_rulerAccViewDecimalTabWell", - "isEqualToCompressionOptions:", - NULL, - "updateDateAttributes", - "_blockDescription", - "setVerticallyCentered:", - "copyWithZone:", - "pasteboard:provideDataForType:itemIdentifier:", - "fetchCustomPropertyDefinitionsWithRecordType:addressBook:", - "imageRectForBounds:", - "_sessionDidBecomeActive", - "_resizeColumnByDelta:resizeInfo:", - NULL, - "runModalSavePanelForSaveOperation:delegate:didSaveSelector:contextInfo:", - NULL, - "deviceDeltaY", - "createButton:rightSideDivider:", - "_loadCell:atRow:col:inMatrix:", - "_freeClients", - "drawSubtitle", - "_drawDropHighlightBackgroundForRow:", - "localizedFailureReason", - "mouseCol", - "setMaxCode:", - "saveCompositionToFile:flatten:", - "_fullNameIncludingAuxiliaryElements:", - "initWithSet:", - "secondsFromGMTForTimeInterval:", - "reenableHeartBeating:", - "_lockFocusNoRecursion", - "drawHeaderWithAlpha:", - "getTypographicLineHeight:baselineOffset:leading:", - "auxData", - "handleMenuClosed:", - "rootProxyForConnectionWithRegisteredName:host:usingNameServer:", - "cgsRegionObj", - "trackingAreas", - "clearDictionaryRef", - "paragraphSpacingAfterGlyphAtIndex:withProposedLineFragmentRect:", - NULL, - "effectID", - "pixelBufferRepresentation", - "titleStringFrame", - "shouldEnableActionForPerson:identifier:", - "_setBundle:forClassPresentInAppKit:", - "selectParagraph:", - "onStateImage", - "selectionForAccessibilityRange:", - "_setFont:forCell:", - "disable:", - NULL, - "setOutputOrder:forKey:", - "immutablePlaceholder", - "setAllowDynamicResize:", - "setSelectedDirectories:", - "initWithStore:fromPath:", - "popAndInvoke", - "prevShownGRL", - "isFixedPitch", - "hasFaultForRelationshipNamed:", - "_isDefaultFixedPitch", - "URI", - "setDrawSynchronously:", - "firstTextViewForTextStorage:", - "_resultTypeDescription", - "setURLs:preservingDisplayState:", - "submenuAction:", - "coveredCharacterCache", - "setRoot:", - "scrollViewFrameDidChange:", - "columnCountRange", - "isNativeFileType", - "hasDrawable", - "parentIndexPathForIndexPaths:", - NULL, - "_hideToolbarWithAnimation:", - "convolutionAddROI:destRect:userInfo:", - "_setURL:", - "_propertyDescriptionsByKey", - "appendPasswordUI:", - "cgImageSourceRef:", - "cellsCopyForTasks", - "decomposedStringWithCompatibilityMapping", - "resetTransforms", - "addKeysToBeUpdated:", - "setTrackingMode:", - "addTemporaryAttributes:forCharacterRange:", - "policiesDisclosed", - "accessibilitySetOverrideValue:forAttribute:", - "initWithUser:password:persistence:", - "_numberOfGlyphs", - "writeFontTable", - "_reconcilePageFormatAttributes", - "_displayChanged", - "_wantsMinimalArchival", - "numberOfGroupsInImageBrowser:", - "_addExtension:", - NULL, - "indexHandler", - "_changingSelectionWithKeyboard", - "_isLastSelected", - "_executeScript:", - NULL, - "pathForResource:ofType:", - "deleteToMark:", - "unhide:", - "alternateIconsForAnimationFilenames", - "decimalNumberByMultiplyingByPowerOf10:", - "_drawerWindow", - "_changeQNameURI:toURI:forPrefix:", - "_setEnabledFileTypes:", - "nicestMipmapItemForSize:forGLRendering:cacheIt:", - "hourOfDay", - "_adjustControls:andSetColor:", - "initTitleCell:styleMask:", - NULL, - "selectedRange", - "abdSyncProgress:", - "analyzeReconfiguredWindow:", - NULL, - "isAsynchronous", - "save", - "_presentablePluralName", - "annotationControl", - "_blockLevelElementForNode:", - NULL, - "setIMEnglishName:", - "resolveDecompressionSessionOptionsAndUseDefaultPixelBufferAttributes:", - NULL, - "zoomStateCached", - "_addTrustedAttribute:atIndex:", - "horizontalEdgePadding", - "_findParentWithLevel:beginingAtItem:childEncountered:", - "setAutoresizesOutlineColumn:", - "initWithCell:atIndex:inFlowView:parent:", - "textPasteboardTypes", - "dictionaryWithObjectsAndKeys:", - "speedRange", - NULL, - NULL, - "updateTabs", - "_autovalidateVisibleToolbarItems", - "rightTabMarkerWithRulerView:location:", - "_rectOfDiscreteBrickAtIndex:withDrawingRect:", - "wantsToDrawLabelInPalette", - "isEqualToString:", - "_initialViewToSelectFromDirection:", - "setPrintInfo:", - "miniwindowTitle", - NULL, - "tableView:didClickTableColumn:", - NULL, - NULL, - "setColumnTitle:forIdentifier:", - "_retainedAllMigratedObjectsInStore:toStore:", - "characterSetWithRange:", - "addPortsToRunLoop:", - "_updateXMLNode:fromObject:", - "cameraCallbackCreateNotifier:", - "doRemoveSubscription:", - "addressBookDirectory", - "_shouldPropagateWindowLevelToInputMethods", - "getClassesFromResourceLocator:", - "saveValueInUndo:forProperty:", - "getWhite:alpha:", - "importObject:", - "typesetterBehavior", - "_showDrawRect:", - "_copyAttributesTo:", - NULL, - "notANumber", - "_initWithDeclaration:cachedNamesByAlias:", - "setFullMetadata:", - "initWithTypesetter:", - "_setIPAddress:", - "clearField:", - "_calcNumVisibleColumnsAndColumnSize", - "initWithStructure:", - "_acceptOperator:flags:", - "_setFloat:ifNoAttributeForKey:", - "_concludeReloadChildrenForNode:", - "statusForPerson:", - NULL, - "prompt", - "predicateByAlsoMatchingNilValueForLeftExpression:modifier:", - "kbProductString", - "_makeRememberedOrNewEditingSubviewBecomeFirstResponder", - "abStringByRemovingPunctuation", - "openHelpAnchor:inBook:", - "_horizontalScroller", - "animatable", - "setContextMenuRepresentation:", - "setCacheManager:", - "initWithUnsignedInt:", - "executeCountRequest:withContext:", - "_initWithBitmapData:bytesPerRow:size:format:params:", - "_showsInvisibleCharacters", - "_layoutLineFragmentStartingWithGlyphAtIndex:characterIndex:atPoint:renderingContext:", - "setKeys:triggerChangeNotificationsForDependentKey:", - "init:", - "setUsername:", - NULL, - "_uploadData:toPath:withProps:andHeaders:", - "setResourceData:", - "serializeListItemIn:at:", - NULL, - "setPrimaryKeyGeneration:", - "textShouldEndEditing:", - "isInFullScreenMode", - "setDataSource:", - "initWithOperatorType:modifier:options:", - "list", - "_showTooltip", - "uiController", - "setFontPanelFactory:", - "isSearchableAttribute:", - "URLByDeletingLastComponent", - "fileManager:shouldProceedAfterError:removingItemAtPath:", - "cellFrameAtRow:column:", - "getAttributesAndValuesInNode:fromBuffer:listReference:count:allowBinary:", - "_canUnlearnSpellingForRange:", - "mouseUpAction", - "_removeEventHandlers", - "_setShouldRelease:", - "_canBecomeDefaultButtonCell", - "_threadDying:", - "allGroup", - "_drawEmptyColumnsForView:inRect:", - "createScaledImageByX:Y:", - NULL, - "paragraphRangeForRange:", - "knowsPageRange:", - "nextWordFromIndex:forward:", - "xmlAttributesWithIdentifier:", - "createNewTexturePacker", - "_attributesUpdated:", - "viewSizeForPage:", - "cellAtPoint:", - "_clearChangedThisTransaction:", - "_restoreSharedPreviewViewForURL:", - "_selectionIndexPathsInBrowser:", - "beginDrawingInView:inRect:", - "_computeTravelTimeForInsertionOfItemViewer:", - "_nicestDraw", - "initWithQueryString:searchScopes:title:", - "copyResolutionData:into:withRatio:", - "resizeWithOldSuperlayerSize:", - "_processLibXML2HeadElementNode:", - "setEntity:", - "generatesCalendarDates", - "setImage:startRect:andEndRect:", - "setCGRendererEnabled:", - NULL, - "_focusRingBleedRegion", - "beginTransaction", - "_windowDidComeBack:", - "_addAttachmentForElement:URL:needsParagraph:usePlaceholder:", - "blurHalfSizeROI:destRect:", - "graphUnitDescriptionWithGraphNode:ofGraph:", - "setFullScreen:options:", - "irisOpened", - "_setModal:", - NULL, - NULL, - "formChanged:", - "_removeToolTip:stopTimerIfNecessary:", - "decrementSampleUseCount", - NULL, - "initWithParameters:", - "_delegate_dataCellForTableColumn:row:", - "setPlaysAllFrames:", - "repeatDuration", - "_itemIdentifierForModule:", - "_markAutoCreated:", - "_readPersistentTableColumns", - "performSelectorOnMainThread:withObject:waitUntilDone:modes:", - "selectedTabViewItem", - "_propertyRangesByType", - "searchTextRectForBounds:", - "_setVerticalScrollerHidden:", - "sendPort:withAllRights:", - "setWindowFrame:", - "initWithSpecifier:", - "sortedPropertyPortKeys", - "updateGroupSelection:", - "hasChangesPending", - "preparePageLayout:", - "removeAllItems", - NULL, - "_specifiedIndexesOfObjectsInContainer:", - "createTimeLineWithTime:value:", - "version", - "_createPersonRecord:", - "updateMovieBackgroundColor", - NULL, - "tokenSetForLength:", - "definitionForProperty:", - "_setUnprocessedDeletion:", - "setTreatsFilePackagesAsDirectories:", - "pasteAsRichText:", - "_web_URLWithComponents:", - "fontDescriptorWithSymbolicTraits:", - "_presentableNames", - "event", - "didChangeText", - "releaseRenderingContext", - "documentChanged:", - "setAutomaticQuoteSubstitutionEnabled:", - NULL, - "_addAttachedObject:", - "setKeywordColors:", - "beginModalSessionForWindow:", - "normalizedFontDescriptor", - "initWithDataRepresentation:", - "abEllipsizeWithFont:withWidth:reverseForRightToLeft:", - "execute:atTime:withArguments:", - "_memoryCacheTouchNode:", - "writeObliqueness:", - "drawComboBox:inContext:", - "syncTableViewToChoiceAnnotation", - "showHelpFile:context:", - "modDateQuery", - NULL, - "_referenceData64", - "_missingColumnsForRowRange:blockIndex:text:", - "_checkForTerminateAfterLastWindowClosed:", - "addBackgroundImage:rect:", - "_detachFromParentWindow", - "_isUtility", - "isVectorial", - "_fillsClipViewWidth", - "isManyToMany", - "initWithAction:", - "getObjects:", - "handleMouseEvent:", - "loadItemIndex", - "_wantsMenuIndicatorForSegment:", - "_setSuperview:", - "documentDidBeginDocumentFind:", - NULL, - "stepTowardsDestinationAtleastAsFarAs:", - "_setEditingTextView:", - "expectEndOfInput", - "initWithTextBlock:charRange:glyphRange:layoutRect:boundsRect:containerWidth:allowMargins:collapseBorders:allowPadding:", - "headerTextColor", - "accessibilityIndexOfChild:", - "_enterLibXML2ElementNode:tag:", - "previewThumbnailImage", - "updateControlsPanelWithWidth:animate:keepCentered:", - "_pendingActCount", - "_CGSgetWindowFrame:", - "_endRunMethod", - NULL, - NULL, - "command", - "numberWithShort:", - "showPlayerControls", - "_skipValidation", - "fadeWindow:fromAlpha:toAlpha:duration:delegate:", - "_endTableRow:", - "_refreshIsInUseByAnotherApplicationFromCallback", - NULL, - "_NSNavShortVersionCompare:", - "becomeFirstResponderDelegate", - NULL, - "isLeafCertificate", - "_uniqueizeIndexSet:", - NULL, - "rectOfCell:", - "_rowFromTemplate:withRowType:", - "previewPanelNavigationResponder:", - "memberOfInputTopLine:", - NULL, - "_maxXTitlebarWidgetInset:", - "_noteInstantiationFromWindowTemplate", - "initWithInitialSearchIndex:totalIndexes:forView:", - "setLineFragmentRect:forGlyphRange:usedRect:baselineOffset:", - "draggingToSelf", - "setObject:forCacheKey:", - "imageWithPasteboard:", - "heightForWidth:", - "useHUDStyle", - "extract2ROI:destRect:", - "controller:didChangeToFilterPredicate:", - "cancelInput:conversation:", - "setImageScalingX:", - "_getPathFromGraph:toNode:withBuffer:", - "mutableSetValueForKey:", - "_disableTrackingRect:", - "valueLists", - "initWithRenderer:userData:renderSize:renderContext:options:", - "_newTabForElement:", - "separatorItem", - "_scrollTo:", - NULL, - "updateLayoutInRange:", - NULL, - "_appHasVisibleWindowOrPanel", - "splitView:constrainMaxCoordinate:ofSubviewAt:", - "initWithDir:bufferSize:", - "parseURL", - "reopen", - "_suggestCompletionsForPartialWordRange:inString:language:", - "initWithDir:string:", - "PDFViewSavePDFToDownloadFolder:", - "selectionMode", - "_notifyView_DidRemoveItemAtIndex:", - "descriptorWithString:", - "setIgnoresMultiClick:", - "_setControlTextDelegateFromOld:toNew:", - "_isPreviewRunning", - "setAnimationsMask:", - "_resizeTextFieldToFit:", - "textView:doubleClickedOnCell:inRect:atIndex:", - "originalCropSize", - "replaceObjectsInRange:withObjectsFromArray:range:", - "cancelDelayedPerformWithTarget:", - "getArgument:atIndex:", - "firstPage", - NULL, - "setShowsCertButton:", - "isFloating", - "reloadThumbnails", - NULL, - NULL, - "_validFrameForFrame:resizedFromEdge:", - NULL, - "setAlertStyle:", - "launch", - "performDoubleClick:", - "_knownEntityKeyForObject:", - "_drawRoundedRect:radius:lineWidth:drawingMode:", - "_verticalResizeCursor", - "_acceptsFirstResponderInItem:", - "copyCGLContextForPixelFormat:", - "makeCharacterSetCompact", - "removeAllDrawersImmediately", - "seekToEndOfFile", - "_setParentWindow:", - "outlineView:draggingExited:", - "_setShouldInvalidateShadow:", - "_appendNewItemWithItemIdentifier:notifyDelegate:notifyView:notifyFamilyAndUpdateDefaults:", - "_isWhite", - "removeFrameUsingName:", - "_sortedEdges", - "saveToURL:ofType:forSaveOperation:delegate:didSaveSelector:contextInfo:", - "_flattenMipmap:throughCopy:forCell:", - "removeProperties:", - "_initWithColorSpace:callbacks:data:", - "_shouldRegisterForEditingNotifications", - "isDaylightSavingTime", - "strokeRect:", - "_showToolTip:", - "stringByAppendingPathComponent:", - "cellBaselineOffset", - "_textFieldCellSize", - "setShowsAddToiPhotoButton:", - "scopeLocations", - "setUsername:andPassword:", - "ISS__ay_prepareForInterThreadMessages", - "levelsOfDetailBias", - "runModalForWindow:relativeToWindow:", - "runModalForDirectory:file:", - "_appDidBecomeActive:", - "_shouldHideAddButtonForSlice:", - "setMatrixClass:", - "outlineColumnGroupForRow:column:tableView:", - "_getRetainedLastFocusRingView:bleedRegion:", - "arrowPosition", - "setImageProxy:", - "endRelationshipCreationForEntityMapping:manager:error:", - "entityMappingsByName", - "getUid", - "coerceColor:toArray:", - "setWeakEntropyRange:", - "goToFirstPage:", - "_showControlsPanel", - "interiorBackgroundStyle", - "sizeForNode:", - "_openStrikeMenu:", - "graphicsContextWithGraphicsPort:flipped:", - "nameForInputPort:", - "_applicationDidResignActive", - "_fullDescription:", - "_syncAllExpandedNodes", - "_defaultValidation:error:", - "updateTrackingRectsForCell:", - "_preferInactiveBezelArtInView:", - "__performUndo4:", - "columnsInRect:", - "accessibilityEditedAttribute", - "updateMarkers", - NULL, - "nodeActorForView:", - NULL, - NULL, - "_toolTipForColorPicker:", - NULL, - "cacheFaultingStatement:forRelationship:", - "_shouldComputeRevealovers", - "_createTrackingArea", - "_abCompareContainsSubString:options:", - "scrollTo:", - "_cocoaErrorString:", - "comparison", - "deauthorize", - "visualBackgroundColor", - "fileSystemFileNumber", - "_toolbarIsHidden", - "detailsDisclosed", - "nicestRenderingExpendStep", - "canonicalRequestForRequest:", - "mediaBrowserNode", - "shouldHideMeCard", - "beginUpdateInsertionAnimationAtIndex:throwAwayCacheWhenDone:", - "_noteToolbarModeChangedAndUpdateItemViewers:", - "_caConfigFileFullPathName", - "_timestamp", - "governingEntityForKeypathExpression:", - "setRelinquishFunction:", - "clearSelection", - "startSpecifier", - "imageScalingY", - "_copyImageToPasteboard", - "setAutodisplay:", - "_insertNode:byEntityName:", - "isEditorKey", - "selectedColumn", - "_zoomToFitAll", - "setHidden:", - "fieldEditorTextDidChange:", - "_startChanging", - "newSeparatorItem", - "_accessibilitySplitterRects", - NULL, - "timerFired:", - "_matrix", - "removeElementView:", - "_needsOutline", - "_locationOfColumn:", - "removeReorderedItemsFromDatasource:", - "loadContent", - "setDividerMode:", - "encodeDouble:forKey:", - "_batchRetainedObjects:forCount:withIDs:optionalHandler:withInlineStorage:", - "minContentSize", - "_assignIdentifier", - "servicesProvider", - NULL, - "evaluateString:sourceURL:line:", - NULL, - "_pinViews:resizeFlagsToLeaveAlone:", - "_toolbarSmallLabelFontSize", - "pointingHandCursor", - "resolveNamespaceForName:", - "_setTestedObjectTypeDescription:", - "_aspectRatio", - "setFieldEditor:", - "initWithBitmapDataPlanes:pixelsWide:pixelsHigh:bitsPerSample:samplesPerPixel:hasAlpha:isPlanar:colorSpaceName:bitmapFormat:bytesPerRow:bitsPerPixel:", - "transformBezierPath:", - "cancelClicked:", - "isTransparent", - "initWithWindow:", - NULL, - "textContainerForAttributedString:containerSize:lineFragmentPadding:", - "speechSynthesizer:willSpeakPhoneme:", - "needsDelegate", - "_optionDescriptionsForBinding:", - NULL, - "contentKind", - "maximumRecordedDuration", - "registerForPropertyChanges", - "_sendOrEnqueueNotification:selector:", - "showsCompositionNames", - "setCharacterEncoding:", - "trackConnection:fromPort:atPoint:", - "classDescriptions", - "openUserDictionary:", - "newTempNotificationWithName:object:userInfo:", - "_isKeyWindowIgnoringFocus", - "directoryServicesServer:", - "defaultInputDeviceWithMediaType:", - "insertColumn:", - "setConnectionID:", - "firstIndex", - "_frameOfCell:", - "showsAttributeFilter", - "makeDocumentForURL:withContentsOfURL:ofType:error:", - NULL, - "insertedObjects", - "_currentTable", - "_win32TitleString", - NULL, - "_autoAdvanceCalendar:", - "cameraOffImage", - "average:", - NULL, - "setWaitCursorEnabled:", - "_getFSRefForApplicationName:", - NULL, - NULL, - "drawPlaceHolderWithRect:withAlpha:", - "imageWillChange", - "__doImageDragUsingRowsWithIndexes:event:pasteboard:source:slideBack:", - "_rangeForMoveUpFromRange:verticalDistance:desiredDistanceIntoContainer:selectionAffinity:", - "__selectionUpdated:", - "_fastMipmapItemForSize:forOpenGL:useMinimumQualityThreshold:", - "registerForPropertyChangedNotifications", - "_realThumbnailSize", - "speechSynthesizer:didEncounterErrorAtIndex:ofString:message:", - "displayIfNeededInRect:", - "insertTab:", - NULL, - "addToolTipRect:owner:userData:", - "invalidateSelection", - "performPrimitiveOperationUsingObject:andObject:", - "_plugInPath", - "renderer", - "_validateAndCommitValueInEditor:editingIsEnding:errorUserInterfaceHandled:bindingAdaptor:", - NULL, - "_addBindVarForConstVal1:", - "initWithContentsOfURL:byReference:", - "previousFailureCount", - "lockOwner", - "portWithMachPort:", - "handlePortMessage:", - "setAlternateColor:", - "_setLoadedMetrics:", - "forwardPropogateTemplate:withViews:forOriginalTemplate:", - "viewWithTag:", - "_attributesForElement:", - "_ignoreObserving", - "_getDocInfoForKey:", - NULL, - "use", - "maximumIntegerDigits", - "filterForName:parameters:", - "extraArgumentCount", - "verticalScroller", - "setAutoPlayDelay:", - "setTitle:andMessage:", - "cachedChildrenForNode:", - "_outputVideoFrame:withSampleBuffer:fromConnection:", - "zone", - "unlock", - "netServiceBrowser:didRemoveDomain:moreComing:", - "closeSpellDocumentWithTag:", - "removeSubrecord:", - "exitDisplayOperationForWindow:", - "planToComplete:forType:", - "_prefixDown", - "blurHorizontalPass5ROI:destRect:", - NULL, - "functionalDisplayMode", - "_backgroundDataCancelled", - NULL, - "_beginTempEditingMode", - "fillRect:", - "stringVersion", - "_document:didPrint:forScriptCommand:", - "sharedPreviewViewIsVisible:", - "flowLayout:", - "_makeCGPathForNode:bounds:inContext:", - "userHomeDirectory", - "otherMouseUp:", - "initWithDataNoCopy:", - "_allIdentifiers", - "insertItem:", - "callCracklib:", - "_loadUsingWebKit", - "_scriptingCountOfValueForKey:", - "newNodeWithIndex:belowIndexPath:firstChild:sibling:", - "_syncToChangedToolbar:toolbarItemUserVisibilityPriorityChanged:", - "_copyPrivateKeyFromPublicKeyHash:", - "createConversationForConnection:", - "diffItemsArray:withDataSource:", - "_updateEventFromAttributedString:pinRange:replacementRange:", - "initToDataReference:error:", - "_bindingInfoIndexForBinding:", - "insertElement:range:coalesceRuns:", - "initInNode:type:name:create:", - "browserSingleClick:", - "dotMacBaseLocationForDotMacUser:", - "setOperationGroup:", - NULL, - "_webArchiveClass", - "windowDidBecomeVisible:", - "findGroup:", - "toolTipNoLabel", - "sourceType", - "_runLoop:addPort:forMode:", - "addImageFromPasteboard:", - "_checkCardOnly", - NULL, - "childrenCount", - "handleChannel:", - "increments", - "_drawingRectForPart:", - "writeToURL:atomically:encoding:error:", - "periodicFlushThreadState", - "IKCreateCGImageFromPlanarData", - "_primitiveInvalidateDisplayForGlyphRange:", - "setShouldCloseDocument:", - "rangeOfTextBlock:atIndex:", - "_setOrganizationUnit:", - "foreignKeyColumnDefinitions", - "allowsOtherFileTypes", - "addStringValueToDictionaryRef:", - "_createSmartFolderTitleIfRequired", - "clipForDrawingRow:column:", - "groupsController:outlineView:setObjectValue:forTableColumn:byItem:", - "_setObjects:", - "imageBufferConverterClasses", - "setDatabaseImpl:andAddressBook:", - "canDrawInCGLContext:pixelFormat:forLayerTime:displayTime:", - "_performLayoutIfNeeded", - "setSet:", - NULL, - "replaceElementAtIndex:withElement:", - "filestreamPosition", - "crayonAtIndex:", - "_potentialMinSize", - "resourceExistsAtPath:", - "_accessibilityTextViewCompletionWindow", - "windowDidExpose:", - "credits", - "_delayedShowNode:", - "zoomValueDidChange", - "initWithMainResource:subresources:subframeArchives:", - "_configureBottomControls", - "outlineView:labelShouldDisplayEnabledAtRow:", - "nts_IsModified", - NULL, - "_wantsToDestroyRealWindow", - "_web_setBool:forKey:", - "accessibilityGrowAreaAttribute", - "initWithSession:sourceURI:destinationURI:sourceToken:destinationToken:", - "rangeOfCharacterFromSet:", - NULL, - "ab_stringByAddingPercentEscapesIfNecessary", - "_menuItemView", - "makeNewConnection:sender:", - "setFocusRingColor:", - "_refreshDevicesWithIOType:", - "_methodNameForCommand:", - NULL, - "_moveUpWithEvent:", - "selectCountWithFetchRequest:", - "recacheAllColors:", - "runToolbarCustomizationPalette:", - "_loadInitialRows", - "inShowcaseMode", - NULL, - "movieControllerObjectToken", - "__windowKey:", - "modifier", - "newInsertStatementWithCorrelation:", - "isLeaf", - NULL, - "canGoToNextPage", - NULL, - "endLineStyle", - "setAllowEdit:", - "_finalize_QCThreadPatch", - "_useErrorPresenter:", - "createTextureBufferForManager:withFormat:target:transformation:bounds:colorSpace:options:", - "createJoinIntermediatesForKeypath:startEntity:startAlias:forScope:inFetchIntermediate:inContext:", - "autoScale:", - "_setCurrentBorderEdge:isTable:", - "fontPanelDidChooseFace:", - "displayNameSort:", - "_makeRootNode", - "defaultValueFontAttribute", - "_initWithDataOfUnknownEncoding:", - "accessibilitySelectedTextRangesAttribute", - "era", - "setValidInputKeys:", - "updateAttachmentsFromPath:", - "_standardMarkerAttributesForAttributes:", - "setCountdownDelegate:", - "setIcon:forFile:options:", - "_configureAccessoryView", - "abEncodeBase64DataBreakLines:allowSlash:padChar:", - "kbURLString", - "isObjectTableColumnDataCell:", - "displayPriority", - NULL, - "valueForDimension:", - "_scrollingMenusAreEnabled", - NULL, - "hasVolatileCache", - "_isRunningAppModal", - "setMasterObjectRelationship:", - "drawBevel:inFrame:topCornerRounded:bottomCornerRounded:isHUD:isDarkWindow:", - "appearanceChanged:", - "exportToiPhoto", - NULL, - NULL, - "_clearMouseTrackingForCell:", - "setDirty:", - "isPackage", - "numberOfVisibleColumns", - "top", - "imageWithImageProvider:size::format:colorSpace:options:", - "_faultHandler", - "showInspectorWindow", - "willAccessChildNodes", - "deepestScreen", - "menuForSegment:", - NULL, - "dmCreateRequestWithSession:file:props:URI:", - "_hasPBuffer", - "setScaleFactor:", - "_collectSubentities", - "setFetchRequestTemplate:forName:", - "initWithOwner:", - "_subtractFromNeedsDisplayRegion:", - "_customMetrics", - "setObjectClass:", - "setResourceLoadDelegate:", - NULL, - "setMaximumAge:", - "_setupCertExtensions:numExtens:", - "_certDataArray", - "initWithContainer:key:mutableSet:mutationMethods:", - "setPrevious:", - "shadowsCells", - NULL, - "_documentFromRange:document:documentAttributes:subresources:", - NULL, - NULL, - "nts_SmartGroups", - "setMenuIndicatorShown:forSegment:", - "handleShadowHilite", - "selectedRecords", - "timeZoneWithAbbreviation:", - "_setParentWindowForSheet:", - "initWithSession:method:URI:", - "fastestEncoding", - "_savePanelWasPresented:withResult:inContext:", - "setCloseTarget:", - "isSelectedForSegment:", - NULL, - "_threadContext", - "greenComponent", - "_lockFocusOnRep:", - "_setFallBackInitialFirstResponder:", - NULL, - "accessibilityIsSelectedTextRangesAttributeSettable", - "_connectionWasBroken", - "removeList:", - "hardwareCapsChangeNotifier", - "roundedBezierPathWithRect:radius:", - "drawImageOutline", - "_verticalSlice", - "arguments", - "scrollToRect:", - "setAnchorLeft", - "acceptsFirstMouse:", - "setRanges:", - NULL, - "nodeForKey:", - "initWithOpertaionType:outputFileURL:bufferDestination:scheduledTime:", - "releaseFadeReservation", - NULL, - "__deleteKeyFrame:timeLine:context:", - NULL, - "isFlushDisabled", - "draggable", - "makeBTAvailable:", - NULL, - "_clientDelegate", - "copyNSImageRepresentation", - "_drawTimeLineAtIndex:rect:", - "removeOwner:", - "_windowDidMove:", - "rulerView:willMoveMarker:toLocation:", - "_registerAllDrawersForDraggedTypesIfNeeded", - "flushCachedChildren", - "_argumentDescriptions", - "setUsesScreenFonts:", - "glyphRangeForBoundingRectWithoutAdditionalLayout:inTextContainer:", - "_baselineMode", - "validateEditing", - NULL, - "nonBaseCharacterSet", - "addBoundsToDictionaryRef:", - "CI_rect", - "sharedGlyphGenerator", - "parser:foundUnparsedEntityDeclarationWithName:publicID:systemID:notationName:", - "heightTracksTextView", - "entityNameForPropertyKey:", - "_validityPeriod", - "authorizationViewShouldDeauthorize:", - "_incrementLine:", - "_updateTypes:ports:list:direction:", - NULL, - "stringByTrimmingCharactersInSet:", - "_doFinalAnimationStep", - "abEntityDescriptionInAddressBook:", - "_persistentProperties", - "rectForIndex:", - "maxDoubleValue", - "increment", - "isFirstAndKey", - "_didInitWithCoder", - "fontWithName:size:", - "samplerWithImage:keysAndValues:", - "setSelectable:", - "_writeDocumentPropertiesToString:", - "_entity", - "_setManagedObjectContext:", - NULL, - "_liveResizeImageCacheingEnabled", - NULL, - "_showLineNumbers:", - "_runningDocModal", - "_canHandleDelete", - NULL, - "_invokeMultipleSelector:withArguments:onKeyPath:atIndexPath:", - "_scrollSelectionToVisible", - "_commonInitIvarBlock", - "_printSettingsForSetting", - "serializeObject:", - "spellServer:suggestGuessesForWord:inLanguage:", - "_representationTypeCanBePlayed:", - "_setRect:", - "nextEventMatchingMask:", - "setImage:forSegment:", - "_titleCellOfColumn:", - NULL, - "writeToURL:forManager:withOptions:", - "setStringValue:forFieldNamed:", - "installRatio:intoResolutionData:", - "notActiveWindowTitlebarTextColor", - "_disableAutosavingAndColumnResizingNotificationsAndMark:", - "frameAutosaveName", - "_useSharedKitWindow:rect:", - NULL, - "setHostingWindow:", - "_tableBinderForTableViewSupportsSorting:", - "_receiverThread:", - "allowsLayoutAnimations", - "groupingSize", - NULL, - "statementClass", - "defaultBaselineOffsetForFont:", - "_decodeArrayOfObjectsForKey:", - "setTabStops:", - "notifyWithName:infos:", - "menuStateColumnChanged", - NULL, - "makeCharacterSetFast", - "verifyInvitation:invitationDictionary:trustRefOnErr:signerIdentity:", - "setPoolCountHighWaterMark:", - "_textFieldWithStepperCellSize", - "appendSuiteDeclarationsToAETEData:", - "connection", - "pluginClassForObject:andBinderClass:requiredPluginProtocol:", - "timeMode", - "_startPulse", - "imageWithCGLayer:", - NULL, - "distantPast", - "object:shouldUnbind:", - "performMnemonic:", - "maxImageSize", - "shouldAnalyzeGRL:", - "setSelectedItemIdentifier:", - "_doLayoutTabs:", - "copyPath:toPath:handler:", - NULL, - "shouldBeTreatedAsInkEvent:", - NULL, - "sendEmailToGroup:", - "markEnd", - "_titleTextAttributesForNode:", - "textViewDidChangeTypingAttributes:", - "initRelockWithSession:path:lockToken:", - "isWaitCursorEnabled", - "findFontLike:traits:forCharacters:length:inLanguage:checkCoveredCache:", - "canBecomeMainWindow", - "removeObserver:", - NULL, - NULL, - "_isToManyCountKeyPathExpression:", - "windowController", - "_popUpContextMenu:withEvent:forView:", - "createRandomKey:", - "_deleteRequestPostHandler:", - "descriptorWithDescriptorType:data:", - "pixelFormatBGRA8", - "mouseUpDelegate:", - "_isCompany", - NULL, - NULL, - "wrappedDirection", - "initWithRole:subrole:parent:", - "processNotation:", - "setIndexIntoTemplate:", - "rawOptions", - "setCertData:", - "calendarDate", - "RTFFromRange:", - "addExpandedNode:", - "drawNewParagraphIcon:inContext:", - "nts_Info", - "globalFrameDidChange:", - "timeZoneWithName:", - "initWithDescription:kernelFile:filterBundle:", - "_postDidScrollNotification", - "_tempUnhideHODWindow", - "setDockMenu:", - "_canShowEffects", - "_isDrawingToHeartBeatWindow", - "__isSystemFont", - "debugDescription", - "samplerWithImage:", - "emPath", - "initWithTarget:protocol:", - "resumeNotifications", - "imageByApplyingTransform:", - "_commitTransaction:", - "_closeListsForParagraphStyle:atIndex:inString:", - "imageConverter:bpc:renderingIntent:", - "allConnections", - "setAttributeDescriptor:forKeyword:", - NULL, - "importPumaLDAPServers", - "setIndexReferenceModelObjectArray:clearAllModelObjectObserving:", - NULL, - "_reflectSelection:", - "initWithHTTPResponse:", - "_newEntryWithUnavoidableSpecifier:path:url:isSymbolicLink:", - "_searchCacheForRowObject:", - "initWithTrack:", - "editedRange", - NULL, - "setContentPlacementTag:", - "shouldShowSeparatorBetweenControlWithID:andControlWithID:", - "_matrixWillResignFirstResponder:", - "setNeedsDisplayForItemAtIndex:", - "groupsController", - "_maxYTitlebarDragHeight", - "clearACLsBody", - "detachSubmenu", - "_finishInitializationWithFrame:andController:", - "_nearestCrayonUnderViewPoint:inRow:", - "availableFontNamesMatchingFontDescriptor:", - NULL, - "previewContentFrame", - "_validateAttributes:", - "applyForTime:presentationObject:modelObject:", - "infoForKey:", - "_setViewHandlesEvents:", - "setupDefaultLayers", - "_createMovieController", - "zoomPrefetchTaskDelay", - "initWithPickerOptions:", - "_newCustomizeToolbarItem", - "setMarkedTextAttributes:", - "_initWithURLFunnel:options:documentAttributes:", - "discard", - "defaultDecoderVersion", - "unbindTextureFromCGLContext:textureUnit:savedState:", - "setContinuouslyUpdatesValue:", - "_sendRuleAction", - "_updateCrayonsFromColorList", - "nicestRenderingFinalizeExpendStep:", - "_directoriesToSearch", - "wavePattern", - "_saveTornOffMenus", - "openLocalHost", - "originalImagePath", - "filterUsingPredicate:", - NULL, - "isRealPreview", - "_setInputColor1:", - "movieClipRegion", - "initWithTarget:", - "_updateSublayerPositionsForFlippedSuperview", - "gotoPreviousSelectionPoint", - "addPort:ofType:", - NULL, - "partCode", - "changeWindowFrameSizeByDelta:display:animate:", - "menuChangedMessagesEnabled", - "lastResortFont", - "visibleInputs", - NULL, - "copyStateFromMovie:", - "setProxySource:", - "getAudioMixerNode:andUnitElement:forConnection:", - "isVirtual", - "resetTotalAutoreleasedObjects", - "addComponentAction:componentID:", - "_setNameFieldContentsFromPosixName:", - NULL, - NULL, - "_takeColorFrom:andSendAction:", - "showsCheckerboard", - "_resizeKeepingPanelOnScreen:expand:", - "canStoreTextWithSize:", - "_generateContent", - "_loadImage", - "undoEdit", - "transition", - "_cfurlprtotectionspace", - "handleConnDeath:", - "proxyType", - NULL, - "_clearUnneccessaryItems:", - "updateSpellingPanelWithMisspelledWord:", - "generateOrderIntermediateInContext:", - "scriptingTextDescriptor", - "setDestinationType:", - "usageInPoster", - "contextHelpForKey:", - "valueForKeyFrame:controlType:", - "_minXTitlebarBorderThickness", - "_updateUI", - "findNode:matchType:", - "unsuppressSpecificNotificationFromObject:keyPath:", - "_setRotatedFromBase:", - NULL, - NULL, - "setIsContinuous:", - "_incrementImagePointerToCGImageRefCache", - "loadingProgressValue", - "setNilValueForKey:", - "mapROI:forRect:", - "initWithBufferSize:", - "outline:", - "_autoreleaseDuringLiveResize", - "setAllowedTypes:", - "_bringUpTrustSheetForNextCertificate", - "unarchiver:didDecodeObject:", - NULL, - "_propagateDeletesUsingTable:", - "_createSubstringWithRange:", - "doneTrackingMenu:", - "sqlString", - "_isCaptured", - "_getBackgroundRed:green:blue:alpha:", - NULL, - "computeRedGreenBlueROI:destRect:", - "isVolume", - NULL, - "replaceObject:withObject:", - "stringMarkingUpcaseTransitionsWithDelimiter2:", - "_requiresCacheWithAlpha:", - "_getClientDelegate", - "setCollectionBehavior:", - "scheduleEndOfSearch", - "_drawerVelocity", - "_processReferenceQueue:", - "sharedWindowID", - "moveParagraphForwardAndModifySelection:", - "_effectiveMessageForMessage:", - "setLevelsOfUndo:", - "exceptionWithName:code:reason:userInfo:", - "setIndependentConversationQueueing:", - "managedObjectModel", - "selectedRowInColumn:", - "setFileSize:", - "executeAppleEvent:error:", - "setURL:forPersistentStore:", - "timestamp", - "immutableCopyWithZone:", - "_replaceObject:", - "_trackMenuSelectionInMatrix:", - "reclaimPreviewView:forURL:itemIndex:", - "zAccel", - "subscriptRange:", - "singleLineTypesetter", - "_transactionStarted", - "_postItemWillCollapseNotification:", - "_removeAndDecrementBy:startingAtIndex:", - "editableState", - "imageWithName:", - "_deallocCursorRects", - "_startLoadingURL:timeoutDate:", - "nextCounter", - "duration", - "parser:didEndElement:namespaceURI:qualifiedName:", - "_setModifier:", - "surfaceID", - "setSubentityColumn:", - "setHasVerticalScroller:", - "_canDragNode:", - "integerValue", - "_conformingTypes", - "setMark:", - "_validDestinationForDragsWeInitiate", - "availableProfiles", - "certificate:isEqualTo:", - "_userSelectableRowIndexesForProposedSelection:", - NULL, - "expressionForKeyPath:", - "calendar", - "destinationPatch", - "setTextProc:", - NULL, - "forward::", - "_windowRefCreatedForCarbonControl", - "isSynchronized", - "_evaluateToBeginningOrEndOfContainer:", - "bilateralAddROI:destRect:userInfo:", - "_autoscrollForDraggingInfo:timeDelta:", - "initWithFigSampleBuffer:", - "_setShowOpaqueGrowBoxForOwner:", - "accessibilityIsTopLevelUIElementAttributeSettable", - "setSupportsSetAttributeValues:", - "_documentPreviewDidLoad:", - "setAccumulatorFormat:", - "_didSetFocusForCell:withKeyboardFocusClipView:", - "keyBindingManagerForClient:", - "_updateSelectionIndexes:", - "setFileListMode:", - "writeBOSString:length:", - "startProgress", - "setCellsHaveTitle:", - "orderManager", - "setMovieContentView:", - "_setIconRef:", - "highlightColor", - "_recentDocumentRecordsKeyForUserInterfaceItem:", - "addPatch:", - "_setPostsFocusChangedNotifications:", - "_stopControlsFade", - "initWithLeftExpression:rightExpression:customSelector:", - "_abCompareNotWithinIntervalFromToday:", - "addSelectionLayer:", - "redrawTimerNotification:", - "setSaveMode:", - "clampedFrame", - "addOpenToDictionaryRef:", - "openingEffect", - "cacheNodeWithUID:withResolution:", - "_dragCanBeginFromSomeMouseMotion", - "fileOwnerAccountNumber", - "startTimer:userInfo:", - "setFontName:", - "_keyViewFollowingPickerViews", - "addTimer:forMode:", - "gotString", - "_window", - "defaultCollator", - "_doScroller:hitPart:multiplier:", - "initWithEntity:", - "_configureObservingWithOption:", - "coerceValue:toClass:", - "deactivateIndexSheetWithAnimation:", - "updateNotifications", - "zoomImageToActualSize:", - "initAtPoint:withSize:callbackInfo:", - "_allowAnimated_addSubview:", - "iconView:validateDrop:proposedIndex:", - "addNamespace:", - "scriptErrorExpectedTypeDescriptor", - "_showOpaqueGrowBox", - "rotationForEvent:", - "_releaseOpenGLContext", - NULL, - "intersectWithRect:", - "setKVOContent:", - "startLiveSession", - "setInterfaceStyle:", - "_didNSOpenOrPrint", - NULL, - "autoBackupEnabled", - "commonAncestorContainer", - "generalSizeOfAChar", - "_setDataEnciphermentUsage:", - "_setColorList:", - "captureGraph", - "cellBackgroundColorDidChange", - "initWithCenterPoint:delegate:", - "setImageInterpolation:", - "initWithFontRef:size:", - "otherMouseDown:", - "_freeRepresentation:", - "parser:didStartMappingPrefix:toURI:", - "_indexOfRangeContainingIndex:", - "setName:", - "colorFromPasteboard:", - "halfSizeReconstructionROI:destRect:", - "_destroyShaders:", - "_windowOriginOffsetWhenHidingHint", - "valueWithRect:", - "_paperSizeInPageFormat:", - "faultingStatement", - "trackMouseForPopupMenuFormRepresentation:forItem:forLabelView:", - "sleepUntilDate:", - "_typeSelectAttributes", - "imageCropView:updateComponentStateWithZoomValue:withZoomControlsEnabled:", - "_tooltipStringForCell:column:row:point:trackingRect:", - "checkGrammarOfString:startingAt:language:wrap:inSpellDocumentWithTag:details:reconnectOnError:", - "middleNameFieldPresent", - "setUseCoreUI:", - "iPhotoBundleIdentifier", - "setControlsController:", - "updateWidth:", - "canConnectToPort:", - "setInputNeutralChromaticityX:", - "_rowHeightStorageEndLayoutChange", - "mouseEnteredToolTip:inWindow:withEvent:", - "_removeAllCellMouseTracking", - "maxColumns", - "_initWithCGLContext:options:", - "standardizedURL", - "sharpenReconstructedGreenEdges:radius:intensity:edgeIntensity:edgeThreshold:perceptual:blurred:image:", - "highQualityVideo", - "outputImage", - "refreshSuggestions", - "notifyOnSelectionChanged", - "relinquishFunction", - NULL, - "matchesAppleEventCode:", - NULL, - "_initWithCGLContextObj:", - "nts_DeletedUID", - "wantsToHandleMouseEvents", - "setForceBreaks:", - "readSelectionFromPasteboard:", - "selectionRed:green:blue:", - "removeChildAtIndex:", - "suspendExecution", - "initOffScreenWithSize:colorSpace:composition:", - "_rawData", - "initWithNSBitmapImageRep:", - "_sideTitlebarWidth", - "setAsMipmapOfImage:withSize:antialiased:quality:", - "_checkRotatedOrScaledFromBase", - NULL, - "decimalNumberByDividingBy:withBehavior:", - "_removeObjectAtArrangedObjectIndex:objectHandler:", - "maximumDecimalNumber", - "shouldResolveExternalEntities", - "_unhideChildren", - "setTextAttributesForNotANumber:", - "prepareForImport", - "_inputRampParams", - NULL, - "_addActiveConnection:", - "_reshapeContentAndToolbarView:resizeWindow:animate:", - "cancelButtonCell", - "_readStringIntoRange:fromPasteboard:", - "_aeteDataForAllSuites", - "cropElement", - "_buttonType", - "alternatePath", - "serializeServers:", - "writeBOSArray:count:ofType:", - "imageForPreferenceNamed:", - "_discloseContentBox", - "_setMarkedText:selectedRange:forInputManager:", - "editorDidEnd:returnCode:contextInfo:", - "allowsReordering", - "isNSDictionary__", - "unbindAll", - "_cellForRow:browser:browserColumn:", - "tableName", - "URLProtocol:didLoadData:", - NULL, - "content", - "control:didFailToValidatePartialString:errorDescription:", - NULL, - "isDoubleSided", - "setTotalRequestedMemory:ofType:rendererID:", - "setNodeNamespace:", - "scrollerDidChange:", - "setIdlingEnabledForNonQTKitMovies:", - NULL, - "dictionaryWithDictionary:", - "_termWindowIfOwner", - "isSingleSearchElement:property:value:comparison:level:", - "setFloatingPointFormat:left:right:", - "duplicates", - NULL, - "setNode:", - "_setBranchImageEnabled:", - "_freeAuthorizationRights:", - "object:shouldBind:toObject:withKeyPath:options:", - "setScheduledDate:", - "doDrawPageContent", - "PMSymbol", - "archiver:willReplaceObject:withObject:", - "unregisterModel:", - "_hasMenu", - "shapeY", - "initWithPointer:", - NULL, - "setVisibility:forTimeLine:", - "getObjects:range:", - "AppleUseCoreUIAtIndexes:", - "handleKeyEventWhileInOtherUI:", - "knobRectFlipped:", - NULL, - "_setDoublePageScrolling:", - "_windowNumber:changedTo:", - "setAlternate:", - "copyToObject:", - "computeOutsideShadow", - "searchResultCount", - "inlineSlideshowStatus", - "convertPoint:fromLayer:", - "headerHeight", - "_changedPossibleKeys", - "updateSelectedItem:forKeyDown:", - "centerControls", - "_setupTheater", - "_setInitialColumnContentSizeOfColumn:", - "serializeInt:", - "hotspotWithObjectToken:node:", - "registerModalWindow:", - "_setupToolTipsForView:", - NULL, - NULL, - "_blockRangeForGlyphRange:", - NULL, - "_toolbarViewClass", - "justifyWithFactor:", - NULL, - "_patternForBinding:", - "setRecentPictureAsCurrent:", - "_drawBackgroundWithFrame:inView:", - "_mainthreadComputePreviewThumbnailFinished:", - "_rowHeaderTableColumn", - "inputMethodInformation", - "valueWithRange:", - "_updateButtonsForModeChanged", - "movieWithFile:error:", - "_saveIconViewImagePosition:", - "invalidateFocus:", - "setSerializedValue:forStateKey:", - "eventRef", - "_removeEntity:", - "initWithFunc:forImp:selector:", - "_enableLogging:", - NULL, - "fbeQueryNode", - "readFromData:ofType:error:", - "open", - "markRemoteLocationWithServer:", - "incrementalLoadFromData:complete:", - "_cancelAddMarker:", - "getRectsBeingDrawn:count:", - NULL, - "shouldAbortExecution", - "_drawsVerticalGrid", - "fontSetChanged", - "_constrainSheetAndDisplay:", - "sharedPreviewView:willStartSharingWithPreviewPanel:", - "_oldPlaceWindow:", - "positionInternalViews:", - "_setDisplayContents:usingSimpleCommandDefaults:", - "_doAnimation", - "_segmentIndexForElementIndex:", - "tokenFieldCell:shouldUseWritablePasteboardTypes:", - "insertGlyph:atGlyphIndex:characterIndex:", - "scrollPrefetchTaskDelay", - "_paperShadow", - "_doOptimizedLayoutStartingAtGlyphIndex:forCharacterRange:inTextContainer:lineLimit:nextGlyphIndex:", - "newCellIndex", - "cellForRow:tableColumn:", - "setHighlightedItemIndex:", - "_checkCellCount", - "dsDataNode", - "performSelectorInBackground:withObject:", - "undo", - "_createSelectClauseInFetchWithContext:", - NULL, - "_sendsContentChangeNotifications", - "_updateCellsSize", - "isAccelerated", - "_setIsWhite:", - "schedulePriorityRange", - "cubeImage", - "childCount", - "_setCertAuthorityName:", - "availableLocaleIdentifiers", - "sharedAddressBook", - "_retainedBitmapRepresentation", - "_scrollToMatchContentView", - "setUnquotedStringStartCharacters:lowerCaseLetters:upperCaseLetters:digits:", - "getRectsExposedDuringLiveResize:count:", - "_replaceFontDescriptor:withDescriptor:inCollection:", - "_newConflictDetectionRecord", - NULL, - "textView:shouldChangeTypingAttributes:toAttributes:", - "_populateRowForOp:withObject:", - NULL, - "_web_stringByReplacingValidPercentEscapes_nowarn", - "_analyzeContentBindingInSyncWithBinding:", - NULL, - "setEmail:", - "_handleDocumentFileChanges:", - "_doLayoutWithFullContainerStartingAtGlyphIndex:nextGlyphIndex:", - "noImportableItemsSheetEnded", - "scheduleUpdate", - "setCIContext:", - "__oldnf_addThousandSeparators:withBuffer:", - "_userExtendSelectionWithRow:", - NULL, - "_clearAnyValidResponderOverride", - "_web_HTTPStyleLanguageCodeWithoutRegion", - "_allowAnimated_setFrameRotation:", - "nts_InitAddressBookWithDatabaseDirectory:", - "serializeToData", - "drawLabel:inRect:", - "createTextureBufferFromImageBuffer:target:sourceBounds:options:", - "scrollPrefetchTaskProgress", - "setIndicatorImage:inTableColumn:", - "tooltipExtensionView", - NULL, - "_issuePropPatchAtPath:updatingProps:inNameSpace:", - "setEntityMappings:", - "_person", - NULL, - "cellForComposition:", - NULL, - "_setNeedsRedrawBeforeFirstLiveResizeCache:", - "traitsOfFont:", - "retainedObjectIDsForRelationship:forObjectID:", - "setScalingFactorX:factorY:", - "cameraButton", - "replaceCharactersInRange:withRTF:", - "drawTextContainer:inRect:onView:pinToTop:", - "gridIndexesToClientIndexes:", - "objectMechanismsRequired", - NULL, - "currentButtonState", - "shouldCopyItemAtPath:toPath:", - "_setCurrentNode:", - "_userKeyEquivalentForTitle:", - "imageWillChange:", - "getStringValue", - "_replicatePath:atPath:operation:fileMap:handler:", - "isValidGlyphIndex:", - "initWithReceivePort:sendPort:", - "getPicture", - "advanceToTime:", - "setIdentity", - "_resetExecution", - "setContentBorderThickness:forEdge:", - "initRemoteWithOptions:", - "outlineView:willDisplayOutlineCell:forTableColumn:row:", - "_transferWindowOwnership", - "openDocumentWithContentsOfURL:display:error:", - "CA_decodeObjectForKey:", - "_stringForDatePickerElement:usingDateFormat:", - NULL, - "setFlipsIfNeeded:", - "_setHoveredCell:", - "generateTableName:", - "_web_suggestedFilenameWithMIMEType:", - "operationColor", - NULL, - "_validateCollections:", - "setPreferences:", - "bestMipmapForSize:", - "_constrainPoint:withEvent:", - NULL, - "sharedFontOptions", - "_subtreeDescriptionWithDepth:", - "attemptForHTTPCode:", - "addClip", - "freeGrabberIfNeeded", - "runUntilDate:", - "removeServiceProvider:", - "_resizeWindow:toFrame:display:", - "initWithPasteboard:", - "initRelockWithSession:URI:lockToken:duration:", - "initWithBytesNoCopy:length:", - "visitPredicateOperator:", - "drawBevel:inFrame:topCornerRounded:bottomCornerRounded:", - NULL, - "_clockAndCalendarReturnToHomeMonth:", - "accessibilityTextView", - "incObservationCount", - "abURLWithScheme:", - NULL, - "removeOldBackups:", - "setROISelector:", - "greenColor", - "_itemType", - "_encipherOnlyUsage", - "__oldnf_surroundValueInString:withLength:andBuffer:", - "_startWatchingWindowKeyness", - "setAsReferenceOf:", - "_drawCellAt:col:insideOnly:", - NULL, - "_toolbarAttributesChanged:", - "isDocumentEdited", - "setNumberOfColumns:", - "_finishSavingToURL:ofType:forSaveOperation:", - "setTabView:", - "_dispatchNextOperationInQueue", - "insertAttributedString:atIndex:", - "alternateMagnifying", - "imageFromContext:withComposition:fxCenter:qcRenderer:", - "freeAllCaches", - "tableView", - "tokenField:shouldAddObjects:atIndex:", - "localEditInAddressBook:", - NULL, - "imageAtFrameIndex:", - NULL, - "initWithValues:objectID:", - "toggleWritingOperationWithOutputFileURL:bufferDestination:scheduledTime:", - "_autorecalculateSizesIfNotSetExplicitly", - "setForeignKeys:", - "_bezelAndIndicatorAreaWidthForCellFrame:", - "_createCertExportFileForCAWithFormat:pathToExportFile:exportedData:", - "setDynamicVerticalScroller:", - "_setIndex:forPort:", - "iconForSpecifier:size:", - "recentPictures", - "addRangeOfInterest:", - "advanceToPeakPoint", - "getPropsRequestWithSession:URI:properties:", - "replaceElementsInRange:withElement:coalesceRuns:", - NULL, - NULL, - "recordUpdateForObject:", - "nameOfSlideshowItemAtIndex:", - "_insertionGapForItemViewer:forDraggingSource:", - "_crayonMaskImage", - "closingDown", - "initWithContainerClassID:key:nonmutatingMethods:mutatingMethods:proxyClass:", - "startLoading", - "_subviews", - "commitEditingWithDelegate:didCommitSelector:contextInfo:", - "_advanceTime", - "criticalValue", - NULL, - "application:openFile:", - "ramManagerDidUnbindMipmapWithUID:withSize:", - "accessibilityModalAttribute", - "phoneticFirstName", - "_deallocExtraData", - "_isNullExpression:", - "_shouldDrawContentsAtRow:column:withCellFrame:clipRect:", - "acceptInputForMode:beforeDate:", - "addRegion:", - "_primitiveSetNextKeyView:", - "rotated", - NULL, - NULL, - NULL, - "defaultVoice", - "initWithKey:ascending:", - "_setPKINITServerAuthUsage:", - "isFauxDisabledNode:", - "_mouseHit:row:col:", - "imageRepWithContentsOfFile:", - "loadPlugin", - "_hostString", - "isCumulative", - "_URLWithData:relativeToURL:", - "_removeReferencesToCarbonWindowRef", - NULL, - "_delayedSelectRow", - "isMultiline", - "selectedIndex", - "classForStore:", - "allPeople", - "validateToolbarItem:", - "_performRemoveFileAtPath:", - NULL, - "_appkitManagesLayer", - "databaseOperationForGlobalID:", - "_drawTickMarksWithFrame:inView:", - "ramCacheUsed", - "shouldChangePrintInfo:", - "blurHorizontalPass9ROI:destRect:", - "canBecomeKeyWindow", - "searchCustomSearchDataSources:", - "setContentsNoCopy:length:freeWhenDone:isUnicode:", - "localizedReferenceDocumentationForFilterName:", - "commentColor", - "targetKey", - NULL, - "_dockRestarted", - NULL, - "beginLoadInBackground", - "_updatePopUpWindowFrameFirstTimeInSession:", - "drawPopupAnnotationsWithBox:", - "splitViewDidResizeSubviews:", - "_reloadCellDataAtIndex:", - "executeAtTime:", - "_creteCachedImageLockIfNeeded", - "setScrollXEnabled:", - "fileAttributesAtPath:traverseLink:", - "mouseDraggedDelegate:", - "dump", - "_initWithObjectNoExceptions:", - "setupEditFieldKeyBindings", - NULL, - "_setSortDescriptors:", - NULL, - "_registerDefaultStoreClassesAndTypes", - NULL, - "_indexForDecrementMove:", - "entryType", - "addSubview:positioned:relativeTo:", - "initWithFlags:rights:environment:", - "access", - "startOrStopProfiling:", - "handlePreviewImageChanged", - "stopCapture", - "lockButtonClicked:", - "_heartBeatThread:", - "mutableString", - "isTranslated", - "initWithFormDictionary:", - "_postItemWillExpandNotification:", - "_coreAttributesFromRange:whichAttributes:", - NULL, - "makeCellAtRow:column:", - "clickedColumn", - "_updateItemsByCompoundTemplates", - "_markUsedByCell", - "sharedSoftwareImageManager", - "_titleRectForTabViewItem:", - "_searchForSystemImageNamed:", - "_filterObjects:", - "computeOutline", - "inlinePreview:didUpdateDisplayWithImage:", - "bindMipmapItemFromDisk:withNode:withUID:", - "ISS_stringByURLQuoting", - "prepareAndExecuteSQLStatement:", - "cell", - "_readHTMLIntoRange:fromPasteboard:", - "setIgnoresSSLCertificateErrors:", - "setAllContextsOutputTraced:", - "_prepareIndirectKeyValueCodingCallWithPartialControllerKey:controller:", - "_executeSQLString:", - "_needRedrawOnWindowChangedKeyState", - "getDataAtPath:", - "dataOfType:error:", - "appendBezierPathWithOvalInRect:", - "ISS_URLWithScheme:host:port:uri:", - "panelConvertFont:", - "setTransition:", - "_setRunAsSheet:", - "rasterizationChanged:", - "erase", - "setDrawsOutsideLineFragment:forGlyphAtIndex:", - "targetAndArgumentsAcceptableForPerformAction", - "setValue:forKeyFrame:controlType:inTimeLine:", - "centerSelectionInVisibleArea:", - "_fondID", - "setMaximumIntegerDigits:", - "flattenedImage:context:", - "_updateOptions", - "setDiskLabelValues:", - "lineBreakByHyphenatingBeforeIndex:withinRange:", - "minimizeButton", - "_downloadFinished", - "timeoutDateFromNow", - "rightExpression", - "createAccelContext", - "isRTL", - "allCards", - "forcedContentTypeUTI", - NULL, - "_textColorWithMode:", - "setCalendar:", - "_gsave", - "_shouldAlwaysShowControls", - "deviceRGBColorFromArray:", - NULL, - "localizedInfoDictionary", - NULL, - "resizeColumnAtIndex:toWidth:", - "advanceToProgress:", - "setOrientationTag:", - "translateTo::", - "_keyAgreementUsage", - "runPoofAtPoint:withSize:callbackInfo:", - "startSubelementIndex", - "mutableSubstringFromRange:", - "_setupRFC822Names:inCEGeneralNames:", - "_performNonAEAwareWorkaroundForSpec:", - "decryptWithDelegate:", - "_processChangedStoreConfigurationNotification:", - NULL, - "drawRect:fromDisplayLink:", - "_accessibilitySegmentAtIndex:", - "textContainerOrigin", - "_initWithContentSize:preferredEdge:", - "nickNameFieldPresent", - "stopAnimation", - "drawIndeterminateInteriorWithFrame:inView:", - "_isUnmarking", - "setFrequency:", - "temporaryAttribute:atCharacterIndex:effectiveRange:", - "_addingOrAnimatingNewColumn", - "_typeIdentifierForName:", - "stateUpdated", - "_setPropertiesForDelegate:", - "_graphUpdated:", - "setSidebarState:", - "setPrimitiveAddress:", - NULL, - NULL, - "setCanWrite:", - "sessionWithScheme:host:port:", - "createCGContext", - "_operationInfo", - "resetMatrices", - "accessibilityWindowNumber", - "_createNewSliceWithFrame:ruleEditorView:", - "maximumRecordedFileSize", - "notificationKey", - "numberOfDataSourceItems", - NULL, - "magnificationFilter", - "setRegistryClass:", - "_clearFindIndicator", - "hitTestWithImage:x:y:", - "filteredArrayUsingPredicate:", - "imageBrowser:willMoveItemAtIndex:to:scaleFactor:", - "fillMode", - "cancel", - "setEncoding:", - "accessibilitySelectedColumnsAttribute", - "frameImageAtTime:withRepresentations:error:", - "certExpirationDateIndex", - "systemLocale", - "setColorList:", - NULL, - "_scalesBackgroundVertically", - "certificatesDisclosed", - "initWithHue:saturation:brightness:alpha:", - "_lastNonHiddenColumn", - "addMipmapItemToCache:withUID:", - "updatePublicUserInfo:privateUserInfo:withRecords:userInfoKey:couldAffectSyncing:couldAffectSharing:privateTablesChanged:modificationDate:ignoreRecordsForKey:", - "imageState", - "_loadPreviewTimedOutForDocumentPreviewView:", - "drawSelectionAroundIconRect:", - "updateReorderingPosition", - "_certType", - "_sizeToFitColumnMenuAction:", - "mouseExited:withFrame:inView:", - "_unregisterForMovieIdle", - "_web_addErrorsWithCodesAndDescriptions:inDomain:", - "setBundle:", - "boundsRectForContentRect:inRect:textContainer:characterRange:", - NULL, - "suggestedFilename", - "previewPanelUserDidChangeFrame:", - "sharedSlideshow", - "fixGlyphInfoAttributeInRange:", - "numberOfColumns", - "addBackButton", - "email", - "toolbar", - "defaultWindingRule", - "autoUpdates", - "_hashMarkDictionaryForDocView:measurementUnitToBoundsConversionFactor:stepUpCycle:stepDownCycle:minimumHashSpacing:minimumLabelSpacing:", - "replaceItem:forExistingKey:", - "addRepresentation:", - "_relationshipNamesByType:", - "_userEmailAddress", - "setFrameRotation:", - "exportSlideshowItem:toApplication:", - "sizeCopyrightView", - "_pageScaling", - "setupContentView", - "infoWithType:size:", - "textView:willDisplayToolTip:forCharacterAtIndex:", - "colorizeByMappingGray:toColor:blackMapping:whiteMapping:", - "_selectRow:subrow:byExtendingSelection:members:", - "_dictionaryForKeyValuePairArray:pullExcludedKeysFromDictionary:", - "toolTipString", - NULL, - "tokenAtCursor", - "setFloatValue:knobProportion:", - "gotoEnd", - "searchState", - NULL, - "scrollRangeToVisible:", - "_setTrackingRect:inside:owner:userData:useTrackingNum:install:", - "_createItemFromItemIdentifier:", - "sendInvocation:internal:", - "localDrag", - "QTMovie", - NULL, - "setRawDataFileName:", - "notificationWithName:object:userInfo:", - "previewView:didChangeDisplayStateForDocumentURL:", - "autoresizesSubviews", - "parseORG", - "_bindNamespaceName:URI:", - "drawGroupsBackground", - "createAttributesListForApple:", - NULL, - "generatesDecimalNumbers", - "cancelLoadingImageDataForTag:", - "_fixNSMachPortLeak", - "_lineColor", - "_moveObjectInContainer:withKey:atIndex:toContainer:withKey:atIndex:replace:", - "PDFViewScrollOpenGutterToWidth:", - "initWithGraph:sourcePort:destinationPort:arguments:", - "openGLTextureOffset", - "setDisabledTextColor:", - "imageBrowser:groupAtIndex:", - "setCanStartSlideShow:", - "cacheDeletionStatement:", - "nodeNames", - "viewSize", - "outlineView:didDragTableColumn:", - "_findFirstNonSelectedIndexFrom:to:selectedIndexes:", - NULL, - "zoomPrefetchTaskProgress", - "setImageBrowser:", - "_nodesCountInGraph:", - "nts_ValueForProperty:row:record:", - "_setTrustValues", - NULL, - "setAllowsIdentitySelection:relayout:", - "isSimpleRectangularTextContainer", - "_setCorrelationTableName:", - NULL, - "_isParentGroupOfRecord:", - "needFinalDataForKey:", - "_allowToolbarToStealEvent:", - "_readRulerIntoRanges:fromPasteboard:", - "initWithOperand:andKeyPath:", - "_writeSelectionToArchiver:fromPoint:", - "raise:format:arguments:", - NULL, - NULL, - "layoutForStartingGlyphAtIndex:characterIndex:minPosition:maxPosition:lineFragmentRect:", - "maximumLengthOfBytesUsingEncoding:", - "updateIndexPtr", - "_fastHighlightGlyphRange:withinSelectedGlyphRange:", - "_scriptingDescriptorOfEnumeratorType:orReasonWhyNot:", - NULL, - "_backgroundFileLoadCompleted:", - "deviceGrayColorSpace", - NULL, - "setMetadata:forPersistentStoreWithURL:error:", - "contentView", - "_delayStartEditing:", - "_isRelationship", - "halfSizePictureEdges:scale:image:", - "setContentSize:", - "_createImageBufferFromProvider:withFormat:target:transformation:bounds:colorSpace:options:", - "personChanged:", - "initWithTextAlignment:location:options:", - "didChangeValueForKey:withSetMutation:usingObjects:", - "draggingUpdated:", - "setROIInfoForKernel:jsROIInfo:", - "newComponentByID:", - "configureForDisplayMode:andSizeMode:", - "_switchToSetting:error:", - "rectForLayoutAtPoint:inRect:textContainer:characterRange:", - "inspectorNibNameWithIdentifier:", - "validateTakeValue:forKeyPath:", - "initWithOutput:connection:backgroundQueue:", - "_didStart:", - "beginUndoGrouping", - "initializeParameterDataStructures", - "initWithCGImageSource:", - "editableStateAtIndex:", - "cellBackgroundColor", - "_addColumnWithoutChangingVisibleColumn", - NULL, - "removeFreedView:", - "willSetLineFragmentRect:forGlyphRange:usedRect:baselineOffset:", - "attributeColumnDefinitions", - "invalidate:", - "_doPositionDrawerAndSize:parentFrame:", - NULL, - "isNotEqualTo:", - NULL, - "shouldPrint", - "_nodeRefFromNode:", - "imageDidChange", - "halfSizePicture:pattern:", - "beginMouseOperation", - "setLength:", - "isDisplayPostingDisabled", - "deserializePListKeyIn:", - "_newToolTipWindow", - "toolTipsFontOfSize:", - "_refreshDetailContentInBackground:", - NULL, - "nts_SubscribedPeople", - "setImageScalingY:", - "initWithHelpIndex:", - "keyValueBindingForKey:typeMask:", - "localizedKeys", - "delayedShowcaseSelectedResult:", - NULL, - "secondOfMinute", - NULL, - "_keySize", - "archiverDidFinish:", - "style", - "_modelObservingTrackerClass", - "imageWithJPEGFile:", - "saveOptionsChanged:", - NULL, - "_hasWindowRefCreatedForCarbonControl", - "keyForProperty:entityName:entityKey:", - "hideShowLastImportGroup:", - "transactionID", - "filterArray", - "_arrayContent", - "sortedArrayHint", - "plugIn", - "__oldnf_containsCharFromSet:", - "expressionForEvaluatedObject", - "viewBoundsChanged:", - "scrollPageUp:", - "initWithProtocolFamily:socketType:protocol:address:", - "containerIsRangeContainerObject", - "permitWithRights:flags:environment:authorizedRights:", - "_setAntialiased:", - "canUndo", - "numberOfComponents", - "initWithDelegate:keyToSelectorMap:context:", - "_fillBackground:withAlternateColor:", - "showGraphEditorInspector:", - "_updateOutputDeviceUniqueID", - "imageUnfilteredFileTypes", - "initWithClient:document:", - NULL, - "setViewsNeedDisplay:", - "_scriptingIntegerDescriptor", - "_cellForRow:", - "_createTransformedCIImage:transformation:bounds:", - NULL, - "subentityID", - "_reflectDocumentViewBoundsChange", - "setAnimations:", - "_oldIBCompatDrawTitleWithFrame:inView:", - "_loadAllCompositions", - "_embossedDisabledForegroundTextColor", - "_shouldPostEventNotifications", - "_fontDescriptorsForFamily:inCollection:", - "textureName", - "archiver:didEncodeObject:", - "handleAnalyzeNextGRL:", - "setStructureValue:", - "_characterIndexForMoveRightFromSelectedRanges:", - "titleColor", - "nts_ClearInstanceCachesForGroup:", - "beginModalSessionForWindow:relativeToWindow:", - "clearTemporaryCaches", - "_setRepresentationListCache:", - "createConnectionFromPort:toPort:", - "metaDataCacheDirectory", - "hasThousandSeparators", - "_authLock", - "_setEntitysReferenceID:", - "preferredFileNameExtensionForType:", - "_cocoaErrorString:fromBundle:tableName:", - "_createColumn:empty:", - "_valueClass", - "refusesFirstResponder", - "_layoutOrderInsertionIndexForPoint:previousIndex:", - "addCropSelectionLayer:", - "_isPendingInsertion", - "outlineView:dataCellForTableColumn:item:", - NULL, - "checkPoint:", - "accessibilityPerformAction:", - "drawBackgroundForGlyphRange:atPoint:", - "abCompareBackupInfo:", - "_validateEditing:", - "editColumn:row:withEvent:select:", - "currencyDecimalSeparator", - "trackMouse:inNode:bounds:view:", - "setTextAttributesForPositiveValues:", - "autosavesConfigurationUsingIdentifier", - "booleanForKey:inTable:", - "previewPanelSelectNextItem:", - NULL, - "pointerType", - "displayStringsForParagraphStyle:", - "abandonPreviewView", - "getAllCollections", - "_setHasLayerBackedOpenGLContext:", - "_syncList", - NULL, - "numberWithBool:", - "setIdlingEnabled:", - "_observeKeyPathForBindingInfo:registerOrUnregister:", - "_tileAndRedisplayAll", - "periodicFlushInterval", - "setVisualDrawsMovieBoxBackgroundColor:", - "_addSubentity:", - "webArchiveData", - "coerceString:toColor:", - "objectWithID:", - "performSearch", - "ikRootLayer", - "_glyphDescription", - "_web_mimeTypeFromContentTypeHeader_nowarn", - "newCacheNodeForManagedObject:", - "_originalImageBoundingBoxSizeIncludingRotation", - "addEntriesFromList:", - "titleWidth", - "selectItemWithIdentifier:", - "encodeRect:", - "setAttachmentSize:forGlyphRange:", - "ruleEditor:layoutOrderForItem:inRow:", - NULL, - "setTextAttributesForZero:", - "_addConnectionsFromObject:toArray:", - "currencySymbol", - "setRequiredFileType:", - "_getSizeFromDock", - "allKeys", - "_thumbnailLayerAtIndex:", - "findRecordsInServer:withNode:withServer:withCounter:", - "_updateLayerTreeRenderer", - "compositeName", - "_connectionWasEstablished", - "_setSuppressingKVO:", - "isFlushWindowDisabled", - "setAfterEntityLookup:", - "remoteStoreNameForKeychainRef:", - "_checkForSimpleTrackingMode", - "imageFlow:cellWasDoubleClickedAtIndex:", - NULL, - "_placeholderAttributedString", - "titleWithSelection:", - NULL, - "bidiProcessingEnabled", - "setPrimitiveCreationDate:", - "pageViewHeight:", - "_prepareEventGrouping", - "_dragDataItemViewer", - "removePopupView:", - "_loadServicesMenu", - "initWithDatabaseAtPath:", - "clearCaches", - "setInputWhiteParams:", - "_processNotificationQueue", - "setDisplayedTitle:", - "nodeAcceptsFirstResponder:view:", - "videoMemorySize", - "updateConfigDataIfNeeded", - "unarchiveObjectWithFile:", - "sharedCallbackRegistry", - "certificationPathDisclosed", - "setShowsStateBy:", - "releaseVolatileImageRep", - "convertSizeToBase:", - "takeColorFrom:", - "evaluate", - "rectOfItemAtIndex:", - "directoryResultsSubrows", - "startClockwork", - "_initWithContainerClass:key:propertiesBeingInitialized:", - "_enableAutosavingAndColumnResizingNotifications", - "_ensureLocalizationDictionaryIsLoaded", - NULL, - "dictionaryRepresentationOfSmartGroupAtRow:resultsView:", - "nodeAttributesWithName:", - "canExportToApp:version:newInfo:", - "primitiveValueForKey:", - "_setIsExpanded:", - "_isForeignObjectExpression:givenContext:", - "removeFromSuperview", - "initWithLevelIndicatorStyle:", - "stringByAppendingString:", - "removeText:", - "setShadowColor:", - NULL, - "_layerBackedOpenGLContext", - "setValueInTemporaryCache:forProperty:", - "sum:", - "addAuthHeaderToMessage:", - "cancelPreviousPerformRequestsWithTarget:selector:object:", - "_textDimColor", - "_shouldDrawDragged", - NULL, - NULL, - "_setNeedsDisplayInColumn:includeHeader:", - "quickTimeMovieController", - "setAspectRatio:", - "settingsView:renameKey:toKey:", - NULL, - "isContextHelpModeActive", - "_convertPoint:toAncestor:", - "pointerToElement:directlyAccessibleElements:", - "_willAllowSpace:", - "setPatch:", - "pushChangeCommand:", - "daylightSavingTimeOffset", - NULL, - "visibleThumbnails", - "_setToolbarItem:", - "extraLineFragmentRect", - "_addEntities:toConfiguration:", - "setInteger:forKey:", - NULL, - "_openLinkFromMenu:", - "searchControllerDidScheduleSearch:", - "defaultTextColorWhenObjectValueIsUsed:", - "componentsJoinedByString:", - "request:readResponseBody:", - "validateFocusedIndex", - NULL, - "supportedUploadFormatsForContext:", - "parseAccessDescription:index:", - "parseTokenEqualTo:mask:", - "multiStatusRequestWithSession:method:path:responseClass:", - "_initWithImpl:", - "ikImageBackgroundLayer", - "dockTitleIsGuess", - "storeThumbnailDataInfo:withUID:withSize:", - "usingDefaultVoice", - "_tileIfNeeded", - "_appendLog:", - "compositionParameterView:shouldDisplayParameterWithKey:attributes:", - "windowDidResize:", - "configureAsServer", - "cacheHint", - "_dataWithoutConversionForType:", - "orderFront", - "popupFrameForAnnotation:gutterBounds:", - "responderView", - "object:withObservance:didChangeValueForKeyOrKeys:forwardingValues:", - "maxWidthOfLocalizedDefaultGroupStrings", - "rowAtPoint:", - "initWithGroup:members:addressBook:direction:", - "_allowsTearOffs", - "_compareMultiLabelScalarWithRecordValue:", - NULL, - "setVertical:", - "_delegateRespondsTo_shouldTypeSelectForEvent", - "_updateFileNamesForChildren", - ".cxx_destruct", - "defaultFormatterBehavior", - "localizedDescriptionForType:", - "tableView:isGroupRow:", - "_maybeScrollMenu", - "writeShadow:", - "addPeopleFromPasteboard:toGroup:", - "annotationsDidChange:", - "_processHeaders:", - "initWithCATransform3D:", - "setKeyPath:", - "detachColorList:", - "_charIndexToBreakLineByWordWrappingAtIndex:lineFragmentWidth:hyphenate:", - "cropSize", - "setHighlightMode:", - NULL, - "setSelectionByRect:", - NULL, - "_overlayRequestPostHandler:", - "createPixelBufferFromTextureBuffer:bounds:options:", - "stringForKey:", - "outlineView:shouldSelectItem:", - "initForToolbar:withWidth:", - "_handCursor", - NULL, - "addTypes:", - "exposeBinding:", - "moveUserSelectionWithEvent:", - "enterProximity", - "viewDidEndLiveResize", - "_windowFileButtonSpacingWidth:", - "hotspotsVisible", - NULL, - "contentAlpha", - "setAutoresizes:", - NULL, - NULL, - NULL, - "self", - "_startRendering:", - "dataReferenceWithDataRef:type:", - "initWithPageIndex:atPoint:fileURL:", - "cellsCount", - "disposeGlyphStack", - "defaultSubcontainerAttributeKey", - "postQueryHasBeenCanceledNotification", - "_isMiniaturizable", - "labelColor", - "maximumSize", - "_setFrame:", - "objectBeingTested", - "initWithOptions:", - "beginEditing", - "maximumNumberOfColumns", - "backgroundLayer", - "_setFirstColumnTitle:", - "outlineView:willDisplayCell:forTableColumn:item:", - "_changeAddressFormat:", - "setPatternPhase:", - "createCGImageWithRenderingIntent:shouldInterpolate:", - "layoutToFitInViewerFrameHeight:", - "setRefusesToBeShown:", - "setIsRealPreview:", - "setImageWithoutInvalidate:", - "validateAction:", - "_drawTableExteriorFocusRingIfNecessaryInClipRect:", - "sendBeforeDate:components:from:reserved:", - "_downloadPath:toPath:", - "unbind", - "turnOffEditMode", - "_colorComponentsForIndex:redComponent:greenComponent:blueComponent:", - "setProcessName:", - "_keyRowOrSelectedRowOfMatrix:inColumn:", - "_removeTrackingRectForToolTip:stopTimerIfNecessary:", - NULL, - "sublayerTransform", - "_21vCardRepresentationAsData", - "TIFFRepresentationUsingCompression:factor:", - "_setToolTipRectsDirty:", - "setAutoInstallBlendMode:", - NULL, - "disabledControlTextColor", - "initWithValue:sqlType:attributeDescription:", - "regionWithCGSRegion:", - "removeObserver:fromObjectsAtIndexes:forKeyPath:", - "setCIImage:", - "_finishHitTracking:", - "contentValueWithEditedMode:contentIndex:", - "_mipmapCommonInit", - "updateSelectionProcess:", - "accessibilityFocusRingBoundsForBounds:", - "setData:", - "makeQueries:", - "advancePastEOLSingle", - NULL, - "initWithSession:method:path:", - "nts_InitDefaultContactManager", - "filterPasteboardWithData:ofType:", - "createOutputPortWithArguments:forKey:", - "editedRow", - "closePath", - NULL, - "setNumberOfTickMarks:", - "clippedItems", - "_setScriptErrorFromKVCException:", - "popupViewExited:", - NULL, - "_shouldSelectTabViewItem:", - "_setSegmentedCellStyle:", - "_colorPickerWithIdentifier:", - "_accessibilityUnhiddenTableColumns", - "setGradientBorderWidth:", - NULL, - "adjustZoomSliderValue", - NULL, - "initWithContentsOfURL:ofType:", - "_imageNameForPerson", - "handleHICocoaViewEvent:callRef:", - "_getCharactersAsStringInRange:", - "_isActivated", - "_resources", - "_recursiveGatherAllKeyViewCandidatesInArray:", - "setEditButton:", - "hasCharacteristic:", - "localizedString:", - "setActiveColor:", - "_errorNumber", - "_newConflictRecordForObject:andOriginalRow:", - "propertyListFromStringsFileFormat", - "_setExtendedKUECodeSigningDevelopment:", - "_markWidth", - "_setEnableFlippedImageFix:", - NULL, - "setImageHasChanged:", - "placeholderForMarker:", - "browser:draggingImageForRowsWithIndexes:inColumn:withEvent:offset:", - "_accessibilityTitleElement", - "_openUntitled", - "_entitiesForConfiguration", - "displayToolTip:", - "_setFrameUsingName:domain:", - "setColor:forTimeLine:", - "removeToolbarItem:", - NULL, - "setAutoDistinct:", - "setScaledImageSize:", - "_setViewNeedsDisplayInRect:", - "countOfChildNodes", - NULL, - "_menuChanged", - "hidesOnDeactivate", - "imageDidChange:", - "cacheSize", - "menuDidClose:", - "_updateCache", - "_compileKernels:", - "_pkinitClientAuthUsage", - "_quotaAttributesRequestPostHandler:", - "_observePathOfEntry:", - "loaded", - "decodeInvocation", - "_old_initWithCoder_NSTableView:", - "setGraph:node:element:scope:", - "_willPresentRevertingError:", - NULL, - "lastImportGroup", - "documentForWindow:", - "unlockWithCondition:", - "runSyncToolWithArguments:wait:", - NULL, - "_web_characterSetFromContentTypeHeader_nowarn", - "prefetchRelationshipKeyPaths", - "doSelectAll:", - NULL, - "_scaleImage:forSize:", - NULL, - "setColor:forIndex:", - NULL, - "writePDFInsideRect:toPasteboard:", - "validatesImmediately", - NULL, - "deletedMembers:", - "encodeByrefObject:", - "setCommandDescription:", - "_stateForPorts:", - "_drawContentsAtRow:column:clipRect:", - "_fastestEncodingInCFStringEncoding", - "grow:", - "initWithFormat:", - "initWithCoder:", - "_containerTextViewFrameChanged:", - "annotation", - "_initialize:::", - "adjustScrollView", - "_setHidden:", - "menuBarFontOfSize:", - "bitmapInsideRect:", - "_uniquer", - "_maxXTitlebarButtonsWidth", - "runModalForSavePanel:", - "isAutomaticLinkDetectionEnabled", - "_parsePredefinedAttributes1", - "goUpDirectory", - "lockDate", - "identityComposition", - "ascending", - "setAllowsEmptySelection:", - NULL, - "sqlTypeForPropertyAtEndOfKeyPathExpression:", - "flushInterval", - "notShownAttributeForGlyphAtIndex:", - "_resultOfDividerDragToPosition:withParams:", - "initWithPNGFile:options:", - "abBackupGroupsCount", - "displayedColumns", - "_writeURLInRange:toPasteboard:", - "_removeTrackingRects", - "getNodeAsContainerNodeForBrowsing:", - "URLHandleUsingCache:", - "graphWillStartForSession:", - NULL, - "removeItemAtIndex:", - "importFilesToIPhoto:", - "_checkDirectories", - "absoluteY", - "_wantsKeyboardLoop", - "needsSizing", - "bitmapFormat", - "setIconURL:", - "_setupRunLoopTimer", - "fragment", - "quickLookThumbnailOptions", - "qcPickerDidValidate:", - "cancelPendingCertLookups", - "setContent:", - NULL, - "childContext:didForgetObjectsWithObjectIDs:", - "_DIBRepresentation", - "_resizeCache:cachedSeparately:bps:numColors:hasAlpha:", - "_nodeAcceptsFirstResponder:", - NULL, - "_saveDocumentWithDelegate:didSaveSelector:contextInfo:", - "initShortCut", - "setEvaluationErrorNumber:", - "_currentBorderEdge", - "checkMipmapVersion", - "quickLookSlideshowMode", - "_propertySearchMapping", - "_doAnimationStep", - "fillableRectForBounds:", - "checkZoomBoundaries", - "abVCardDataRepresenation", - "setOrigin:", - "representationOfCoveredCharacters", - "_calendarFirstDayOfDisplayedMonthDateComponents", - "keyPathIfAffectedByValueForMemberOfKeys:", - "_defaultDocIcon", - NULL, - "_selectAllContent:inDetailController:", - "_printPanel:didEndAndReturn:contextInfo:", - "selectedRowIndexes", - NULL, - "_swapToolbarItemViewerInDirection:relativeToView:", - "accessibilityToolbarButtonAttribute", - "menuNeedsUpdate:", - "nts_Reconnect", - "isMenuIndicatorShownForSegment:", - "_markerAreaRect", - "initWithObjects:count:", - "_enterElement:tag:display:embedded:", - "apply:to:", - "_setMouseActivationInProgress:", - "_delegateRespondsToWillDisplayCell", - "setToValue:", - "slideImage:from:to:", - "dateWithString:calendarFormat:locale:", - "_proxyForUIElement:", - "imageBrowserShouldValidateEditingOnFocusChange:", - "targetAndArgumentsAcceptableAtIndexPath:", - "_isBinaryAttribute:length:", - "collapseItem:", - "_delegateRespondsToWriteRows", - "_deferredBuildAndRunGraph", - "constraintWithAttribute:relativeTo:attribute:", - "accessibilitySearchButtonAttribute", - "_fixupSortDescriptorPlaceholdersIfNecessary", - NULL, - "_external:", - "setUserImage:", - "secondarySelectedControlColor", - "_windowDepth", - "internalNameForPropertyName:version:", - "compressionChanged:", - "centerTabMarkerWithRulerView:location:", - "_validateAndCommitTokens", - "slideshowSwitchToSinglePage:", - "hostMatchingFilter:imageBPC:imageRenderingIntent:", - "read", - "_noteNote3:", - "enableAll:", - "lockResourceAtPath:withDuration:andETag:", - "resolverClass", - "_new_implicitlyObservedKeys", - "removeSelectionLayers", - "showContextHelpForObject:locationHint:", - "_isHUDWindow", - "processSubInfo:forKey:", - "dataWithContentsOfFile:options:error:", - "setMinDate:", - "initWithBestLocationRep:", - "increaseLengthBy:", - "hitTestWithRect:", - "_atsFontID", - NULL, - "docxFormatData", - "_localizedColorListCopyrightString", - "trackWithEvent:", - "sortedArrayUsingSelector:hint:", - "activateContextHelpMode:", - "selectItem:", - "setMinWidth:", - "_initWithContainerClass:keyPath:firstDotIndex:propertiesBeingInitialized:", - "updateGrammar:", - "fileManager:willProcessPath:", - "setNoFeedback:", - "_mouseDownNonListmode:", - "getBezelGroup:points:", - NULL, - "_hideToolbar:animate:", - "_columnResizeChangeFrameOfColumn:toFrame:constrainWidth:resizeInfo:", - "_setUpAppKitCoercions", - "makeShown:", - "unsignedIntValue", - "_setTargetProcess:", - "limitAmountOfMemoryUsed", - "browserDoubleClick:", - "_updateAttributesFromAudioChannelMapFromPropertyListener", - "sendBeforeDate:", - "setSelectedCompositionIndex:direction:", - "_makePatch", - "_wakeup", - "replaceImage:imageState:", - "menusDictionary:", - "floatValueOfProperty:", - NULL, - "_reorderColumn:withEvent:", - "records", - "setParameterList:", - "_enableFlushWindowWithoutPerformingFlush", - "scrollCellToVisible:", - "_updateIndexAndDropOperationWithDrop:", - "_extendedCharRangeForInvalidation:editedCharRange:", - NULL, - "imageBrowser:didMoveItemAtIndex:to:scaleFactor:", - "setAdvance:forIndex:", - "defaultFetchRequest", - "resetInspectorViews", - "_attributeValueClass", - "initWithContext:format:target:pixelsWide:pixelsHigh:options:", - "pageCount", - "_setSlotIfDefault:", - "unassociatePopup:", - "findInView:forward:", - "minimumWidth", - "formUnionWithCharacterSet:", - "writeStyleSheetTable", - "_linkShaderOnContext:", - "setAlpha:", - NULL, - "newWithName:url:filterData:actions:domains:comments:readOnly:owner:", - "isEmptyHTMLElement:", - "_startTransitionWithDocumentAtIndex:usingImage:atFrame:", - "_zoomFactor", - "_logColumnWidths:", - "defaultCropIsZoomToFit", - "isUsingMailRecents", - "_processPendingInsertions:withDeletions:withUpdates:", - "_flushCachedCarbonPrintersByName", - "rawDictionary", - NULL, - "_rulerAccViewFixedLineHeightAction:", - "nts_ContactsMatchingNormalizedEmailAddress:inSubscribedContent:context:", - "releaseAllPools", - "topMargin", - "_retainedMipmapImage", - "urlToWriteIndexToStorage", - "_setNeedsDisplayInPrimarySortColumns", - "startScrollPrefetchTask", - NULL, - "processRecords:", - "supportsCropping", - "_getCacheWindow:andRect:forRep:", - "imageWithOptions:", - "_rawSetSelectedIndex:", - "drawImage:inRect:fromRect:alpha:fog:premultiplied:gradient:interpolate:shader:", - "_configureMessageView", - "initWithHostName:serverName:textProc:errorProc:timeout:secure:encapsulated:", - "scheduledFindOnPage:", - "rangeForUserTextChange", - "quadrilateralPoints", - NULL, - "initWithTypeCode:", - NULL, - NULL, - "_eventRecordDelta:", - NULL, - "_setComparisonPredicate:", - "editButton", - "_logState", - "_setBundleIdentifier:", - "textContent", - "setStartRect:endRect:startWhite:endWhite:startAlpha:endAlpha:duration:", - "previewPanel:transitionImageForURL:frame:", - "useDisabledEffectForState:", - "boolForType:defaultValue:", - "initListMembersWithSession:URI:showHidden:", - "_progress", - "sharedToolTipManager", - "setDisplayMode:", - "preferredBackingLocation", - "nodeFromManagedObject:objectIDMap:", - "week", - "startAlphaEffect:", - "height", - "processIdentifier", - "_setRequest:", - "query", - "initWithOpenGLContext:pixelFormat:options:", - "_writeDocumentData", - "_QTDataReferenceClass", - "_shouldRepresentFilename", - "registerTranslator:selector:toTranslateFromClass:", - "URLByAppendingComponent:", - "setLayoutAlgorithm:", - "_standardCommonMenuFormRepresentationClicked:", - "_audioNodeFormatDescriptionDidChange", - "initWithSearchElement:andName:hilight:addressBook:", - "filterWithName:keysAndValues:", - "_propagateDirtyRectsToOpaqueAncestors", - "completionsForPartialWordRange:inString:language:inSpellDocumentWithTag:", - "requestModes", - "setUsesFeedbackWindow:", - "setAttributesInTextStorage:", - "removeAttributeForName:", - "_sendDelegateCanSelectColumn:", - NULL, - "_compareMultiNoLabelScalarWithRecordValue:", - "displayState", - NULL, - "invalidateLayoutOfLayer:", - "_privateChildNodes", - "_pkCount", - "_finalize_QCCompositionPickerGridCellLayer", - "_horizontalResizeCursor", - "_entityClass", - "restoreCardWindowStateWithModel:", - "numberOfItemsChanged", - "setMaximum:", - "lastEmailDates", - "setSharedSurfaceMode:", - "__containsRecord:", - NULL, - "initWithContentsOfURL:ofType:error:", - "startTrackingAt:inView:", - "allowsGroupSelection", - NULL, - "sharedSearchManager", - "didReceiveAuthenticationChallenge:", - "_drawerVerticalOpenOffset", - "expandItem:expandChildren:", - NULL, - "render:", - "_spellingSelectionRangeForProposedRange:", - "layerOfType:", - "updateSwatch", - "wakeup", - "_appActivationChanged:", - "setResizeIncrements:", - "overlayBounds", - NULL, - "_scrollingAnimationCallback", - "_mediaBrowserIcon", - "character:hasNumericProperty:", - "textAttributesForNotANumber", - "doCommandBySelector:commandDictionary:", - "newSelectionForMouseMoved:", - "initWithObjectToken:movie:", - "_portTextAttributesForNode:", - NULL, - "isInputPortVisible:", - NULL, - "initWithPK64:", - "_initFromGlobalWindow:inRect:", - "setColorSpaceName:", - "_doOrderWindow:relativeTo:findKey:", - "maxContentSize", - NULL, - NULL, - "undoIt", - "conflictingRecords", - "decrementRefCountForObjectID:", - "__oldnf_setLocalizationFromDefaults", - "hudFadeTimerElapsed:", - "UUID", - "_setLevel", - "samplesPerPass", - "_prepareFunctionExpression:", - "setPreference:forKey:", - "_subtractColor:", - "sendInstruction:", - "showsHiddenFiles", - "dictionary", - "windowDidUpdate:", - "_currentSetting", - "glyphName", - "initWithName:appleEventCode:enumeratorDescriptions:isHidden:", - "prefetchingRelationshipKeyPathsForImplClass:inAddressBook:", - "isAppleUseCoreUI", - "defaultAnimationForKeyPath:", - "_releaseBindingAdaptor", - "updatePreviewSize", - "_typeSelectEndCurrentSearch", - "invalidateGlyphsOnLayoutInvalidationForGlyphRange:", - "progressMarks", - NULL, - "tokenForegroundColor", - "_switchImage:andUpdateColor:", - "_setGlyphsPerLineEstimate:offsetPerLineEstimate:", - "__instantiateNode:", - "_getDisplayDelay:inQuickMode:forView:", - "_load", - "_fileWrapperForURL:", - "setAttributeValueClassName:", - "_launch:fromBundle:throughPort:", - "setStart:len:", - "optionClicked:", - "nativePixelFormat", - "_setMessageAndInformativeText", - NULL, - "volumesNode", - "_processSwitchesEnabled", - "_setLazyDestinationEntityName:", - "highlightMode", - NULL, - "rangeAtIndex:", - "computeFigureRectangle:", - "flagsChanged:", - NULL, - "_drawThemeBezelWithFrame:inView:", - "setImageSize:", - "_updateProfile", - "willCreateSchema", - "_viewWillStartLiveResize_handleRowHeaderSurfaces", - "setDefaultMenu:", - "initWithUnsignedInt:sqlType:", - "setTitleBaseWritingDirection:", - "userDefaultsChanged", - "rotateByDegrees:", - "doesNotRecognize:", - "_dividerFrames", - "initWithDevice:", - NULL, - "_validateSingleValue:forKeyPath:error:", - "initWithOriginalClass:", - "_collapsedOrigin", - "releaseDelegate", - NULL, - "_isGroupRow:", - "generateSQLStatementForFetchRequest:ignoreInheritance:countOnly:", - "_orderFrontHelpWindow", - "removeClient:selector:", - "appendString:withFont:andAttribute:", - "nameFieldLabel", - "initWithTarget:selectorName:arguments:", - "_dictionaryByTranslatingAERecord:toType:inSuite:", - "isInvalidationCapableObject:withSelector:", - "_reformListAtIndex:", - "_base64StringFromData:", - "_invalidateTitleCellSize", - "searchLimit", - "_minXBorderRect", - "removeVolatileDomainForName:", - "_setInverseRelationship:", - "_toolbarIsShown", - "image:didLoadRepresentation:withStatus:", - "isPausedRendering", - "togglePlay:", - "mediaType", - "layoutStatusbar", - "_noticeTextColorPeerBinder:", - "initWithFileManager:", - "realElement", - "_noteToolbarLayoutChanged", - "addFilter:toCollection:", - "setBaseWritingDirection:range:", - "outlineView:heightOfRowByItem:", - "destinationPort", - "removeObjectsAtArrangedObjectIndexPaths:", - "_displayFromCarbonIgnoringOpacity", - "_scriptStringWithTabCount:", - "_setCurrentEvent:", - "isRenameGroupUndoable", - "_configurePort", - "getImageForDrag", - "_getInputExtent", - "translateBy:", - "_rightMouseUpOrDown:", - "setFitToScreen:", - "_unregisterRuleDelegateForNotifications", - "dictionaryWithContentsOfURL:", - "windowChangedScreen:", - "_processDBInfoNode:", - "_isPaletteView", - "_evaluateSourceExpressionForMapping:entityPolicy:", - "requiredFileType", - NULL, - "_specifiesUnorderedAddition", - "flipImageHorizontal:", - NULL, - NULL, - "_nodeFromLibXML2Node:", - "buildLocalizedStringToKeysTable", - "rightView", - "shapeX", - "updateCellsLayoutAtIndexes:", - "_titleCellSizeForTitle:styleMask:", - "_init", - "_updateSubthumbnails", - "attributedStringByWeaklyAddingAttributes:", - "writeHeader", - "fileLocker:actionForApparentlyAbandonedLock:onAttempt:", - "modelAndProxyKeysObserved", - "slot", - "apply:", - "zoomFactor", - "setSelectedMembers:", - "navTransform", - "endGrouping", - "valueInTemporaryCacheForProperty:", - "numberFromString:", - "saveFontCollection:", - "setSFElement:", - "drawParagraphIcon:inContext:", - "filterClassDescription", - "_iconImage", - NULL, - "showsPreviews", - "addHeaderValue:forKey:", - "saveMorphedGlyphs:", - "windowTitleForDocumentDisplayName:", - NULL, - "outlineView:child:ofItem:", - "actionProperty", - NULL, - "pasteboardWithUniqueName", - NULL, - "_selectToolbarItemViewerAfterView:", - "free", - "inputContextForFirstTextView:", - NULL, - "callStackReturnAddresses", - "_completePathWithPrefix:intoString:matchesIntoArray:", - "_calculateAllTitles:", - "_addWhitespace", - "shadedImage:heightField:shading:scale:opacity:hasAlpha:transparency:", - "_labels", - "localizedName:locale:", - NULL, - "_traverseToSupermenu", - "setTitleNoCopy:", - "displayedTitle", - "_constructDefaultMessage:", - "nts_AllRecordsForClass:", - "_editor:didChangeEditingState:bindingAdaptor:", - "drawPlayerControl", - "_writeParagraphData", - "imageAdjustView", - NULL, - "setKey:", - "_drawProgressArea", - "writeRoomForInt:", - "mediaKeys", - "removeTrackingArea:", - "tailIndent", - "_colorizedImage:color:", - "_initContent:styleMask:backing:defer:counterpart:", - "clearBuffer", - "setMaxDate:", - "_setTransactionFinished:", - "_setNonRepudiationUsage:", - "initWithSavedQueryNode:", - "checkForTrailingDigits:", - "_executeFetch:didCommitSuccessfully:actionSender:", - "registerUndoWithTarget:selector:object:", - "getGid", - "_hasHorizontalScrollBar", - "isDrawingToScreen", - NULL, - "takeValuesFromDictionary:", - "_cancelAnimationTimer", - "_setEmailAddressOfCA:", - "sharedAppleEventManager", - "service", - NULL, - "_deselectDownstream:", - "_maxYResizeRect", - "_setEventMask:", - "addInput:error:", - "initWithCarbonWindowRef:takingOwnership:", - NULL, - "propertyTableAtIndex:", - "_shouldHeaderShowSeparatorForColumn:", - "docFormatData", - "activateForDocumentAtIndex:usingTransitionImage:atFrame:", - "nts_Members", - "initWithBounds:", - NULL, - "_sheetDidEnd:returnCode:contextInfo:", - "findClass:", - "lineFragmentRectForProposedRect:sweepDirection:movementDirection:remainingRect:", - "addDefaultAppearanceDictionaryRef:", - NULL, - "_syncToChangedToolbar:toolbarModeChanged:", - "allowsOpenGLAcceleration", - "becomeMultiThreaded:", - "_scrollUp:", - NULL, - "setExternalPrecision:", - "verticalCornerRadius", - "mappingModelForSourceModel:destinationModel:error:", - "poseAsClass:", - "_characterIndexForMoveForwardFromCharacterIndex:", - "nts_PropertyTypesForRecordOfClass:", - NULL, - "iDiskAddress", - "setAllowMultipleSubrowSelection:", - "alternateName", - "setAnnotationType:", - "initWithTitle:URL:andPath:", - "_switchToPlatformInput:", - "removeQFilterCellViews:", - "_alignedTitleRectWithRect:", - "nameAtIndex:filtered:", - "zPosition", - "_initialBackgroundStyleCompatibilityGuess", - "_initWithBacking:", - "_startLiveResizeAsTopLevel", - "keyEquivalentWidth", - "_cacheFileName", - "pictureTakerViewBox", - NULL, - "controlsFixedForKeyFrame:inTimeLine:", - "_registerFormatter:forErrorKey:parameters:", - "tokenField:representedObjectForEditingString:", - "renewGState", - "_synchronizeTitlesAndColumnsViewVisibleRect", - "openFile:", - "_convertDataToString:", - NULL, - "popUpMenu:atLocation:width:forView:withSelectedItem:withFont:", - "applicationWillHide:", - "_drawNavigationBarBackgroundWithFrame:inView:", - "_enablePosting", - "_setResponse:", - "enterFullScreenMode:withOptions:", - "getFirstUnlaidCharacterIndex:glyphIndex:", - "setAddressNormalized:", - NULL, - NULL, - "allModifierPredicates", - "accessibilitySetValueAttribute:", - "requiredThickness", - "_closeForkSync:", - "titleForDocumentURL:canUseCustomDisplayName:", - "dmCreateRequestWithSession:data:props:URI:", - "scanLocation", - "endLineWithGlyphRange:", - "availableVoices", - "windowDidOrderOnScreen:", - "copyScriptingValue:forKey:withProperties:", - "partHit:", - NULL, - "mergeStyleInto:", - "_createOptimizedDefaultValue:forInputKey:cellSize:", - "contextWithOptions:", - "setViewScale:", - "_findDragTargetFrom:", - "replaceObjectsInRange:withObjectsFromArray:", - "_fromRecord:getContainerInfo:", - "linkPath:toPath:handler:", - "triggerSearch", - "checkSpellingOfString:startingAt:language:wrap:inSpellDocumentWithTag:wordCount:reconnectOnError:", - "getRow", - "setSRRecognizer:", - "_IMViewWillDisplayImage:", - "_updateSelectedItem:forKeyDown:", - "_characterIndexForMoveBackwardFromCharacterIndex:", - "_typesIncludingConversionsFromTypes:", - "renderString:forRect:font:color:alignment:rotation:breaks:context:", - "_rulerAccessoryViewAreaRect", - "_removeRunningOperationEqualTo:", - NULL, - "subitems", - "getCustomAdvance:forIndex:", - "alignmentMode", - "_setDrawBackground:", - "_generateSQLForKeyPathExpression:allowToMany:inContext:", - "_typeNameFromElement:isOptional:", - "nts_RemoveFromAddressBook:", - "parsesLSItemContentTypes", - "clearInsertedObjects", - "canCloseDocument", - "stringByRemovingPercentEscapes", - "setPolicyDelegate:", - "setNameNormalized:", - "didAddCredentials:toRequest:context:", - "portWillDeleteFromNode", - "_proxyProtectionSpaceForProxyURL:", - "_setSignatureUsage:", - "replaceCharactersInRange:withAttributedString:", - "compositionInputs", - "timeIntervalSinceReferenceDate", - NULL, - "setMaxColumns:", - "_validFrameForResizeFrame:fromResizeEdge:", - "_moveContentsAt:toIndex:", - "carbonHICommandIDFromActionSelector:", - "isPrivate", - "_findCurrentEditor", - "_updateVolumeByStoredVolume", - "lock:", - "_validatePath", - "_appendTypeNamesSuiteDeclarationToAETEData:", - NULL, - "_updateSettings", - "_setHasToolTip:", - "_closeDocumentsStartingWith:shouldClose:closeAllContext:", - "tokenTextView:readSelectionFromPasteboard:type:", - "updateHeartBeatState", - "_unionOfArraysForKeyPath:", - "_minForKeyPath:", - "_canUseCompressionOptionsWithDescription:", - "_detachSheetWindow", - "stateValue", - "_runningOperation", - "setVarietyCharSet:", - NULL, - "defaultWritingDirectionForLanguage:", - "filterNotification:type:info:", - "keyForConnection:", - "setVideoPreviewConnection:", - "consumeImageData:forTag:", - "_multiClipDrawingHelper", - "loadDidFinish", - "_transactionAborted", - "initWithCharacterRange:parent:", - "_subtextStorageFromRange:", - "_postStoresChangedNotificationsForStores:changeKey:options:", - "attachedSheet", - "dateByAddingComponents:toDate:options:", - "webScriptNameForKey:", - "_supportsGetValueWithNameForKey:perhapsByOverridingClass:", - "colorFromPoint:", - "accessibilityIsFocusedWindowAttributeSettable", - NULL, - NULL, - "pointer", - NULL, - "loadImageKitFrameworkIfNeeded", - "nts_AddressBook", - "_convertInstanceIfNeeded:", - "_invalidateInsertionPoint", - "insertValue:withLabel:atIndex:", - "controlTextDidCh:", - "_changeNamespace:fromPrefix:toPrefix:", - "setMinimized:", - "prepareForSave", - "_performActionOnAllNodes:context:", - "setIndex:count:", - "unregisterImageRepClass:", - "_updateSheetEffectParent:", - "_findItemViewerAtPoint:", - "setHotspotsVisible:", - "_animatingScrollTargetOrigin", - "getCString:maxLength:", - "_updateSubmenuKnownStale:", - "roundingMode", - "nts_SetDistributionIdentifier:forProperty:person:inGroup:allowFetching:", - "initWithMovieView:selector:operation:", - "bitsPerPixel", - "setAutoresizesAllColumnsToFit:", - "_hasActiveControls", - "isTrue", - "_canOpenInlinePreview", - NULL, - NULL, - "_imageForSelection", - "textColorWhenObjectValueIsUsed:", - "unregisterObjectWithServicePath:", - "drawSelectedItemsInGenieWindow:withBoundingBox:", - "_indexOfWindow:", - NULL, - "displayValuesForRow:", - "grayDeviceColor", - "initWithPickerMask:colorPanel:", - "_offsetControlPointOfType:withOffset:forKeyFrame:inTimeLine:", - "setTickMarkPosition:", - "textureID", - "_labelOnlyShowsAsPopupMenu", - "controlType", - "deviceID", - NULL, - "_toolbar", - "setSama:", - "layoutCharactersInRange:forLayoutManager:maximumNumberOfLineFragments:", - "setSublayers:", - "applyMultiValue:withProperty:toRecord:managedObject:", - "hotspotCountForNode:", - NULL, - "numStacks", - "accessibilityIsIndexAttributeSettable", - "lookUpConnectionWithReceivePort:sendPort:", - "coercedValue:", - "isSingleDTDNode", - "_refreshStreams", - "birthdayYear", - "readColors", - NULL, - "_syncScopeLayout", - "_createCollectionJoinsForFetchInContext:", - "performSelector:withObject:", - NULL, - "orderFrontCharacterPalette:", - "setCurrentTime:", - "learnWord:language:", - NULL, - "selectableItemIdentifiers", - "_clearVisitedColumnContentWidths", - "coerceValue:forKey:", - "textView:writeCell:atIndex:toPasteboard:type:", - "_popUpButton", - "_markerTypeButton", - "performWithActionName:", - "processorCount", - "SCTCategoryColumnColor", - "databaseChanged:", - NULL, - "iconView:selectionIndexesForProposedSelection:", - "addTrackingRect:owner:userData:assumeInside:", - "variant", - "wantsDoubleBuffering", - "fontAttributesInRange:", - "handleAppTermination:", - "cropRect", - "setMirroring:", - "_duplicateTimeLines", - "_startFileWritingForConnection:fileControlToken:runningOperation:", - "_autosaveColumnsIfNecessary", - "initWithSmartGroup:name:searchElement:hilights:addressBook:", - "_finalize_QCImageManager", - "drawPlaceHolder", - "filesystemItemLinkOperation:shouldProceedAfterError:linkingItemAtPath:toPath:", - "installShortcutView", - "accessibilityIsWindowAttributeSettable", - "recordValuesForInsertedObject:", - "replaceAllInView:selectionOnly:", - "setShowIdentityGroups:", - "replyToOpenOrPrint:", - "currentFrameImage", - "shouldAllowUserColumnResizing", - "decomposableCharacterSet", - "setRequestBodyWithString:encoding:", - "_appendTextBytes:length:encoding:attributes:", - "isObscured", - "clearDirectoryResults", - "finishLaunching", - "accessibleLabelsAndValues", - "freeSpace", - "compileSourceOfType:", - "insertSingleQuoteIgnoringSubstitution:", - "cachedImageRefForNSImage:", - "initWithMachMessage:", - NULL, - "drawContextMenuHighlightForRow:", - "_discardEditing", - "freeOriginalImageCache", - "setNeedToExchangeItems:", - "_singleMutableArrayValueForKey:", - "deviceInputWithDevice:", - "_setFirstMoveableItemIndex:", - "formatDidChange:", - "_handleSpecialAlternateKeyEquivalent:", - "cellAtPoint:row:column:loaded:", - "_adjustTimer:", - "_fixTargetsForMenu:", - "setShadowsCells:", - "_setDragCompletionTargets:", - "swapWithMark:", - "_setSSLServerAuthUsage:", - "_addPathSegment:point:", - "_startTooltips", - "stringByResolvingSymlinksInPath", - NULL, - "pathForKeychain:", - "inputClientBecomeActive:", - "_subthumbnailLayers", - "_web_extractFourCharCode", - "isLastImportGroupVisible", - "overlayLight:onto:center:size:adjustHue:saturation:luminance:", - NULL, - "frameOfColumn:", - "cellMaximumSizeForCurrentBounds", - "initWithDomain:type:name:", - "_leftGroupRect", - "isMIAM", - "initWithContentSize:preferredEdge:", - "selectionFrame", - "_setKeychainRef:", - "configureForCalculatesAllSizes:", - "setShowsFirstResponder:", - "accessibilityIncrementButtonAttribute", - "_broadcastHardwareCaps", - "_syncToolbarPosition", - "startRollOverTracking:", - "moveWordForward:", - "_pathForResource:ofType:inDirectory:forRegion:", - "enumCodeValue", - "proxyPortForOriginalPort:", - "initializeContextForFetchRequest:ignoreInheritance:", - "_commonInitNavMatrix", - "_handleTestEvent:withReplyEvent:", - NULL, - "verifiedDirRef", - "discloseClicked:", - "drawImage:withFrame:inView:", - "__copyGLToCurrentFocusedView", - "loadFaces:", - "_drawsWithTintWhenHidden", - "initWithInternalManager:", - "textShouldBeginEditing:", - "getCurrentSelectionFrame", - "loadBundle", - "_allowAnimated_setAlphaValue:", - NULL, - "deviceConnectionWillChange", - "removePort:forMode:", - "_resizeHeight:", - "textContainerChangedGeometry:", - "absoluteX", - "_minYmaxXResizeRect", - "volumeDidChange:", - "exportVCard:", - "doActionForStatusBar:", - "writeToURL:ofType:error:", - "tableContentChanged:", - "department", - "_netInfoImageData", - "subentities", - "restoreWindowOnDockDeath", - "lineCapStyle", - "setTextColor:whenObjectValueIsUsed:", - "initWithDomainName:", - NULL, - "_optimizedRectFill:gray:", - "initByReferencingURL:", - "_fullLayout", - "declareChannels:", - "nts_DistributionIdentifierForProperty:person:inGroup:", - "setMonth:", - "setKeyboardFocusRingNeedsDisplayInRect:", - "slideshowSwitchToActualSize:", - "trackMouseCoordinates", - "_parseArguments", - "_redisplayTableContentWithRowIndexes:columnIndexes:", - "bindingRunsAlerts:", - "_prepareAlertError:responder:responderCandidate:window:recoveryAttempter:", - "_collection:setHidden:save:", - "setSelectedMembersFromModel:", - "advanceToActiveLocalTime:", - "fileWrapperFromRange:documentAttributes:error:", - "doLoadItemAtIndex:", - "scrollRectToVisible:", - "displayNameForKeychainAtPath:keychainRef:", - "_distanceInDragDirectionBeforeDragAttempt", - "_titleSizeWithSize:", - "setSpeechChannelWithVoiceIdentifier:", - "scanDecimal:", - "_coreUIDrawOptionsWithView:", - "slideshowPlay:", - NULL, - "animationDelay", - "deleteOutputPortForKey:", - "filePosixPermissions", - "initWithNSImage:options:", - "createCVOpenGLBufferForManager:withOptions:", - "_isSheetOnModalWindow", - "_goDown:", - "prepareGState", - "_setAllPanelsNonactivating:", - "_accessibilityToolbarButtonElement", - "_logFailure", - "_setSpecialPurposeType:", - "_setIdentifier:", - "_runGarbageCollectionForAge", - "setCriticalValue:", - "sharedDBCache", - NULL, - "invalidateAccessibilityTable", - "_moreCompleteVariantOfTypeDescription:", - "setReadOnly:", - "rendererName", - "setCacheUsed:", - "setAutoforwardsScrollWheelEvents:", - "plusButton", - "lightGrayColor", - NULL, - "_scrollToVisibleItemAtIndex:", - "_newOperatorWithType:modifier:options:", - "nts__isLastNameFirst", - "_endLiveResizeAsTopLevel", - "_performDiskCacheSync", - NULL, - "appendBezierPathWithRect:", - "_forceSendAction:notification:firstResponder:", - "_initVariables", - "imageBrowser:itemAtIndex:", - "inlinePreview:didShowPreview:", - "initWithToolbarItemViewer:", - "removeDirectoryAndContentsAtURL:andReturnResultCode:", - "writeStrokeWidth:", - "view:customToolTip:fadeOutAllowedForToolTipWithDisplayInfo:", - "_helperDeallocatedForView:layoutManager:", - "_selectInTabView:itemAtIndex:", - "_toggleAMPM", - "addAttribute:value:range:", - "setSharingType:", - NULL, - "isFileURL", - "allowEmptySel:", - "updateMembersSelection:", - "_initializeResumeInformation:", - "_primitiveGlyphRangeForCharacterRange:", - "setSecondaryGroupingSize:", - "setBadgeLabel:", - "_digitsForAxis:gridStep:", - "_retrieveNodeForObject:", - "_selectRowIndexes:inColumn:", - "setIsInInterfaceBuilderApp:", - "createInputWithPortClass:forKey:attributes:", - "setResultsReturnedInDictionary:", - NULL, - NULL, - NULL, - "_updateSpline", - NULL, - "_doICUSubstringMatchForString:andPattern:patternLength:ofType:", - "handleReconfiguredWindow", - "_doUserParagraphStyleLineHeightMultiple:min:max:lineSpacing:paragraphSpacingBefore:after:isFinal:", - "drawArrowFrom:to:open:inContext:", - "setScaling:", - "createPrimaryKeyTableForModel:knownEmpty:", - "_applicableTrackingModeForSegment:", - "initWithItems:", - "_adjustDynamicDepthLimit", - "_valueForKeyPath:ofObjectAtIndex:", - "_endTabWidth", - "objectDidEndEditing:", - "coalesceInTextView:affectedRange:replacementRange:", - "lineWidthThreshold", - "fileIsAppendOnly", - "accessibilityStringForRangeAttributeForParameter:", - "setInfo:forKey:", - "rectArrayForCharacterRange:withinSelectedCharacterRange:inTextContainer:rectCount:forCursorPosition:", - "_computeTargetGridGeometry", - "mainThread_FOUNDATION", - "trackingAreasDidUpdate:", - "_orderOutInProgress", - NULL, - "accessibilityRulerMarkerTypeDescription", - "setHasTimebase:", - "convertFont:", - "hasVideo", - "__savePosition:context:", - "initWithTextBlock:charIndex:text:layoutManager:containerWidth:collapseBorders:", - "coloredLoggingDefault", - "performAndRenderAnimations", - "_markerLevelForRange:", - "_ensureHoveredImaged", - "_setExplicitlyCannotAdd:remove:", - "hasSound", - "_rulerAccViewUpdatePullDown:", - "_processDocument:", - "searchController:queryShouldSaveWithName:forAllApps:", - "nextTokenPeakUnicode:length:", - "entryState:", - "manageMetadataForRecords:action:", - "valueOfProperty:", - "reloadColumn:", - "layoutManagers", - "_document:pageLayoutDidReturn:contextInfo:", - NULL, - "domainDidUnbindAll:", - "_obtainOpenChannel", - "_clockAndCalendarReturnToHomeMonthButtonCell", - "abEscapeStringForUnichar:and:advance:", - "_drawEndCapInRect:", - "glyphAtIndex:", - "_nominalSizeNeedForTabItemLabel:", - "rightArrowPathInRect:", - "initWithContainerClassDescription:containerSpecifier:key:startSpecifier:endSpecifier:", - "appendBezierPathWithArcWithCenter:radius:startAngle:endAngle:clockwise:", - "bindFromDiskMipmapItem:withUID:", - "estimatedItemCount", - "setGroupingSize:", - NULL, - "xmlAttributes", - "_usesCorrectContentSize", - "_delegateTypeSelectStringForIndex:", - "_compressionOptionsPropertyList", - "_doubleClickAction:", - "initWithPixelBuffer:bounds:replacingFormat:", - "_setSortable:showSortIndicator:ascending:priority:highlightForSort:", - "setBackgroundLayer:", - "_blockAndWaitIfNecessaryWithRequestIndex:", - "removeInputUnitsForConnection:fromGraph:ofCaptureSession:", - "_useFSRefsEvenOnPathBasedFileSystems", - "isCA:", - "_addToolTipRect:displayDelegate:displayInfo:", - NULL, - "setAnchorPoint:", - "_shouldInvalidateShadow", - "removeAnimationForKey:", - "_setWindowFrameForPopUpAttachingToRect:onScreen:preferredEdge:popUpSelectedItem:", - "ISS_URLWithUsername:", - "_trustButton", - "_endChanging", - "debugDefault", - "initWithRow:column:tableView:", - NULL, - "_updateObservingInOutlineView:byDroppingRows:andAddingRows:", - "classForPortCoder", - "frameHighlightColor", - "setupWithOptions:createFilter:", - "_initWithCFURLProtectionSpace:", - "tableViewSelectionIsChanging:", - "valueInWordsAtIndex:", - "setMiterLimit:", - "_compareNode:withNode:usingColumnIdentifier:ascending:", - "_validateDisplayValue", - "nts_OpenContactManagerWithMode:cacheSchema:", - "includeNotesInVCards", - "formattingDictionary", - "setWasPaused:", - "_pixelRectInPoints:", - "scrollUp", - NULL, - "shouldProcessNamespaces", - "setPrimitiveOrganization:", - "numberStyle", - "freeBitsAndReleaseDataIfNecessary", - "layoutIfNeeded", - "controlTint", - "indexesToAdd", - "setStandardOutput:", - "nts_AddSubgroup:toGroup:", - "_performKeyEquivalentConditionally:", - "irisClosed:", - "imageNameForStatus:", - "visualRootNode", - "setGridColor:", - "_testGlyphTree", - "setDropRow:dropOperation:", - "trackMouse:adding:", - "fileNameExtension:isValidForType:", - "setAsMipmapOfImage:aspectRatio:antialiased:quality:", - "_setKeyEquivalentVirtualKeyCode:", - "toggleExpanded:", - "filterAdded:filterChain:", - "initWithUser:password:url:", - "_defaultGlyphForChar:", - "selectedSubrowObjectsAtIndex:", - "emissionRange", - "openAppleMenuItem:", - "abEntityKnowsKey:inAddressBook:", - "windowNumber", - "certTitleIndex", - "setDefaults", - NULL, - "setFxButtonsAreaInPanel:collapsed:", - "setEmptyView:", - NULL, - "_appendWhereClauseForConstantCollection:", - NULL, - "setup:", - "removeConfirmSheetDidEnd:returnCode:contextInfo:", - "_CFURLResponse", - "documentRect", - "maxTimeLinesCount", - "imageBrowser:cellWasRightClickedAtIndex:withEvent:", - "createNamedNodeFromNode:reader:", - "_setShouldEnforcePixelAlignment:", - NULL, - "pictureTaker", - "setHUD:", - "whitePointArray", - "pickerInfos", - "_createAddRowButton", - "position", - "_topBarHeight", - "makeNextSegmentKey", - "__shiftRight:", - "scrollToNormalizedValue:", - NULL, - "containsObject:inRange:", - NULL, - "_navView", - "_freeBitmaps", - NULL, - "currentSession", - "changeDestinationToRect:", - "hasItemsToDisplayInPopUp", - "_freeNodes", - "_calculateTitleForURL:requestIndex:", - "_newPlaceholderItemWithItemIdentifier:", - "_initWithParagraphStyle:", - "nearestCellOfPosition:", - "syncToView:", - NULL, - "_closeSheet:andMoveParent:", - "glyphIndexToBreakLineByHyphenatingWordAtIndex:", - "invokeDefaultMethodWithArguments:", - "removeObjectsAtIndexes:", - "highlightCell:atRow:column:", - "indexPathByAddingIndex:", - "parseEntrustVersInfo:", - "setMultiValue:forProperty:", - "automaticallyNotifiesObserversForKey:", - "fontDescriptorsInCollection:", - "getRulebookData:makeSharable:littleEndian:", - "mergeChangesFromContextDidSaveNotification:", - "_flushAEDesc", - "blueReconstruction:green:phase:", - "toolbarWillAddItem:", - "initWithUnsignedLongLong:", - "setDefaultFormatterBehavior:", - "setAllowsTickMarkValuesOnly:", - "_setMe", - "setPaletteLabel:", - "registerNodeWithClass:identifier:", - "_descriptorByTranslatingNumber:ofType:inSuite:", - "setDefaultWindingRule:", - "initWithCollection:", - "setFocusValue:forAccessibleChildAtIndex:", - "setSegmentStyle:", - "setRotation:", - "titleHeight", - "_invalidateScaledBackground", - "drawPortView:", - NULL, - "parseOidWithDictionary:", - "abortFreeTemporaryCache", - "_setWritesCancelled:", - "cStringLength", - "_continueModalOperationToTheEnd:", - "_handleWillPopUpNotification", - "imageWithOrientation:", - "nts_PathForUIDTaggedImage", - "nts_RemoveRecord:", - NULL, - NULL, - "setEventClass:", - "_setNextToolbarSizeAndDisplayMode:", - "setDisplayLinkRef:", - "initWithFrame:filter:", - "paletteFontOfSize:", - "isDistributionList", - NULL, - "_setFrameUsingName:domain:force:", - "_virtualNodeOfType:", - "stashSize", - "actionWithActionDictionary:forDocument:", - "_setFrameFromString:force:", - "canInitWithURL:", - "timeSliderCurrentTime:", - "visiblePagesChanged:", - "authorizationViewDidDeauthorize:", - "_nonKeyEditingFrameColor", - "setDocumentContentKind:", - "_list", - "setRawDataFormat:", - "noteHeightOfRowsWithIndexesChanged:", - "viewFrameChanged:", - "initWithUIElementValue:", - "dataRefData", - "_realWindowNumber", - "initWithDocumentButton:", - "entityID", - "filtersInDomains:Categories:Objects:", - "getObjects:andKeys:", - "keylessStructures", - "templateView", - "_certAuthoritykeyAlgorithm", - "addressBookSource", - "isFieldVisible:", - "vrInstance", - "autoValidationDisabled", - "_setChangedFlags:", - NULL, - "_startRunningNonBlocking", - "_keyEquivalentsAreActive", - "setPostsFrameChangedNotifications:", - "directoriesGroup", - "tokenFieldCell:editingStringForRepresentedObject:", - "_chooseFamily:", - NULL, - "unmountAndEjectDeviceAtPath:", - "fieldEditableControl", - "_setHasSurfaceBackedOpenGLContext:", - NULL, - "binaryOperatorForSelector", - "deleteToEndOfLine:", - "treatsFilePackagesAsDirectories", - "localAddressBookSourceWithAddressBook:", - "zero", - "initWithEntity:inverseToMany:", - "disableCursorRects", - "portForName:onHost:", - "pathsForResourcesOfType:inDirectory:", - "transformStruct", - "areaOfInterestForMouse:", - "_insertChildOrSibling:", - "_colorByTranslatingRGBColorDescriptor:toType:inSuite:", - "_generateSQLForWildSubStringForGlob:wildStart:wildEnd:", - "floatParameterValue:forResolution:", - "addQuaddingToDictionaryRef:", - "GIFRepresentation", - "selectedComposition", - "numberOfChildren", - "initWithTCPPort:", - NULL, - "_setDistanceForVerticalArrowKeyMovement:", - "_insertObject:inSubNodesAtIndex:", - NULL, - "startAngle", - "removeFileAtPath:handler:", - "_initWithoutAEDesc", - "setAllowsColumnResizing:", - "setOutputImageKey:", - "_popIfTopHandling:", - "_unobstructedVisibleHeaderRectOfColumn:", - "_unitsForClientLocation:", - "_layerDidBecomeVisible:", - "arrayWithRange:", - "_hasToolbar", - "setTextAttributesForPositiveInfinity:", - "_shouldAnimateColumnScrolling", - "_rememberAndResignFirstResponder", - "_newScroll:", - "canGoToLastPage", - NULL, - "performClickWithFrame:inView:", - "_createRowForCriteriaSlice:", - "setRightMargin:", - "_delegateValidation:object:uiHandled:", - "setUndoManager:", - "replaceSubview:with:", - "_computeImageFrame", - "nextDaylightSavingTimeTransitionAfterDate:", - NULL, - "isLike:", - NULL, - NULL, - "tableView:shouldSelectRow:", - "absoluteString", - "ctx", - "databaseOperator", - "insertLineSeparator:", - "exclusives", - "deactivateServer:", - "beginIgnoreChanges", - "_setMenuItemBelongsToContextualMenu:", - "dstDraggingExitedAtPoint:draggingInfo:", - "postpone", - "attachedMenuView", - "_installed", - "orderForProperty:comparison:", - "doSetImageWithURL:", - "runCustomizationPalette:", - "isNSNumber__", - "_startingWithDocument:continueSavingAndClosingAll:contextInfo:", - "alternateSelectedControlTextColor", - "drawRow:clipRect:", - "isRotatedFromBase", - "getAllCategories", - "_batchClose", - NULL, - "setMarkedText:selectedRange:replacementRange:", - "openURL:", - "indexSet", - "greenVotedReconstructionROI:destRect:", - "_setFileNameExtensionWasHiddenInLastRunSavePanel:", - "checkSpaceForParts", - "_contentRectExcludingToolbar", - NULL, - "quartzFilterWithOutputIntents:", - "predicateWithLeftExpression:rightExpression:modifier:type:options:", - "QT_URLByRemovingFragment", - "_showToolbarWithAnimation:", - NULL, - "shouldSuppressNotificationFromObject:keyPath:", - "addResponseBodyReader:", - "nextTokenPeak:", - "showPreferencesPanel", - "_addObject:objectIDMap:", - "initWithPath:flags:createMode:", - "_didLoadMetadata", - "fetchIntermediateForKeypathExpression:", - "_dotMacAccountNameFromSystem", - "_drawRollOver:", - "_accessibilityIsSpaceOrSeparatorItem", - "_defaultItems", - "objectsForXQuery:constants:error:", - "reportFrameRate", - "_indicatorOffset", - "shouldRenderOnBackgroundThread", - "keyForObject:", - "_layoutGlyphsInLayoutManager:startingAtGlyphIndex:maxNumberOfLineFragments:currentTextContainer:proposedRect:nextGlyphIndex:", - "_menuScrollingOffset", - "_zScreen", - "registerTranslator:selector:toTranslateFromDescriptorType:", - "validateValue:forKey:", - "initWithName:boundObject:", - "playerFrame", - "_pointRectInPixels:", - "cleanUpAfterDragOperation", - "drawMarkersInRect:", - "_rightmostAutoresizingColumn", - "startAnimateZoomToScaleFactor:", - "calculateOutlineLayer:forResolutionData:", - "setColumns:", - "getIDRefStringForValue:ofRelationship:stringKeys:objectIDMapping:objectForError:", - "setPositiveInfinitySymbol:", - "_paragraphClassforParagraphStyle:range:isEmpty:isCompletelyEmpty:headerString:alignmentString:directionString:", - NULL, - "initWithCoach:contentRect:contentImage:", - "setHeaderView:", - "loadView", - NULL, - "_setGenerateCombinedVCards:", - "decimalTabMarkerWithRulerView:location:", - "imageROI:forRect:userInfo:", - "flushTextRenderer", - "_nextDaylightSavingTimeTransitionAfterAbsoluteTime:", - "mipmapCacheDidSave:", - "layoutChanged:", - "decimalNumberWithString:locale:", - "_addCredential:forProtectionSpace:", - "clearCachedImageData", - "createString", - "_isCancelledAfterHandlingUserEvents", - "textView:shouldChangeTextInRanges:replacementStrings:", - "_accessibilityBoundsOfChild:", - "_highlightRow:clipRect:", - NULL, - "isFeatureEnabled:", - "playsAllFrames", - "mnemonic", - "chapterList", - "documentUnlocked:", - "isSingleTableEntity", - "_win32ChangeKeyAndMain", - "_ownsWindowGrowBox", - "_isRunningDocModal", - "scaleRegionOf:destRect:userInfo:", - "autohidesScrollers", - "_spanClassForAttributes:inParagraphClass:spanClass:flags:", - "valueType", - "windowDidBecomeKey:", - "willBeRemovedFromView", - "currentLocale", - "colorWithDeviceRed:green:blue:alpha:", - "setZPosition:", - "nameCount", - "_textOffset", - "prepareDeleteStatementWithCorrelation:", - "initWithContainerClassDescription:containerSpecifier:key:index:", - "_initWithObserver:property:options:context:", - "_activeFileListViewForResizing", - "updateTheaterButtonWithActive:", - "scrollLineDown:", - "setupImageLayer", - "_userSetCurrentItemsToItemIdentifiers:", - "_commitEditingWithSuccessInvocation:failureInvocation:", - "_updateAccumulator:", - "_accessRef", - "hasSuffix:", - "setViewSize:", - "_openFile:withApplication:asService:andWait:andDeactivate:workaroundNonAEAwareApp:", - "_shouldAttemptIdleTimeDisposeOfLiveResizeCacheWithFrame:", - "_textColorForSegment:", - "_syncSwatchSizeToSavedNumVisibleRows", - NULL, - "gizmoHitTest:", - "adjustFrameOriginX:", - "transformBy:", - "resultData", - "shouldUseOriginalImageToCacheNiceImageWithSize:", - "_scriptClassTerminologyForName:", - "sharingPreviewPanel", - "_minYResizeRect", - "_partAtPoint:inFrame:", - "_genericMutableSetValueForKey:withIndex:flags:", - "_writeSummaryData:", - "responseHeaders", - "replaceLabelAtIndex:withLabel:", - "createGrids", - "setAuthenticationType:", - "scrollScheduleStep", - "lineToX:andY:", - "_dstDraggingExitedAtPoint:draggingInfo:stillInViewBounds:", - "selectDirectoryResultRow:subrow:byExtendingSelection:", - "CVOpenGLTextureCache", - "initWithCertificate:trust:parse:", - NULL, - "writeMetadataToFile:error:", - "prepareEndsWith:", - "setPrimitiveEmail:", - NULL, - "currentSearchIndex", - "removeFontDescriptors:fromCollection:", - "_trackMouse:inNode:bounds:", - "filterWithFilter:connectionID:", - "captureOutput:didOutputVideoFrame:withSampleBuffer:fromConnection:", - "changeColor:", - "nts_SetValueInTemporaryCache:forProperty:", - "resumeExecution", - "defaultPixelFormat", - "clearInput", - "initWithType:", - "_createCert:privKey:keychain:", - "_allValues", - "textEncodingName", - "stopSpeaking", - "_recursivelyAddItemsInMenu:toTable:", - NULL, - "pickGroupAtPoint:", - "setCocoaVersion:", - "initWithRequest:allowRedirections:", - "sharedSpellChecker", - "_storeConfigurationChanged:", - NULL, - "nts_RemoveSubgroup:fromGroup:", - NULL, - "_saveVisibleFrame", - "imageHasChanged", - "handleKeyboardEvent:callRef:", - "displayViewForPluginView:", - "setLocations:startingGlyphIndexes:count:forGlyphRange:", - "numberWithUnsignedChar:", - "databaseChangedExternally:", - "_setNeedsDisplayForItemIdentifierSelection:", - "_colorSpaceForColorArray:", - "initWithMachPort:", - "_web_isCaseInsensitiveEqualToString:", - "hideContainerForItem:", - "pixelFormatM_Ih", - "options", - "_setHasShadow:", - "_aquaColorVariantChanged", - "alternativeTypeDescriptions", - NULL, - "knobLayerFlags", - "invalidateAttributesInRange:", - NULL, - "_dispatchRequestInfo", - "_generateSQLForConstantValue:inContext:", - NULL, - "_referenceBindingValueAtIndex:", - NULL, - "_writeColorsToLibrary", - NULL, - "setDefaultValue:forInputKey:", - "_headerWithName:", - "unschedule:mode:", - "isDescendantOf:", - "control:textShouldBeginEditing:", - "setAutoscroll:", - "__ivar_setTrackingCell:", - NULL, - "deserializeServers:", - "connectedPort", - "_removeWindow:", - "ibSetSampleURL", - NULL, - "formatDescriptionWithFigFormatDescription:", - "_portForPoint:inNode:bounds:", - "targetTrackForInsertFromTrack:", - "activeDirectoryPassword", - "nodeManager", - "_setInputIKImage:", - "viewForUIConfiguration:excludedKeys:", - "enumeratorOfInputImage", - "_applySelectionIndexes:toItems:", - "setPixelAspectRatio:", - "birthDate", - NULL, - "setInitialValue:", - "propertyDefinitions", - "editedMask", - NULL, - "pushNibPath:", - "setOriginalImagePath:", - NULL, - "tabViewItemAtPoint:", - "_discardDocumentPreview:", - "removePatch:", - "_deallocHardCore:", - "insertionKey", - "rectForIconInCellFrame:", - "initWithPropertyNameArray:", - "isItemExpanded:", - "convertFont:toApproximateTraits:", - "parent", - "addColumns:", - "initWithObserver:keyPath:context:", - "preferredRate", - "_defaultButtonPaused", - "addChildObject:", - "_generateToManySQLStringInContext:", - "_subsetDescription", - "_setContentToContentFromIndexSet:", - "_performActionWithCommitEditing", - "returnToHomeMonthButtonCellForDatePickerCell:", - "nts_InfoWithAddressBook:", - "generationCount", - "resume", - "performanceCounters", - "setDecimalSeparator:", - "miterLimit", - "decodeClassName:asClassName:", - "_changeIDsForManagedObjects:", - "internalClearSelection", - "registerFilterName:constructor:classAttributes:", - "webPlugInCallJava:isStatic:returnType:method:arguments:callingURL:exceptionDescription:", - "dragMovie", - "infoWithType:size:location:", - "unsetOnOpenGLContext:unit:", - "decObservationCount", - "endSubelementIdentifier", - "_hasSelectedPatches", - "_tileContinuousScrollingBrowser", - "_markHasLoadedData:", - "usePrimarySourceListStyle", - "windowChangedKeyState", - "_selectKeyCellAtRow:column:", - "_setDidEndSelector:", - "directoryServicesServer", - "inputConnectionForOutputConnection:", - "cellAtPoint:row:column:", - "initWithURL:quartzFilter:", - "accessibilitySetFrontmostAttribute:", - "_selectLastSubfield", - "_registerObservingForAllModelObjects", - "_growRegistrationCollectionTo:", - "windowWillClose:", - "makeUID", - "alwaysVisibleWhenStopped", - "checkCount:", - "relationshipKeyPathsForPrefetching", - "_sizeFromSubitemsMinSize:maxSize:", - "renameList:", - "isExpanded", - "_allowsActiveInputContext", - "redoMenuTitleForUndoActionName:", - "_unbind:notifyDelegate:", - "_isGapStyleDropTargetForRow:operation:mask:", - "setEventHandler:andSelector:forEventClass:andEventID:", - "_applyAllValuesFromValueBuffer", - "takeStoredValue:forKey:", - "recompileSourceOfType:", - "_appendWhereClauseForExpressionCollection:", - "calcThumbnailSize", - "setDescriptor:forKeyword:", - "attachmentCell", - "_forceRemoveItemFromIndex:", - "typeFromFileExtension:", - "setDisplaysLinkToolTips:", - "performActionForItemAtIndex:", - "_cellIsEditableAtColumn:row:", - "yAccel", - "setBezeled:", - "_userSelectTextOfNextCellInSameColumn", - "_freeNode:", - "_setThumbnailView:", - "currentVersionURL", - "addDocumentWithURLToIPhoto:commit:", - "pixelFormatBGRX8", - "getAttributesAndValuesForPlugin:", - "_addWindow:", - "notifierMap", - "imageNamed:fromBundle:", - "texturePixelsHigh", - "_destroyRealWindow:", - "clearDrawable", - "groupingLevel", - "draggingExited:", - "stringWithContentsOfURL:", - "_defaultItemIdentifiers", - "IKIPArrayByApplyingSelector:", - "exportItem:toApplication:", - "indexIntoTemplate", - "_scheduleHideControlsPanel", - "unvalidatedSpecifier", - "setOpenGLTextureOffset:", - NULL, - "queryStringForItems:values:", - "shouldShowControlWithID:", - "initWithName:appleEventCode:objcClassName:", - "_setHasHorizontalScroller:", - "isAutodisplay", - NULL, - "performIntegrityCheck", - "nextPrimaryKey64", - "_menuRepresentationHasBeenSet", - "setScrollMode:", - "getDownloadedResource", - "mouseDownAction", - "leading", - "exchange::", - "start", - "invokeUndefinedMethodFromWebScript:withArguments:", - "_isPendingUpdate", - "_addUniqueNameOrNames:toNames:", - "fieldName", - "characterSetWithName:", - "updateGroupsSelection:", - "_chunkAndCheckGrammarInString:language:usingSpellServer:details:", - "initWithTarget:selector:object:", - "_accessibilityToolbarItemViewerHelperClass", - "membersChanged:", - "containsObjectIdenticalTo:", - "viewDidUpdateTrackingAreas:", - "contact", - "mergePolicy", - NULL, - "allowsNullArgumentWithBinding:", - "_setNeedsDisplayInColumn:row:", - "localizedNameOfStringEncoding:", - "_processRequest:", - "_old_encodeWithCoder_NSComboBoxCell:", - "setDuration:", - "kbVersionString", - "setDestinationURL:", - "openFile:operation:", - "propertyListForType:", - "_enclosingClipViewDidChange:", - "moveWordLeftAndModifySelection:", - "_storeClassForStoreType:", - "scheduleProgress", - "hasRamLeftToContinueSchedule", - "currentTextView", - "pixelFormatsWithCompatibilities:pixelColorModel:pixelAlpha:pixelType:", - "_getIsExpansionToolTip:", - "acceptLastEnteredText", - "_equalyResizeColumnsByDelta:resizeInfo:", - "newGeneratorWithStatement:", - "textViewForBeginningOfSelection", - "applicationDelegateHandlesKey::", - "reloadGroups", - "_removeSubNodesAtIndexes:", - "_predicateForSpecificEntity:", - NULL, - "tooltipStringForPoint:inNode:bounds:tooltipBounds:", - "beginSheetModalForWindow:modalDelegate:didEndSelector:contextInfo:", - "IKSizeOfTextForWidth:textView:", - "initWithCGLayer:", - "groupList:includeSpecial:all:subscriptions:readOnly:smart:", - "delayedShowcase:", - "_shouldTryCoreUIDrawing", - "_minYminXResizeRect", - NULL, - "nts_ShareCount", - NULL, - "_statusCodeSuccessful", - NULL, - "imageCropView:didReceiveDraggedImage:", - "CA_isDirectoryAtPath:", - "_unregisterDynamicToolTipManagerInstance:", - "fileListMode", - "_eventDelegate", - "drawDisclosureGroupTail:inRect:", - "_resizeTextViewForTextContainer:", - "showStatus", - "currentEditor", - "changeVector:", - "_imageFrame:", - "accessibilityAXAttributedStringForCharacterRange:parent:", - "selectionShouldChangeInOutlineView:", - NULL, - "isNetworkUp", - "exitFullScreenModeWithOptions:", - "_position", - "setTimeValue:", - "_removeOutputConnectionsForInputConnection:", - "cacheFragHandler", - "_isLayerBacked", - "pathCellClicked:", - "setTransform:", - "launchedTaskWithLaunchPath:arguments:", - NULL, - "isToManyKey:", - "bundleForClass", - "getRotationAngle", - "rectForKey:inTable:", - "thumbnail", - "panelController", - "dictionaryRepresentationOfRecordOfClass:tableName:atRow:resultsView:", - "removeValueAndLabelAtIndex:", - "setHeartBeatCycle:", - "QTKitErrorNotification:", - NULL, - "setExternalReferenceCount:", - "standardEffectsForImageState:backgroundStyle:startingFromBaseArt:", - "_unregisterDragTypes", - "setFileListOrderedByFileProperty:", - "validRequestorForSendType:returnType:", - NULL, - "setDropItem:dropChildIndex:", - "propertyType", - "scrollBarVisible", - "sharingProgressForGroup:showUpdateSharingIndicator:", - "_updateNodeList:byAddingNode:", - "_autoSelectCallback", - "_reloadDataForNode:", - "_showBorder", - "_validateValuesAreOfDestinationEntity:source:", - NULL, - "windowWillReturnFieldEditor:toObject:", - "setUsePixels:", - NULL, - "_openRegularCollections", - "unselectAllItems", - "visitor", - "markUniqueIdsAsPlanned:", - "removeObject:objectIDMap:", - "listDescriptor", - "decodeDoubleForKey:", - "holesFlavor", - "setMagnificationFilter:", - "accessibilitySetMinimizedAttribute:", - "compositeToPoint:operation:fraction:", - "addMultiValues:toProperty:", - "_bestRepresentation:device:bestWidth:checkFlag:", - "_allocateAuxData", - "newObject", - "changeBaseWritingDirectionToLTR:", - "_realPlaceHolderAttributedString", - "keyEquivalentAttributedString", - "setChangedValues:", - "openHost:user:password:", - "unbindLayer:", - "isKey:inTable:", - "initWithKind:name:stringValue:URI:", - "_dataWithConversionForType:", - "objectsAtIndexes:", - "abortCurrentTask", - "valueWithName:inPropertyWithKey:", - "strokeOval:color:context:", - "closestPixelFormat:outDifference:", - "abStringAtRange:inEncoding:", - "resizeRightCursor", - "rectForPart:", - "drawSeparatorItemWithFrame:inView:", - "_findWindowUsingRealWindowNumber:", - "setDocumentCursor:", - "_canAnimateScrolls", - "_dismissModeless:", - "splitViewWillResizeSubviews:", - "registerNodesWithManager:", - "dsDataList", - "setSelectedDirectoryResults:", - "initWithGRL:invocation:withDelay:", - "fileExistsAtPath:", - "glyphIndexForPoint:inTextContainer:", - "inputExtentAtIndexes:", - "setBinding:", - "_setDrawsWithTintWhenHidden:", - "switchLayoutTo:withAnimation:", - "countdownView", - "registerTasks", - "abVCardKoshify", - "setMarker:", - "outlineView:isGroupItem:", - "initWithJPEGFile:options:", - "setNameFieldLabel:", - "handleSaveScriptCommand:", - "textProc", - "acceptDroppedFile:", - "keyCell", - "dataWithBytes:length:", - "initWithTranslator:selector:", - "setLocalDrag:", - NULL, - "nts_Disconnect", - "_stringWithSavedFrame", - "_fromScreenCommonCode:", - "setNumSlices:", - "createOutputWithPortClass:forKey:attributes:arguments:order:", - "iconView:keyDownEvent:", - "tableView:writeRowsWithIndexes:toPasteboard:", - "_readColorIntoRange:fromPasteboard:", - "captureOutput:didStartRecordingToOutputFileAtURL:forConnections:", - "setROISelectorForKernel:jsROIFunction:", - "_initializeWithContentsOfDictionary:", - NULL, - "shouldProceedAfterError:", - "comboBoxCell:objectValueForItemAtIndex:", - "_titleCellSize", - "_desiredLayerSizeMeritsTiledBackingLayer:", - "setRemoteURL:", - "isRectangular", - "transform", - "collatorElementWithName:", - "_menusWithName:", - "usesLazyFetching", - "addFlagsToDictionaryRef:", - "connectObject:withKey:toObject:withKey:userInfo:", - "_initWithName:fromCMProfileRef:", - "newStatementWithEntity:", - "engineRef", - "_handleSelectionInZoomMode:", - NULL, - "initWithTitle:", - "_handleCursorUpdate:", - "decodeArrayOfObjCType:count:at:", - "setTextColor:range:", - NULL, - "fontSize", - "CA_pathComponents:", - "_mainStatusChanged", - "representationOfImageRepsInArray:usingType:properties:", - "_setValueWithoutNotification:", - "_setupMidnightTimer", - "instantiateWithObjectInstantiator:", - "mapTableWithKeyOptions:valueOptions:", - "mapTableWithWeakToWeakObjects", - "URLHandle:resourceDidFailLoadingWithReason:", - "selectionRangeForProposedRange:granularity:", - "rootNode", - NULL, - "initWithDir:dsDataNode:", - "versionHash", - "runPoof", - NULL, - "provider", - "setProgress:", - "_registeredClasses", - "setViewAnimations:", - "_setZoomFactorX:factorY:centerPoint:", - "prefixForName:", - "setEmpty:", - "affectedStores", - NULL, - "insertObject:", - "_setupObserving", - NULL, - "_propagateCocoaDirtyRectsForView:toCarbonView:", - "configValueForKey:defaultValue:", - NULL, - NULL, - "initInternalViews", - NULL, - "ISS_initWithScheme:host:port:uri:", - "_indexForProperty:", - "substituteGlyphsInRange:withGlyphs:", - "createPixelBufferWithFormat:pixelsWide:pixelsHigh:options:", - "accessibilityIsSelectedRangeSettable", - "_willPresentSavingError:forOperation:url:", - "setCompositingFilter:", - "_doScroller:", - NULL, - NULL, - "_useAutoreleasePoolInTrackMouse", - "_createStoreFetchRequestForFetchRequest:", - "_javaLastError", - "handleKeyUp:inNode:view:", - "setIsReference:", - "canonicalHTTPURLForURL:", - "initWithItem:", - "documentFragmentForDocument:", - "_copyRenderingContextWithGlyphOrigin:", - "crayonToRightOfCrayon:", - "_drawRectAsLayerTree:", - "varianceInitROI:destRect:userInfo:", - "toolbarLabelFontSizeForToolbarSize:", - "_fullName", - "initWithOperatorType:modifier:variant:", - "allowedValueBindingMask", - "advancePastEOL", - "scheduleSyncPageIndex:", - "descriptorForKeyword:", - "_shouldUseSecondaryHighlightColor", - "descriptionWithCalendarFormat:timeZone:locale:", - "_reallyDoOrderWindow:relativeTo:findKey:forCounter:force:isModal:", - "insertValue:inPropertyWithKey:", - "_postBoundsChangeNotification", - "_addCells:", - "_moveTexturesFromContext:toContext:", - "checkBufferSize", - "hitTest:fromLayer:", - "isUndoing", - "_nibName", - NULL, - "writeBOSNumString:length:ofType:scale:", - "CAML_supportedClass", - "isSheet", - NULL, - NULL, - "displayNameForKey:value:", - "contentsGravity", - NULL, - "removeRecord:", - NULL, - NULL, - "standardEffectsForImageWithCocoaName:state:backgroundStyle:", - "_notifyEdited:range:changeInLength:invalidatedRange:", - "_queryServerForLockToken:", - "removeItemAtPath:error:", - "_operatorForType:", - "_web_rangeOfURLHost", - "_keyEquivalentMapIsDirty", - "_doCleanupOnFailure:", - "_initWithView:printInfo:", - "_initWithStream:data:topDict:", - "writeToFileWithAutomaticFormat:", - "setOptionsAttributes:string:", - "_sendDoubleActionToCellAt:", - NULL, - "_createAssociationsByDestination:fromSource:forEntityMapping:", - "addNode:", - "deleteInputForKey:", - "deleteRow:", - "_internalNextTypeSelectMatchFromIndex:toIndex:forString:", - "handlePictureTakenNotification:", - "_sendDelegateDidClickColumn:", - "_predicateForCustomProperty:comparison:value:label:", - "objectDidTriggerAction:", - "thicknessRequiredInRuler", - "aeteResource:", - "_removeObjectForAttributeKey:", - "entityForObject:", - "folderPath", - "disableDelegateMessages", - "_setMinPickerContentSize:", - "canPaste", - NULL, - "_browserAction:", - "_updateMetalBackgroundStyle", - "_detatchNextAndPreviousForAllSubviews", - "zoomMaxCallback:", - "customViewForPanel:withSize:withTypes:popupExtension:saveType:saveCreator:optionFlags:", - "destinationEntityVersionHash", - "_setBindingAdaptor:", - "customDraggedImage:", - NULL, - "_cacheRepresentation:toSizeInPixels:stayFocused:", - "_currentFamilyName", - "shadowFrom:red1:green1:blue1:alpha1:red2:green2:blue2:alpha2:opacity:", - NULL, - "_cycleDrawersBackwards:", - "setUpFieldEditorAttributes:", - "_userSelectSingleColumn:", - "fitToScreen", - "destinationAlias", - "docFormatFromRange:documentAttributes:", - "orderOut:", - "_updatePredicateFromRows", - "session:storeAuthChallenge:forURL:", - "_createNaughtDelegate", - "initWithDir:value:", - "transferMode", - "_importThreadContinued:", - "popTopView", - "addStringToRecentReplaceStrings:", - "doAddAnnotaion:", - "URL:resourceDidFailLoadingWithError:", - "nicestRenderingProgress", - "interiorBackgroundStyleForSegment:", - "_deviceLineToPoint:", - "_hasTiledBackingLayer", - "_init::::", - "insertionIndexForMember:inSortedMembers:", - "removeExpandedNodesStartingWithIndex:", - "accessibilityMenuBarAttribute", - "pdfPageCharIndexToCGPageRefIndex:", - "_convertRect:toPos:andLen:", - "_expressionWithSubstitutionVariables:", - "_setTarget:", - "propertyValuesWithKey:addressBook:", - "keyToIndex:", - NULL, - NULL, - NULL, - "_drawTitleBar:", - "_old_writeColorsToGlobalPreferences", - "viewWithFrame:forView:characterIndex:layoutManager:", - "applyFunctionOnSubpatches:context:recursive:", - "_resizeViewToFit:", - "setOutputFormat:", - NULL, - NULL, - "generateSelectIntermediateInContext:", - "setDestinationOptions:", - "vertPass9ROI:destRect:", - "_cellOrControlForObject:", - "updateButtonState", - "_setCurrentListLevel:", - "scrollRectToVisible:inScrollView:animate:", - "deleteSelection", - "decodeLongForKey:", - "removeRowsAtIndexes:includeSubrows:", - "edge", - "_volumeIsLocalForRefNum:", - "createTransformedImage:", - "migrateStoreAtURL:toURL:storeType:options:withManager:error:", - "browser:selectCellWithString:inColumn:", - "_segmentedControlDidChangeHighlightDuringTracking:", - "setReservedThicknessForMarkers:", - "entityMigrationPolicyClassName", - "_setPreviousNibBindingConnector:", - "addressBookCoreDataDatabaseFile", - "_clipIndicatorIsShowing", - "_rowsChangedByLastExecute", - "_handleDisabledNodeClicked:", - "_dismissModalForTerminate", - "_needsHighlightedTextHint", - "cachedImagePathForEmail:", - "_containerViewOfColumns", - NULL, - "setCocoaSubVersion:", - "layoutManager:shouldUseTemporaryAttributes:forDrawingToScreen:atCharacterIndex:effectiveRange:", - "setEnabled:", - "sortingLastName", - "preferredFilename", - "_lastDragDestinationOperation", - "_checkInList:listStart:markerRange:emptyItem:atEnd:inBlock:blockStart:", - "qualityHint", - "decimalNumberHandlerWithRoundingMode:scale:raiseOnExactness:raiseOnOverflow:raiseOnUnderflow:raiseOnDivideByZero:", - "itemRolledOut", - "didLoadNib", - "matchIndexForPerson:withPieces:", - "sizeHeightToFit", - "RTFFromRange:documentAttributes:", - "_userInsertItemWithItemIdentifier:atIndex:", - "_createDefaultOrUnflattenPrintSettingsIfNecessary", - "_collapseButtonOrigin", - "containerSpecifier", - "writeSelectionToPasteboard:type:", - "accessibilityIsHiddenAttributeSettable", - "setTextContainer:forGlyphRange:", - "first", - "setUsesAlternatingRowBackgroundColors:", - "addTimeInterval:", - "supportsTransformation", - "_adjustedFrameForSaving:", - "countKeyPath", - "decimalNumberWithString:", - "orderedIndex", - "setControlTint:", - "croppedImageFromOriginalImage:cropInfo:cropSize:outputSize:bgColor:", - "setFinished:", - "_accessibilityGrowBoxRect", - "setACEs:", - "closeShowcasedMenu:", - "vramBindedRange", - "current", - "_availableContentRectForCellFrame:isFlipped:", - "unlearnWord:", - "_sizeMatrixOfColumnToFit:", - "retainedDataForObjectID:withContext:", - "cachedResponseIsValid:", - "updateRecentPicture:setCropInfo:smallIcon:", - "vectorWithX:Y:Z:W:", - "mipmapCache:didLoadMipmap:withUID:", - "facingPageForPage:", - NULL, - NULL, - "_drawRepresentation:", - NULL, - "enumerationDescriptionFromName:implDeclaration:presoDeclaration:", - NULL, - "objectForDatabaseKey:", - "_initWithScriptIDNoCopy:", - "_moveFullscreenViewToView:", - "_primitiveDeleteGlyphsInRange:", - "didChangeExpandedNodes", - "characterIndexForPoint:", - "createDictionaryRef", - NULL, - "textView:draggedCell:inRect:event:", - "_windowDidOrderOnScreen:", - "restartTasks", - NULL, - "contentCountWithEditedMode:", - "setAutoPositionMask:", - "initForKeys:", - "_rangeForUserBaseWritingDirectionChange", - "scalable", - "lockForWriting", - "abDidRevertFromBackupCompleteResetContextAndUnlock:", - "showsLockButton", - "_movieIdle", - "alwaysShowNode:inDirectory:selectIfEnabled:", - "sharedInspector", - "_createBitmapImageRepFromCGRepresentation", - "_endLiveResize", - "resizeUpCursor", - "registerRow:forObjectID:", - NULL, - "emptyAttributeDictionary", - "hasTitleBar", - "setProperty:forKey:", - "_endInsertionOptimizationWithDragSource:force:", - "cameraNotConnectedText", - "enableDelegateMessages", - NULL, - "_createOutputPortForTimeLineIndex:", - "_titleWidth", - "_informationForFont:glyphTable:positionTable:", - "fixupDirInfo:", - "startPeriodicEventsAfterDelay:withPeriod:", - "initWithContentsOfURL:options:", - "selectionWillChange", - NULL, - "cancelQuery", - "controlsDidLayoutWithWidth:oldWidth:", - "retainArguments", - "_getAuxData", - "setSourceDimensions:", - "_browser:keyEvent:inColumn:", - "elementWithName:URI:", - "lockIsNotValid:", - "createCharacterSets", - "customDraggedImageLocation:", - "_processMetadataForDocument:", - "htmlStringForAttachment:atIndex:", - "DSQueryComponents", - "_copyCertificateFromPublicKeyHash", - "_setDrawsAsNavigationBar:", - "_frameForLayer:inBounds:", - "_typeDescriptionForAppleEventCode:", - "_fsRefValue", - NULL, - "directory", - "performDragOperation:", - "setPreferredBackingLocation:", - NULL, - "_addWindowsMenu:enabled:", - "ruleEditor:parentCriterion:compareCriterion:withLocalizedDisplayValue:toCriterion:withLocalizedDisplayValue:", - "red", - "enable:", - "otherMouseDraggedDelegate:", - "drawInContext:drawSelection:", - NULL, - "_growWindowReshapeContentAndToolbarView:animate:", - NULL, - "_isResizable", - "_inlinePreviewDidChangePlaying:", - NULL, - "colorWithRed:green:blue:alpha:", - "accessibilitySelectedRange", - "getCString:maxLength:range:remainingRange:", - "CA_JSClassName", - "autosavingFileType", - "setCellsHaveSubtitle:", - "_dynamicColorsChanged:", - "_setTitle:", - "controller", - "newFetchedPKsForSourceID:andRelationship:", - "_addMarkersToList:range:", - "setContentsGravity:", - "currentPreviewView", - NULL, - "_edge", - "_adjustedSizeFromSize:withMinSize:maxSize:ratio:deltaPosition:", - "_resetRefCount:", - "shouldArchiveValueForKey:", - "_audioChannelRange", - "addRecord:", - "convertRect:fromLayer:", - "dataReferenceAtIndex:", - "rangeOfGraphicalSegmentAtIndex:", - NULL, - "initWithManagedObjectModel:configurationName:", - "minimizeWindow:", - "adjustToPDFView:subIndex:", - NULL, - "ISS__ay_performSelector:inThread:", - "createCommonNotificationUserInfoDictionary", - NULL, - "connectionMediaTypes", - "retainCaches", - "cellWithTag:", - "synthesizerIsRetained", - "minimumDecimalNumber", - "initWithRepresentedObject:treeController:", - "_clearSelectedCell", - NULL, - "formatterBehavior", - "_displayedDocumentPreview", - "_isGenericProfile", - "_moveSource:toDestination:", - "loadDidSucceed", - "_prepareForReloadChildrenForNode:", - "isInputTopLine", - "wrapROI:forRect:", - "willBecomeVisibleNotification:", - "_web_compareDay:", - "setCanCycle:", - "_specifiesMultipleIndexedObjectsPerContainer", - "_cfPasteboard", - NULL, - "findProxyAuthenticationForRequest:", - "_autosaveRecentSearchList", - "matchesHostNameFromLockDictionary:", - "setPathStyle:", - "minimalFormInContext:ofPredicates:", - "_applyValueTransformerToValue:forBindingInfo:reverse:", - "_prepareHelpWindow:locationHint:", - "_autoExpandFlashOnce", - "setLoopMode:", - "parseABDATE", - "removeSharedTexturesWithOwner:", - "dispatchPropertyChanged:", - "initWithNS:andTag:", - NULL, - "_userMoveItemFromIndex:toIndex:", - NULL, - "accessibilityElementWithParent:", - "initWithMemoryCapacity:diskCapacity:diskPath:", - NULL, - "sharedWindow", - "loadServersFromDefaultsFile", - "_configureAutoVacuum", - "targetForAction:to:from:", - "_isRunningModal", - "filterView", - NULL, - "lockForReadingWithExceptionHandler:", - "setCompositingOperation:", - "removeMetadataForKey:", - "_batchCollapseItemsWithItemEntries:collapseChildren:clearExpandState:", - "_helpButton", - "nonNullValueForKey:inDictionary:", - "_setOriginalFileInfoFromFileAttributes:", - "removeItemWithTitle:", - "drawViewInRect:", - "_setFocusing:", - "_setButtonType:adjustingImage:", - "_cancelAllOperations", - "_importPeople:", - "isTypeNotExclusive:", - "_tryToCreateCGImageRepFromNonCGFile:", - "shouldEnableControl:withID:", - "userName", - "getPrintOperationForPrintInfo:autoRotate:", - "isAlias", - "_sizeToFitTextFields", - "initWithType:size:", - "clearSelectionPath", - "_managedProxy", - "_matchesCharacter:", - NULL, - "cache", - "descriptionForInstanceMethod:", - "_itemAtLabelIndex:", - "referenceInstance", - "selectSearchResult:", - "_closeFlags:openFlags:inString:", - "_menuOwnerCanUseMenuWhenModal", - "ikImageLayer", - "removeCharactersInRange:", - "clearDirectoriesSelection", - "_setBulletCharacter:", - "defaultConnection", - "pageFromPageDictionary:", - "menuHasKeyEquivalent:forEvent:target:action:", - "switchImage:", - "_minXTitlebarButtonsWidth", - "setPrimaryIdentifier:", - "setWidth:ofColumn:", - "initWithTimeInterval:sinceDate:", - "imageForControlTint:", - "_blockSafeRangesForRange:", - "_entityForName:", - "needsToRemainInViewHierarchy", - "addTextTrack:atTimeRanges:withAttributes:error:", - "_realmForURL:", - "_setFinalSlideLocation:", - "_importFile:", - "_clipViewAncestorDidScroll:", - "_mergeTree:", - "_setHighlightedItem:", - "initWithTexture:size:isDest:", - "leftArrowPathInRect:", - "prepareForSave:", - NULL, - "_multipleMutableArrayValueForKeyPath:atIndexPath:", - "accessibilityIsProxyAttributeSettable", - NULL, - "addRepresentations:", - "setCurrentEntity:", - "_beginListeningForPowerStatusChanges", - "setSizesPreviewToFit:", - "__oldnf_getObjectValue:forString:errorDescription:", - "_setView:enabled:", - "_perThreadHandlingStack:", - "_readRecentDocumentDefaultsIfNecessaryForKey:", - "getAttribute:range:allowBinary:", - NULL, - "originalImageSize", - "registeredStoreTypes", - "incrementButtonWithParent:", - "_deleteConfirmSheetDidEnd:returnCode:contextInfo:", - "_availableSettings", - "addTimerToModes", - "undoer", - "_requestAnyEditableState", - "_didHideDisplayableView:", - NULL, - "_propertyDescriptionForAppleEventCode:checkSubclasses:", - NULL, - NULL, - "setObject:", - "_computeExecutablePath", - "_removeSystemUIModeHandler", - "resetAllPorts", - "contentFill", - "shapeFillMode", - "isWindowInFocusStack:", - "interval", - "selectionInProgress", - "setIndex:ofKey:", - "loadSuitesFromBundle:", - NULL, - "resetCounter", - "_readFontIntoRanges:fromPasteboard:", - "_categories", - "_old_configureAndDrawImageWithRect:cellFrame:", - "removeProperty:", - "sizesPreviewToFit", - "handleWindowEvent:callRef:", - "trackWithQuickTimeTrack:error:", - "initWithUpper:attribute:", - "_drawDropHighlightOffScreenIndicatorPointingLeftAtOffset:", - "_drawRemainderArea", - "_defaultLineHightForUILayout", - NULL, - "_baselineDelta", - "setWindowController:", - NULL, - "certStatus", - "send", - "freeFormLayoutMode", - NULL, - "captureOutput:willStartRecordingToOutputFileAtURL:forConnections:", - "_loadUsingLibXML2", - "updateCurrentBrowsingNodePathWithCurrentDirectoryNode:", - "flags", - "_setStructure:", - "_urlStringWithScheme:", - "addNameValueToDictionaryRef:", - "columnCount", - "_updateTasksCellsCopy", - "nts_HasChangedProperties", - "_edges", - "initWithFrame:ruleEditorView:", - "_isFixedPitch", - NULL, - "_registerBuiltInFormatters", - "_engravedOffsetTextColor", - "_invalidatePagination", - "_assignObject:toPersistentStore:forConfiguration:", - "adjustTableColumns", - "respondsToSelector:", - "nts_InitWithDictionaryRepresentation:addressBook:", - "findEncodingFromCharsetTag", - NULL, - "_suggestedControllerKeyForController:binding:", - "roundSubRect:", - "_createAndSendOffsetToPointEvent:", - "_webKitBundle", - "_setHorizontallyCentered:", - "_clearDirtyRectsForLockedTree", - "_cycleWindowsReversed:", - "_abCompareWithinIntervalFromTodayYearless:", - "loadAndRestoreCurrentBrowsingNodePath:selectedNodes:", - "segmentProxyFor:parent:", - "_unregisterMenuItemForKeyEquivalentUniquing:", - "resourceSpecifier", - "setRulersVisible:", - "_initPanelCommon", - "initWithAuthenticationChallenge:sender:", - "allowsMultipleSelection", - "setWithObject:", - "lineJoinStyle", - "_integerValueFromObject:", - "_bindingAdaptor", - "_parseLibXML2Node:", - "_shouldShowFocus", - "encodePoint:forKey:", - "displaysAsBook", - "setHighlightedTableColumn:", - "findNodeNames", - "createCGImage:fromRect:format:", - "fetchPropertyValuesWithKey:uniqueId:addressBook:", - "newIndexOfOldIndex:", - "indexSheet:didClickOnDocumentAtIndex:", - NULL, - "fetchNoteOutOfRecordWithEmptyTemplate:", - "imageFromCGImage:imageProperties:imageState:options:", - "mouseTracker:shouldContinueTrackingWithEvent:", - "_revertToOldRowSelection:fromRow:toRow:", - "addDistributionListEntryToGroup:forMember:distributionListProperty:multiValue:", - "__portUpdated:", - "resolveMarkerToPlaceholder:binding:", - "_updateDocument:withMetadata:", - "appleEvent", - NULL, - "setFileMode:", - NULL, - "_rangeOfSuffixFittingWidth:withFont:", - NULL, - "previewView:shouldDisplayView:", - "_childrenCount", - "_allContexts", - "savePreviewHeightInDefaults:", - "compositionWithIdentifier:", - "setVariableRows:", - "_nextTypeSelectMatchFromRow:toRow:forString:", - "stopSpinning", - "getCharacters:range:", - "allowsMixedState", - NULL, - "speakString:", - "shouldIgnoreAction:", - "_indexClosestToIndex:equalAllowed:following:", - "setDeletesObjectsOnRemove:", - "initWithCGSRegionObj:", - "_old_initWithCoder_NSTableHeaderView:", - "decodeIntoBuffer:size:useZeroBytesForCRC:", - "street", - "changeDocumentBackgroundColor:", - "subIndex", - "registerForServices", - "enableCursorRects", - "initWithCapacity:optionFlags:", - "imageBoundingRect", - "isEqualToIndexSet:", - "setPrintScalingMode:forPrintOperation:", - "_waitCursor", - "_removeFrameUsingName:domain:", - "accessibilitySharedTextUIElementsAttribute", - "ancestorSharedWithView:", - "allUniqueIdsWithModificationDates", - "buttonImagesForButtonState:", - "_setupFullscreen", - "sharedActor", - "preparePublicChangeNotification:privateChangeNotification:couldAffectSyncing:couldAffectSharing:privateTablesChanged:modificationDate:", - "pointerArrayWithWeakObjects", - "launchABDIfNeeded", - "loosenKerning:", - "setObservationInfo:", - "_isDocWindow", - "_createPopUpButtonWithItems:selectedItemIndex:", - "_setFocusRingNeedsDisplayIfNecessary", - "accessibilityVisibleCharacterRangeAttribute", - "canBeConvertedToEncoding:", - "_addBinding:toController:withKeyPath:valueTransformerName:options:", - "_knowsPagesFirst:last:", - "_formatCocoaErrorString:parameters:applicableFormatters:count:", - "_uniqueInputPortKey", - NULL, - "_contentType", - "initWithClient:", - "isWord:inDictionaries:caseSensitive:", - "operatorWithType:modifier:options:", - "negativePrefix", - "setShouldHideMeCard:", - NULL, - "removeItem:", - "nodeClassDescriptionClass", - "noDifference", - NULL, - "inputImageWrapper", - "_protectionSpaceWithKeychainItem:isDefault:", - "sortDescriptorPrototype", - "inputImage", - "serverType", - "cleanupNotifications", - "_stopError", - "_setScaleFactor:", - "layoutFlags", - "_diskCacheClear", - "preload", - "_postValueSelectionChangedNotification:", - "_setHighlighted:", - "pixelAspectRatio", - NULL, - "bundleForClass:", - "_insertionIndexForPerson:", - "_registerForDraggedTypes:later:", - "setInputElement:", - "policies", - "_performClick:ignoreMenus:", - "_highlightCell:atRow:column:andDraw:", - "_computeFirstCompletelyVisibleColumn", - "updateFromPrintInfo", - "_deleteNode:byEntityName:", - "_selectPreviousItem", - "openSidebar:", - "addHighlightingModeToDictionaryRef:", - "textView:shouldSetSpellingState:range:", - "addCellWithSettings:data:intent:", - "setRolloverCaption:", - "_familyNamesForCollection:", - "_web_fileExistsAtPath_nowarn:isDirectory:traverseLink:", - "windowSharingType", - "validateMipmap:withQuality:", - NULL, - "nibInstantiateWithOwner:topLevelObjects:", - "_setActivationState:", - "indexOfItemWithRepresentedObject:", - "expect:", - NULL, - "_carbonWindowClass", - "_asScriptTerminologyNameArray", - "directoryResultsSelectionChanged:", - "setPeriodicFlushThreadState:", - "acceptConnectionInBackgroundAndNotifyForModes:", - "initWithFetchRequest:", - "ISS_URLWithDirtyString:", - "initWithControlArray:", - "_restoreZoomState", - "_setLocationTemporary:", - "buttonToolTip", - "_glyphGenerator", - "fixNotesRulersInRange:", - "layoutToFitInMinimumIconSize", - "registerExternalData:forSourceObjectID:key:options:andTimestamp:", - "_blockAndGetChildrenOfNavNode:", - "moveRightAndModifySelection:", - "_updateUI:", - NULL, - "spin", - "_rangeOfDaysForMonth:year:", - "setupRootLayer", - "saveButton", - "_restoreMovieEditState:", - "_autosaveForRegularQuit", - "setDisplayBox:", - "connectionsForMediaType:", - "removeIndexLabelAtIndex:", - "headerColor", - "_targetBinding", - "decimalNumberByRoundingAccordingToBehavior:", - "addIndexInRenderList:", - "orderOutPopUpWindow:", - "initDeleteWithSession:path:", - "_datasourceImageRepresentation", - "directImportMode", - "_removeInternalRedFromTextAttributesOfNegativeValues", - "_enableOrDisableTrackingArea:", - "_rollbackTransaction:", - "suspendCurrentAppleEvent", - "setVideoDataSource:", - "localizedStringForComparison:withProperty:", - "toolmodeWillChangeFrom:to:", - "performClose:", - "tableViewSelectionDidChange:", - NULL, - "initWithRunStorage:", - "memberOfInputWhiteParams:", - "setColumnsToFetch:", - "oldSystemColorWithCoder:", - "blendWindow:withNewContentView:duration:delegate:", - "selectedRanges", - "glyphIndexToBreakLineByWordWrappingAtIndex:", - "initWithCommandDescription:", - "_initWithLoadingConnection:request:response:delegate:proxy:", - "startTextTimer", - "_diskCacheExecuteWrite:", - "_isEnabledTableView", - "_createBackgroundFullscreenWindowWithFrame:", - "_tileTitlebarAndRedisplay:", - "_reallyProcessNotifications:", - "_shapeWithCGSRegion:", - "outlineView:willCollapseItem:", - "setRenderer:", - NULL, - "positionOfGlyph:withRelation:toBaseGlyph:totalAdvancement:metricsExist:", - "rulerViewClass", - "_removePropertyListeners", - "_postingDisabled", - "removeTabViewItem:", - NULL, - "setUsesFontPanel:", - "_loadSuiteDescription:", - "targetIconSize", - "portForName:host:nameServerPortNumber:", - NULL, - "_handleFTSEntry:", - "indexHelpResults:resultGRLs:", - "_volumeSupportsLongFilenamesAtPath:", - "_simpleOverflowMenuItemClicked:", - "keyTimes", - "skipDescendents", - "itemRemoved:", - "imageBuffer", - "_preparedSavePanelForOperation:", - "_shouldStealSharedPreviewViewForURL:", - "nts_TypeOfProperty:forTable:", - NULL, - "setDiacriticInsensitiveOption:", - "setImagingModeForcedToGWorld:", - "setMargin:", - "activeConversationWillChange:fromOldConversation:", - "canSelectHiddenExtension", - "sharedChooseIdentityPanel", - "_resizeWeight", - "backgroundGray", - "selectAllInView:selectionOnly:fontFamily:font:characterStyle:paragraphStyle:", - "wantsToBeColor", - "textMatchingFieldFrame", - "_writeLinkStringInRange:toPasteboard:", - "_configureAsSeparatorItem", - "setShouldCascadeWindows:", - "_getPosition:", - "optLock", - "highlightWithLevel:", - "_layoutHoleDescription", - "_doOpenDrawer", - "rotateWindow:withNewContentView:direction:duration:delegate:", - "redo:", - "attributeValueClassName", - "hasTrimBox", - "shadowOffset", - "_configurePageSize", - "countOfTitle", - "application:receivedEvent:dequeuedEvent:", - "listensInForegroundOnly", - "_stopWorkThread", - "_isLoadingSDEFFiles", - "_ctTypesetter", - "_setLiveResizeImageCacheingEnabled:", - "_printDatasourceWarning", - "setInverted:", - "_needsModeConfiguration", - NULL, - "_numberByTranslatingNumericDescriptor:toType:inSuite:", - NULL, - "fileButton", - "_setTempHidden:", - "abUIDWithTableName:", - "visibleItems", - "setTransient:", - "accessibilityRoleDescriptionAttribute", - "fieldEditor:forObject:", - "execute:time:arguments:", - "_localizedKeyForKey:", - "applicationShouldHandleReopen:hasVisibleWindows:", - "copyKeyList", - "_ensureContentArrayIsMutable", - "setImportedCards:", - "allowsUserConfiguration", - "setBaseURL:", - "_bitmapFormat", - "analyzeCurrentGRLReconfiguredWindow", - "_autovalidatesItems", - "countOfSubNodes", - "_makeLeftCellKey", - "sizeOfTitlebarButtons:", - "segmentStyle", - "ignoresMouseEvents", - "_setWindowRef:", - "_newUnchangedLockedObjects", - "_groupRect", - "isModal", - "initWithReferenceToData:name:MIMEType:", - "_generateSQLLikeStringInContext:", - "_drawRect:", - "_windowWillOrderOnScreen:", - "_drawRealTitleWithFrame:inView:", - "setVisualBackgroundColor:", - "keyWindowFrameShadowColor", - "_destroyTimer", - "backgroundRed:green:blue:alpha:", - "_state", - "packageEventRef:", - "tokenTextView:shouldUseDraggingPasteboardTypes:", - "_controllerEditor:didCommit:contextInfo:", - "_setTrackingAreasDirty:", - "isBooleanValueBindingForObject:", - NULL, - "setFirstLineHeadIndent:", - "_addMouseMovedListener:", - "pointingDeviceSerialNumber", - "__unionRect:context:", - "searchController", - "stringWithContentsOfURL:usedEncoding:error:", - "nts_DisplayName", - NULL, - "_setCurrentDirectoryNode:", - "_isGraph:", - "roundedRect:withRadius:", - "_interviewHorizontalPadding", - "showIdentityBadges", - "setDimensions:", - "saveChanges:", - NULL, - "showWindows", - "fullJustifyLineAtGlyphIndex:", - NULL, - "resetFirstLastName:", - "sourcePatch", - "halt", - "_updateDrawer:withVisibilityState:", - NULL, - "_throwIfNotEditable", - NULL, - "_isUpdated", - "setErrorAction:", - "drawBackgroundInRect:", - "_cellForPoint:", - NULL, - "_drawDone:success:", - "_continueModalOperationPastPrintPanel", - NULL, - "convertPixelUnitTo3DUnit:", - "setMediaBrowserNode:", - "updateOptions:", - "resourcePath", - "setDrawsBackground:", - "setFormatterBehavior:", - "_startLoadingImage:", - "endDate", - "removeDecriptorAtIndex:", - "textAttributesForPositiveInfinity", - "_pasteboardDictionaryForRecords:", - "numberOfParameters", - "xmlInfoForAttribute:", - "generateIntermediatesForFetchInContext:countOnly:", - "setMinute:", - "editingHasBegun:", - "initWithAnnotationDictionary:forPage:", - "setFilestreamPosition:", - "_messageField", - "_noteToolbarDisplayModeChangedAndPostSyncSEL", - "setAutomaticallyMakePreviewFirstResponder:", - "nts__fullNameIncludingAuxiliaryElements:", - "representationUsingType:properties:", - NULL, - "booleanValue", - "markPersonAsViewed:secondTry:", - "_dictionaryForSerialNumber:remove:clear:", - "_saveUserKeyUsageExtPanelValues", - "_dynamicToolTipsEnabled", - "copyRuler:", - "inputs", - "appendOrderByClauseToSQL", - "apply:to:options1:options2:", - "defaultHandler", - "_familyName", - "resizeUpDownCursor", - "addOrNestTable", - "groupsSelectionChanged:", - "accessibilityIsChildrenAttributeSettable", - NULL, - NULL, - "charRefToUnicode:", - "doubleClickInString:atIndex:useBook:", - "_hasKeyboardFocusInTabItem:", - "isPartialStringValidationEnabled", - NULL, - "_retainedPrimaryKeyNumberForObjectID:", - "character:hasProperty:", - "imageFrameForCellFrame:", - "_editCustomLabels:", - "_keyPathExpressionForString:", - "_mutableStringClass", - NULL, - "automaticallyPreparesContent", - NULL, - "memberSelectionChangedInPeabody:", - "descriptionWithLocale:", - "portClass", - "setSelectionInfo:", - "addObserver:selector:name:object:suspensionBehavior:", - "isEqualToAttributedString:", - NULL, - "_setWindow:", - "IKTemporaryStoredIntValue", - "sharedRegistry", - NULL, - "unhideWithoutActivation", - "_nonIgnoredDetailsForGrammarString:details:inSpellDocumentWithTag:", - "commandDescriptionWithAppleEventClass:andAppleEventCode:", - "_dropsIndentWhenImmediatelyBelow", - "scriptingIsGreaterThan:", - "selectItemsInRange:", - "cookieWithCFHTTPCookie:", - NULL, - "validationWarnings", - "continueTrackingWithEvent:", - "_aquaScrollerBehaviorChanged:", - "elementWithRole:parent:", - "setOutputCount:", - "_addMapping:forConfigurationWithName:", - "removePortsFromRunLoop:", - "_removeWindowRef", - "numberOfGlyphs", - "setSerializedValue:forKey:", - "_drawHeaderOfColumn:", - "nextValidKeyView", - "_typeSelectUndoLastSearch", - "_focusRelinquished", - "_predicateFromRowItem:", - "localizedSummaryItems", - "calculate:::", - "initWithList:", - "findString:inBook:", - "deleteCorrelation:", - NULL, - "popUpMenu:atLocation:width:forView:withSelectedItem:withFont:withFlags:withOptions:", - NULL, - "_canShowGoto", - "_hasNonNominalDescriptor", - "_cursorRectForColumn:", - "_destroyVisualContexts", - "_isAnimatingDefaultCell", - "removeAllAppearanceStreams", - "initWithNewPerson:selectedGroup:addressBook:", - "setAllowsMultipleSelection:", - "baseClass", - "setClippedItems:", - "_releaseCIContext", - "initWithData:range:", - "disableUpdates", - "_setErrorWithEvaluatedObjectSpecifier:", - NULL, - "_setResultRequired:", - "objectSpecifier", - "_currentBranchImage", - "hasViewControls", - "_impl", - "_createTransformedImage:definition:", - "_activeConnections", - "displayedMemberMatching:inPeople:", - "_copyRenderLayer:flags:", - "selectRowIndexes:byExtendingSelection:", - "_maxXTitlebarResizeRect", - "_userCanSelectRow:withNewSelectedIndexes:", - "pixelFormatRGBf", - "_isFirstResponder", - "_web_backgroundRemoveFileAtPath:", - "_messageColor", - NULL, - "nodesForXPath:error:", - "_addBindVarForConstVal2:inContext:", - "expandedNodesForObservedNode:", - "methodArgSize:", - "_drawImageInRect:", - "selectionColor", - "_releaseDNSNamesArray", - NULL, - NULL, - "_replyToLaunch", - "_loadUIIfNecessary", - "initWithPersistentStore:", - "imageInfoView", - "_canDragRowForClickOnCell:column:row:atPoint:", - "_parserContext", - "convertBaseToScreen:", - "_searchProperty", - "removeListener:", - "setWindowFrameAutosaveName:", - NULL, - "isLockedForThreadedOperation", - "_startTearingOffWithScreenPoint:", - "setAllowsReordering:", - "_attributes", - "initFromDocument:", - "_computeDataFromData:", - NULL, - "setAutosavesConfigurationUsingIdentifier:", - "tabState", - "supportsSortingByFileProperties", - "removeObjectsInRange:", - "hashTableWithOptions:", - "_argumentDescriptionsByName", - "printFile:ok:", - "endProgress", - NULL, - "setTimeInterval:", - "setFrame:", - "mappingModelFromBundles:forSourceModel:destinationModel:", - "setMultiplier:", - "setStateValue:", - "handleNotificationOfChildOperation:notification:", - "currentMark", - "release", - "_updateButtonVisibilities", - "setEnabledFileTypes:", - "isTracking", - "_setServerModificationDateString:", - "_actionHasBegun:atIndex:", - "_hostTime", - "imageWithoutAlpha", - "_createDefaultOrUnflattenPageFormatIfNecessary", - "_showDragError:forFilename:", - "resizeRectForBounds:", - "_findFirstOne::", - "isInputImage", - NULL, - NULL, - "_scaledVideoSizeUsingCleanAperture:", - "imageByApplyingState:backgroundStyle:effects:", - "startWindowModal", - "_setStyleForMetal:", - "_keyPathIfAffectedByValueForMemberOfKeys:", - "deleteInputPortForKey:", - "_maxYminXResizeRect", - "_writeForkData:isDataFork:", - "setMaxLineHeight:", - "sharedView", - "filterWithName:", - "_setMainMenu:", - "initWithImage:keysAndValues:", - "isModified", - "compositionPickerViewDidStartAnimating:", - "_readMultipleTextSelectionRangesForString:fromPasteboard:", - "setNumberOfPoints:", - NULL, - "fixesAttributesLazily", - "isFinding", - "addOutputUnitsForConnection:toGraph:ofCaptureSession:error:", - "childContext", - NULL, - "prepareForNewPassphrase", - "textAttributesForNegativeValues", - "updateCacheNode:fromManagedObject:", - "_invokeSelector:withArguments:forBinding:", - "_isFauxFilePackageNode:", - "drawAppearance:withBox:inContext:", - "ubertrustPopupSelected:", - "_setWindowContextForCurrentThread:", - NULL, - "makeBTUnavailable:", - "initGetInfosWithSession:path:", - "shouldEditOnSingleClick:inRow:tableColumn:", - "_dispatchCallBack:flags:error:", - "preferredFilenameExtensionForType:", - "consumeJobEntry:", - "documentCursor", - "reallyRemoveObject:", - "cameraIcon", - "isEmptyPerson", - "acceptsGlyphInfo", - "_beginLoadingImageDataForClient:", - "_updateSizesForFrame:", - "_setCodeSigningUsage:", - "_classDescriptionForName:", - "didReorderOrResizeNotification:", - "updateOKButton", - "createCacheInfoIfNeededForMipmapItem:withUID:", - "_createRecentRecord:forPerson:favorite:", - "setVerticalMotionCanBeginDrag:", - "activeDirectoryUser", - NULL, - "sizeMode", - "isMiniaturized", - "setIncludesSubentities:", - "menuItemIndex", - "_updateObject:observedController:observedKeyPath:context:", - "stringRemovingWrappingQuotes", - "_newValueForColumn:atIndex:inStatement:", - "_returnFirstResponderToWindowFromKeyboardHotKeyEvent", - NULL, - "getAnnotations", - "signatureWithObjCTypes:", - "initWithSize:depth:separate:alpha:", - "_delegateRespondsTo_typeSelectStringForIndex", - "unhide", - "failureReason", - "initWithSize:", - "_bindMipmapItemInRam:ramNode:forCaching:fromDiskOnly:", - "portForName:host:", - "cellsToRenderIndexes", - "setDefaultFixedFontSize:", - NULL, - "_defaultSortDescriptorPrototypeKey", - NULL, - "mouseDragged:inView:", - "zoomRate", - "purgeKeyFrameCaches", - "sharedLDAPManagerInstance", - "dereferencedEntity:", - "setSelected:ifInRect:", - "_writePersistentTableColumns", - "_coreUILinearValue:", - NULL, - "waitUntilThreadDone", - "SCTUserInterfaceItemIdentifier", - "readLocalizedSearchData", - NULL, - "addToScrap", - "_openUnderlineMenu:", - "tableView:mouseDownInHeaderOfTableColumn:", - "initWithName:code:reason:userInfo:", - "abortScrollPrefetchTask", - NULL, - NULL, - "_applyMarkerSettingsFromParagraphStyle:", - NULL, - "_setNavView:", - "calculateBestDateType:andBestValue:forTimeInterval:", - "willChangeValueForKey:", - "performSelector:onThread:withObject:waitUntilDone:modes:", - "_rectOfDraggedColumn", - NULL, - NULL, - "moveItemAtPath:toPath:error:", - "arrayWithObjects:", - "horizontalBoxAddROI:destRect:userInfo:", - "maximum", - "updateColorProfile:", - "addIMValue:toPerson:", - NULL, - NULL, - NULL, - "_hasMainAppearance", - "setSelectedAttributes:isMultiple:", - "_compatibleWithRulebookVersion:", - "setClassAttributes:", - "resumeWithSuspensionID:", - "initWithArray:copyItems:", - "focusedPropertyPath", - "setAllowsAnimatedImages:", - "clear", - NULL, - "trailingOffset", - NULL, - "writeToFile:withAttributes:error:", - "_getConfigDictionaryAtURL:", - "transformUsingAffineTransform:", - "newColorName:", - NULL, - "_autoPositionMask", - "animationManager:processStep:", - NULL, - "_setBaselineMode:", - "_numberOfRowsDidChangeInComboBoxTableView:", - "disabledTextColor", - "allowsAnyHTTPSCertificateForHost:", - "createElement:", - "setTabs:", - NULL, - NULL, - "orderFrontStandardAboutPanelWithOptions:", - "_predefinedAttributes2ForIndex:depth:", - "imageFrameStyle", - "alphaChanged:", - NULL, - "initWithName:directory:", - "_handleNameFieldContentsChanged:", - "_setAuthenticator:", - "baseKeyFrameIndexAtTime:searchBackward:", - "miniaturizedSize", - "accessibilityRulerMarkerType", - "_doSecondPassForMapping:error:", - "insertPage:atIndex:", - "insertText:replacementRange:", - "sharedSurfaceID", - NULL, - "_retrieveNodeForObjectID:", - "insertSegmentOfTrack:timeRange:atTime:", - "_callOnMainThread:withArgs:", - "isSavedQuery", - "indexLessThanIndex:", - "_activeCount", - NULL, - "drawConnection:fromPoint:toPoint:", - "delayedPictureTaking:", - "calculateKnobRects", - "videoFrameProviderForPictureTaker:", - "_clearMarkedWidth", - "insertParagraphSeparator:", - NULL, - "joins", - "drawWindowBackgroundRect:", - "_subviewsExcludingHiddenViews", - "openLocalOnlyWithLocalPath:", - "_willPresentOpenForPrintingError:forURL:", - "initWithSource:", - "createArrays", - "arrayOfKeys", - "requestWithURL:method:", - "_ensureNoTransactionOpen", - "allPixelFormats", - "enableRelease:", - "cameraLabel", - "setScale:", - "_stopDraggingUpdates", - NULL, - "_validateChangesForSave:", - "movieBackgroundColorChanged:", - "renderIntoContext:withUserData:", - "setEmailNormalized:", - "onAnimatedImageTimer", - "setPositiveFormat:", - "_dateValue", - "_scaledDividerThickness", - "_referenceBinderForTableColumn:", - "_endDrawForDragging", - "_setCurrImageName:", - "endSheet:returnCode:", - "tableColumn:willDisplayCell:row:", - "processWhitespace:", - "writeToFile:", - "relativeCurveToPoint:controlPoint1:controlPoint2:", - "mappedIntoVRAM", - "_newSubstringWithRange:zone:", - NULL, - "fileManager:shouldProceedAfterError:linkingItemAtPath:toPath:", - "isRedoing", - "Y", - "sound", - "frameForPopUpWithOldFrame:cellFrame:controlView:", - "_ql_layoutSublayers", - "blurVerticalPass5ROI:destRect:", - "deselectColumn:", - "setObject:forKey:atIndex:", - "_shouldAllowAutoCollapseItemsDuringDragsDefault", - "exportItem:fileArray:cleanUpArray:info:", - "greenRange", - "_collapseAllAutoExpandedItems", - "setBackgroundStyle:", - "initWithFontAttributes:", - NULL, - "_selectObjectsAtIndexesNoCopy:avoidsEmptySelection:sendObserverNotifications:forceUpdate:", - "setPreferredFilename:", - "systemID", - "genericGrayColorSpace", - "_registerRequiredAEHandlers", - "_setHasKeyFocus:", - "_drawDropHighlightOnRow:", - "toolbar:itemForItemIdentifier:willInsertIntoToolbar:", - "fileURL", - "dictionaryForKey:", - "startImportCells", - "_crackRect:", - "slideshowNext:", - "configureForAllowsMultipleSelection:", - "_makeCollectionRequestPostHandler:", - "imageUTType", - "nts_People", - "setAutoenablesItems:", - "maxCellTextAreaSize", - "drawTitleOfColumn:inRect:", - "remoteObjects", - "displayName", - "colorWithColorSpace:components:count:", - "resetSystemTimeZone", - "setCacheData:", - "_setEditableTrust:", - "_adjustGridRowMargin", - "sendDidFail:", - "_isRenderingBorder", - "URLProtocol:cachedResponseIsValid:", - "addJoinForDirectToManyToMany:", - "initWithContext:", - "visualDrawsMovieBoxBackgroundColor", - "setWrapsAround:", - "chooseCustomImage:", - "main", - "_abCompare:ascending:options:", - "editor", - "exportKey:fromObject:withName:", - "_getLocalPoint:", - "_serialNumber", - "setLayoutManager:", - "fileMode", - "_colorForNode:", - "oldBoundsForBox:", - "_cacheRepresentation:stayFocused:", - NULL, - "failedToGetPassword", - "setIsVisible:", - NULL, - "_setModelsReferenceID:", - "_libxml2TreeRepresentation", - "highlightSelectionInClipRect:", - "registerInternalLayers", - "adjustToImageProperties:", - "setParentCrayonRow:", - NULL, - NULL, - "initWithExpression:allowToMany:inScope:", - "loadFiltersFromDirectory:filterArray:", - "extendedAttributesAtPath:error:", - "updatePersonPicture", - "_apply:context:", - "canGrow", - "accessibilityIsSubroleAttributeSettable", - "_filterAllResourcesIfNeeded", - "_getNextResizeEvent", - "stopTrackingWithEvent:", - "tiltX", - "XPath", - "controlShadowColor", - "__contentUpdated:", - "_fileOperation:source:destination:files:", - "gotoPosterTime", - "initiateDrag:", - "provideImageData:bytesPerRow:origin::size::userInfo:", - "nullDescriptor", - "faultHandlerClass", - "_backgroundColor", - "_validateSizes:", - "attributeForName:", - "_endListeningForDeviceStatusChanges", - "fontPanelDidChooseSize:", - "gridStep", - "sharedDocumentPreviewLoader", - "_isEnabled", - "takeFindStringFromView:", - "writeSelectionToPasteboard:types:", - "fontPanelDidChooseCollection:", - NULL, - "stopCurrentTask", - "defaultLanguage", - "_redisplayAfterExpansionChangeFromRow:withOriginalRowCount:", - "physicalSize", - "setContentViewMargins:", - "_rectOfItemAtIndex:", - "editMode", - "shouldShowPreview", - "loadResourceDataNotifyingClient:usingCache:", - "_updateUsageForTextContainer:addingUsedRect:", - "initWithDataFile:lockMode:cardClass:snoop:", - "insertEntry:atIndex:", - "binding", - "setTextureID:", - "_reconfigureSubviews", - NULL, - "_setFetchIndex:", - "registerForDrags", - "multiStatusRequestWithSession:method:path:", - "template", - "_shouldRestartMovementTracking", - NULL, - "ownerDocument", - "stringWithCString:length:", - "emptyRecentPictureWithIcon:", - "accessibilityCurrentEditorForCell:", - "showPreferencesPanelForOwner:", - "_requestTextColor:", - "portForName:", - "whitespaceCharacterSet", - "synchSelectedRows", - "_jobDispositionInPrintSession:printSettings:", - "endUpdate", - "imageWithURL:", - "_forceReplaceItemAtIndex:withItem:", - "frameRectForContentRect:", - "setNextResponder:", - NULL, - "renderResolutionData:toBitmap:width:height:bytesPerRow:", - "_coreUIIsFlippedWithView:", - NULL, - "inputContextWithClient:", - "forceSet", - "applySkinClip", - "browser:createRowsForColumn:inMatrix:", - "mainMenu", - NULL, - "executeFetchRequest:withContext:", - "_akWindowDidResignKey:", - "outlineView:validateDrop:proposedItem:proposedChildIndex:", - "_setObject:forBothSidesOfRelationshipWithKey:", - "startObservingModelObjectTree:", - "_computeFirstMostlyVisibleColumn", - "_callbackHandler", - "pixelFormatCMYK8", - "_visibleTableColumnIndexes", - "hasUnappliedChanges", - "numberOfItemsInImageBrowser:", - "removeExtraBackupsForMinimumTimeInterval:maximumTimeInterval:andUpdateList:", - "setCorrelationToken:", - "viewCIContext", - NULL, - "_selectNextItem", - "_makingFirstResponderForMouseDown", - "setSeparator:", - "_collections", - "_addContentsToDictionary:depth:", - "insertText:", - "compileAndReturnError:", - "_usernameForRealm:URL:", - "isEqual:compareIdentifiers:", - "_invokeActionByKeyForCurrentlySelectedItem", - "_pushTableState", - "errors", - "setSelectionFrom:to:anchor:highlight:", - "setPersistentStoreCoordinator:sourceURL:configuration:metadata:options:", - "addRegularFileWithContents:preferredFilename:", - "_donePoofing", - "mdlog:action:", - "scanUpToString:intoString:", - "_showHideInputWindow:", - "_provideTotalScaleFactorForPrintOperation:", - "calendarDisplayedMonthDateComponents", - "selectInAddressBook:", - "initWithSendPort:receivePort:components:", - "excludesPendingChanges", - "imageFromURL:imageState:options:", - "buildFilterCache", - "setQuickTimeMovie:error:", - "_clockAndCalendarAdvanceMonth:", - "firstChild", - NULL, - "setFieldsIncludedAreCleared:", - "customGroupBox", - "_delegate:handlesKey:", - "_eventIsOn:eventKind:", - "_realCompositeName", - "isReflexive", - "_scrollColumnsRightBy:", - "imageSubtitle", - "ikMouseUp:", - "migrateSpotlightMetadataFiles:", - "morphologyAddROI:destRect:userInfo:", - "createThumbnailFromCGImageRef:", - "setPrimitiveName:", - "_reflectPredicate:", - "isEnabledForSegment:", - "_reflectDocumentViewFrameChange", - "_createQLThumbnailOptions", - "nts_RecursiveContainsGroup:", - "renderInContext:", - "copyImageRepresentationWithFrame:", - "testZoomPerformances", - "getPassword", - "setFilterArray:", - "drawBackgroundWithFrame:inView:characterRange:layoutManager:", - "_shouldSetHighlightToFlag:", - "borderColor", - "_keywordsFromString:", - "zoomButton", - "hidePanel", - "convertRectToBase:", - "_setCursorRect:index:", - "createElementNS::", - "_copyCoreUIDialDrawOptionsWithView:", - "_exitLibXML2ElementNode:tag:startIndex:", - "boundsRectForTextBlock:atIndex:effectiveRange:", - "selectedNodesIncludingDirectories", - "_verticalDistanceForLineScroll", - "_setMaxPK:", - NULL, - "normalizeWhitespace:", - NULL, - "sendAction", - "setFontSize:", - "defaultPlaceholderForBinding:onObjectClass:", - "_commonHandleRootOrCurrentDirectoryChanged", - "_autosaveSubviewLayoutIfNecessary", - NULL, - "_zoomToFitSelection", - "setSelectedCompositionIndexInsideGrid:", - "_selectNextCellKeyStartingAtRow:column:", - "formatSummary", - "_clientsCreatingIfNecessary:", - "_windowExposed:", - "imageBrowser:cellWasDoubleClickedAtIndex:", - "setRepresentedFilename:", - "primaryIdentifierForEntities:", - "_initWithContainerClass:keyPath:propertiesBeingInitialized:", - "createSnapshotImageOfType:", - "_createRef", - "dbCache", - "putData:toPath:withByteRange:andHeaders:", - "URLs", - "_endMyEditingAndRemainFirstResponder", - "yank:", - "preferencesWindowShouldClose", - "_diskCacheTruncate:", - "revertDocumentToSaved:", - "_initRuleEditorShared", - "printFormat:arguments:", - "_setRegisteredForChildNotifications:", - "_encodingCantBeStoredInEightBitCFString", - "_discardPreload", - "setAcceptsColorDrops:", - "stopLoading", - "_ensureSelectedImage", - "_validateDocumentColor:", - "sizeCreditsView", - "addResource:withSize:cost:md5List:count:", - "_updateInlinePreview", - "_lazyLoadQueryDictionariesFromSavedQuery", - "_rangeContainerClassDescription", - "_generateSQLSubstringWildStart:wildEnd:inContext:", - "_parseServicesAvailable:", - "effectForWindow:", - "getDataAtPath:ifModifiedSince:", - "addCertificate:toKeychain:domain:settings:", - "_moveAndResizeEditedCellWithOldFrame:", - "defaultMiterLimit", - "localizedNameForTIFFCompressionType:", - NULL, - "sourceListImageForState:", - "XMLStringSequenceStarted:choiceStarted:appendingToString:", - "bottomCornerRounded", - "stopShowcase:", - "recognizedEvents:", - "ignoresAntialiasThreshold", - "dataBaseChanged:", - "_trackAndModifySelectionWithEvent:onColumn:stopOnReorderGesture:", - "_containerRelativeTitleFrameOfColumn:", - "_selectedCellsInColumn:", - NULL, - "writableTypes", - NULL, - "_newRegisteredSuiteDescriptionForName:", - "_initWithCGLPixelFormatObj:", - "_canDeselect", - "segmentWithIndex:parent:", - "_attachmentSizesRun", - "_handleCurrentBrowsingNodePathChanged", - "_recursivelyPropagateCocoaDirtyRectsForView:toCarbonView:", - "_invalidateCachedRect", - "removeAllAnimations", - "setUid:withDatabase:", - "generateThumbnail:", - "keyDown:", - "IOType", - "tableView:heightOfRow:", - "_lastJobPageNumber", - "__Keynote_NOOP", - "_initWithName:fromPath:forDeviceType:lazy:", - "glyphWithName:", - "_panel", - "selectedMembers", - "_reactToMatchingInsertions:deletions:refreshed:", - "addColorAllowed", - "setToolTipForView:rect:displayDelegate:displayInfo:", - "setIsZoomed:", - "_document:didSave:forScriptCommand:", - "_firstEnabledPart", - "setCurrentBrowsingNodePath:", - "_tpHand", - "rectPreservedDuringLiveResize", - NULL, - "addTextContainer:", - "indexOfObjectIdenticalTo:", - "margin", - "_oldBoundsDuringLiveResize", - "_readRulerIntoRange:fromPasteboard:", - "hasWritablePropertyForKey:", - "importFilter:", - "_close:", - "defaultFlatness", - NULL, - "needToExchangeItems", - "_compareItemViewOrderFor:and:", - NULL, - "commandName", - "_updateHeaderCellControlView", - "initWithIndexes:", - "isCIFilterCompatible:", - "replaceOccurrencesOfString:withString:options:range:", - NULL, - "textLists", - "widthForLayer:edge:", - "baseAffineTransform", - "initWithRequest:delegate:", - "initWithObjCType:count:at:", - "subpathsOfDirectoryAtPath:error:", - NULL, - "handleMigrationError:inManager:", - "autoresizes", - "_unhideSheet", - "_detachFieldEditorFromWindow:", - "_keyboardNavigateToTabByDelta:", - NULL, - "frameShadowColor", - "_displayTemporaryToolTipForView:withString:", - "_entityForExternalName:inConfigurationNamed:", - NULL, - "_indexOfPopupItemForLanguage:", - NULL, - "setPostsBoundsChangedNotifications:", - "colorNameComponent", - NULL, - "setImageLayer:", - "_getArguments:withParameters:", - "carbonDelegate", - "freeCache", - "copyMultiValueWithRecord:withProperty:", - "_getTextColor:backgroundColor:", - "buttonImageForHeightReference", - "doubleForKey:", - "initFragmentShaderIfNeeded", - NULL, - "_stopTearingOff", - "_startUsingDevice:", - "_presentSheetForError:responder:responderCandidate:delegate:callback:callbackContextInfo:", - "descriptionForMethod:", - "hasArtBox", - "glyphGeneratorForTriplet:makeSharable:", - "loadData", - "_objectIDClass", - "initWithData:bytesPerRow:size:format:options:", - "initWithPDFDocument:pageNumber:options:", - "isFetchInProgress", - "_encodeWithoutNameWithCoder:newStyle:", - NULL, - NULL, - "setMainMenu:", - "validateAllMetaDataForceRebuild:", - "closeFile", - "imageProperties", - "uti:conformsToQTType:", - "set", - "allowedFields", - "setupPanel", - "tabView:willSelectTabViewItem:", - "resetCachesForPeople:groups:maintainSelection:", - "_accessibilityPreviousSplitterMaxCoordinate", - "showController:adjustingSize:", - "_selectorName", - "selectedIndexPaths", - NULL, - "movieFormatRepresentation", - "restoreZoomState", - "conditionallySetsEditable", - "setDetailsDisclosed:", - "markupType", - "showNodeInCurrentDirectoryWithDisplayNamePrefix:selectIfEnabled:", - NULL, - "initialKey", - "ruler", - "windowWillBeginSheet:", - "registerForDraggedTypes:", - "_setItemViewer:", - "defaultDecimalNumberHandler", - "_clearSpellingForRange:", - "_allPossibleLabelsToFit", - "_drawsHorizontalGrid", - "_toggleTheater", - "setOpenGLTextureRef:", - "shapeMode", - "_diskCacheExecuteRemoval:", - "registerForEdgeChanges:", - "_setNeedsDisplayInColumnIndexes:includeHeader:", - "titleForIdentifier:", - "boundingRectWithExtraEffectsForState:backgroundStyle:", - "focusImageAtIndexAndRedisplayIfNeeded:", - "setHorizontallyCentered:", - "sourceMetadata", - "statusString", - "crayonToLeftOfCrayon:", - "_web_domainFromHost", - "shouldCloseDocument", - NULL, - "shadowWithLevel:", - "inputImageAtIndexes:", - "owner", - "switchCell", - "setTimeOffset:", - "_setFormats:", - "setFormatter:", - "policyNames", - NULL, - "webArchive", - "_useUserKeyEquivalent", - NULL, - "volatileDomainForName:", - "gatherROI:destRect:", - "_cellIndexesInRect:", - "scaleValue:", - "subresourceForURL:", - NULL, - "convertImagePointToViewPoint:", - "handleSwitchToDirectoriesFrom:animate:", - "objectToken", - "setMenuChangedMessagesEnabled:", - "_getGlyphIndex:forWindowPoint:pinnedPoint:preferredTextView:partialFraction:", - NULL, - "_shouldExecuteDelayedAutocomplete", - "_updateObject:objectIDMap:", - "_serviceList", - "_web_stringByTrimmingWhitespace", - "_currentlyEditing", - "previewSize", - "_isFromSDEF", - "initWithContentRect:styleMask:backing:defer:", - "_nameForCollection:", - "minimumLineHeight", - "_sslClientAuthUsage", - "_proxyUsernameForProxyURL:", - "selectedPageIndex", - "isComputerNode", - "_searchChanged:", - "thumbnailOfSize:forBox:", - "_setHIView:", - "_saveSplitPositionToDefaults", - "rawSQLTextForToManyFaultStatement:stripBindVariables:swapEKPK:", - "keyForProperty:entityName:entityKey:entityWithValueSel:valueWithEntitySel:", - NULL, - "updateCellInside:", - "activateServer:", - "smartInsertAfterStringForString:replacingRange:", - "varianceAddROI:destRect:userInfo:", - "isButtonBordered", - NULL, - "_finalize_QCProvider_CoreGraphics", - "_toolbarAuxiliary:", - NULL, - "_sendDelegateSelectRow:inColumn:", - "_resetTitleBarButtons", - "_updateObservingRegistration:", - NULL, - "_screenRectContainingPoint:", - NULL, - "zoomToFitSelection", - "_rowArrayCache", - "_rawKeyEquivalentModifierMask", - "breakLineAtIndex:", - NULL, - "_evaluateJSString:sourceURL:line:", - "_subEffectsForWindow:itemFrame:transitionWindow:", - "setAutoUpdates:", - "_shouldEditColumn:row:withEvent:", - "deserialize", - "_openableTypes", - "zoomIn:", - "userServer", - "_autovalidateToolbarItem:", - "currentResolvedDirectoryNode", - "_validatedStoredUsageForTextContainerAtIndex:", - NULL, - "writeToFile:withOptions:", - "interfaceVersion", - "removeAllToolTipsForView:withDisplayDelegate:", - "setMember:forKey:", - "initWithElementTypeDescription:", - "_resetRowEntriesToNewFilter", - "gutterOffsetForPageDisplay:", - "valueInAttributeRunsAtIndex:", - "_createOtherValueSetterWithContainerClassID:key:", - NULL, - "_minimumSizeForSearchFieldToolbarItem", - "crayonToRight", - "removeToolTip:", - "nonAllowableCharacters", - "keyFramesCountForTimeLine:", - "zoomInY", - "_isScriptingEnabled", - "autosavingDelay", - "expanded", - "setInputModeID:", - "_clearTypeAhead", - "_init:", - "buttonMask", - "genericCMYKColorSpace", - "indexOfTickMarkAtPoint:", - "addNameToDictionaryRef:", - "speechFinishedSuccessfully", - NULL, - "parser:foundCDATA:", - "newCreateIndexStatementForColumnWithName:inTableWithName:", - "selectedImageBackgroundPiece", - "classForKeyedArchiver", - "finishDecoding", - "scheduledTime", - "uniqueMembersInGroups:", - "setItemSpacing:", - "scriptingMissingValueWithDescriptor:", - "addActualSizeButton", - "saveToURL:ofType:forSaveOperation:error:", - "requestThumbnailOfSize:", - "_willPresentPrintingError:", - "namespaceForPrefix:", - "accessibilityIsVisibleRowsAttributeSettable", - "entityDeclarationForName:", - "nts_SetCachedRecord:forUniqueId:", - "scanHexLongLong:", - "_initWithProperties:", - "CA_copyJSValue:", - "_keyboardNavigateToTabAtIndex:", - "drawFromPoint:toPoint:options:", - "extractElementPath:", - "cycleToNextInputKeyboardLayout:", - "reflectScrolledClipView:", - "personImageView", - NULL, - NULL, - "setPixel:atX:y:", - "removeTimeLine:", - "setDeinterlaceVideo:", - "pathNameForImage", - NULL, - "initWithPersistenceStore:", - "_managedObjectContext", - "objectByApplyingXSLT:arguments:error:", - NULL, - "fileHFSTypeCode", - "visibilityForTimeLine:", - "submenuRepresentedObjects", - "RTFDFileWrapperFromRange:documentAttributes:", - "hasCredentialsForSession:", - "needPostNicestDraw", - "initWithImageManager:", - "noteContentChanged", - "_beginMark", - NULL, - "abdStartedSyncing:", - "shouldBecomeAETEPropertyDeclaration", - "_postNotificationForEvent:notificationName:parent:", - "initWithURL:traverseLink:", - "_isForeignObjectExpression:", - "contextualMenu", - "_isProfileBased", - "__validatePosition:context:", - "getMarkedText:selectedRange:", - "_validatePageNumberView", - "guid", - "_printSessionForGetting", - "ensureLayoutForCharacterRange:", - "_progressForAnimation:start:", - "setNode:isDirectory:displayState:", - "_graphIsInitialized", - "usesMenuFormRepresentationInDisplayMode:", - "initWithKey:type:appleEventCode:isHidden:presentableDescription:name:", - "initWithQueryNode:", - "didFireFault", - "_sideTitlebarWidth:", - "newGroupFromSelection:", - "_archiveToFile:", - "initWithEntity:toOneRelationship:", - "initFromSerializerStream:length:", - "_pageHeaderAndFooterTextAttributes", - "beginSheetForWindow:modalDelegate:didEndSelector:contextInfo:trust:message:", - "initWithFrame:compositions:controller:", - "drawHashMarksAndLabelsInRect:", - "insertText:client:", - NULL, - "propertyTypesForClass:withAddressBook:acquireLock:", - "windowShouldZoom:toFrame:", - "initWithUnsignedShort:", - "handlePreviewTextUpdate", - "initWithCurrentQDPort", - "_nsImage", - "previous", - "predicateWithLeftExpression:rightExpression:customSelector:", - "setOnMouseEntered:", - "itemIndex", - "countryCode", - "initWithDataReference:error:", - "quickTimeSampleDescription", - "_capture:", - "drawLayer:inContext:", - NULL, - "currentSuiteTerminology", - "createThumbnailFromNSFileWrapper:", - "setMiniwindowImage:", - NULL, - "willChangeAttributeForKey:", - NULL, - "addDirNamed:lazy:", - "setFilterPredicate:", - "glyphInfoWithGlyph:forFont:baseString:", - "_atStartOfTextTableRow:atIndex:", - NULL, - "namespace", - "_verifyQuotesAndParenthesesForRange:", - NULL, - "dataForPPI:", - "tabViewItems", - "showNextDocument:", - NULL, - "deactivateMenuItemsInMenu:", - "valueForInputKey:", - "remoteContextWithOptions:", - "_setAnimateColumnScrollingForAnyEvent:", - "documentWasUnlocked:", - "_integerValue", - "_doUnhideWithoutActivation", - "_customizesAlwaysOnClickAndDrag", - "_cfCapitalize:", - "removeNode:", - "argumentsForIvarPortWithKey:", - "setCGImageSource:", - "_indexOfChosenIdentity", - "substringToIndex:", - "_verticalScrollerClass", - "listResources", - "setIgnoreReloadData:", - "_checkRequestForStore:originalRequest:andOptimisticLocking:", - "connectionUnit", - "setUsesEPSOnResolutionMismatch:", - "_initWithName:printer:", - "certificatesFromPemData:certs:", - "numberOfColorStops", - "replaceCharactersInRange:withCharacters:length:", - NULL, - "getPeriodicDelay:interval:", - "keyFramesCount", - "backgroundLayoutEnabled", - NULL, - "_cacheTitleForURL:", - "_uniqueConnectionKey", - "typeInMedia", - "containsIndexes:", - "thumbnailsDidChange", - "_addInputPortWithClass:forKey:attributes:", - "setNeverPurgeHint:", - "preferredFrameSize", - "enoiseROI:forRect:userInfo:", - "isAuthorityCertificate", - "_dismissWithCode:", - "setLayoutType:animate:", - NULL, - "_maxXminYResizeRect", - "autoreverses", - "copyDeep", - NULL, - "_newConflictRecordForObject:originalRow:newRow:", - "_minimizeAll", - "selectRow:byExtendingSelection:", - NULL, - NULL, - NULL, - NULL, - "growGlyphCaches:fillGlyphInfo:", - "rangeForUserParagraphAttributeChange", - "replaceFile:path:", - "_drawLabelHighlightIfNecessaryWithFrame:inView:fullHighlight:", - "setDisplaysAnnotations:", - "doDrawInContext:rect:", - "_scrollFieldEditorToVisible:", - "tiltY", - "abortImportCells", - NULL, - "setBottomBorderColor:", - "_predicateForMessagingAddressService:comparison:value:label:", - "setCurrListName:", - "_encodeArrayOfObjects:forKey:", - "_renderState", - NULL, - "encodeConditionalObject:", - "goForward:", - "IDX", - "indexesOfString:", - "_unionOfSetsForKeyPath:", - "calendarFormat", - "_setDefaultButtonPaused:", - "imageWithSize:", - "_audioCompleted2", - "_cfTypeID", - "_updateTrustValidity", - "_valueByTranslatingOSAErrorRangeDescriptor:toType:inSuite:", - "initJava1", - "scriptingColorDescriptor", - NULL, - "_layoutUpdated", - NULL, - "_setContextMenuHighlightColorForRow:", - "postFocusChangeEventToQueue:", - NULL, - "_validItemViewerBounds", - NULL, - "relativePath", - NULL, - "_PFMOClassFactoryData", - "_setNeedsHighlightedTextHint:", - "_lastTableRow", - "_setFitToScreen:animate:", - "enclosedSubscriptionGroupsForAllGroup:", - "_clockAndCalendarKeyDown:inRect:ofView:", - NULL, - "initWithValues:count:", - NULL, - "fileOwnerAccountID", - "forgetSnapshotsForGlobalIDs:", - "convertSizeFromBase:", - "responseList", - "_scriptingDescriptorOfListType:orReasonWhyNot:", - "countOfIndexesInRange:", - "_resizeContentsOfMainBox", - "setImageFromPath:", - "buttonRectangleForResolutionData:", - "inspectorForPatch:", - "_minYTitlebarButtonsOffset", - "addDocumentIconButton", - "frameColor", - "hashGrow", - "relationshipNamed:", - "setIntegerValue:", - "setCurveHullsEnabled:", - "_URLForString:", - "worksWhenModal", - "_document:didPrint:inContext:", - NULL, - "_updateEnabledStateForSubviews", - "focusedView", - "_getEightBitRGBMeshedBitmap:rowBytes:extraSample:reverseScanLines:removeAlpha:", - "phoneNumbers", - NULL, - "_generateSQLForFetchExpression:allowToMany:inContext:", - "documentRef", - "_willDeleteNodeOutputPort:", - "font", - "_feContext", - "_colorRect", - "borderRect", - "model", - "smartGroupPropertyTypes", - "_initWithLibTidyDoc:child:encoding:", - "_setButtonImageSource:", - "setSuspended:", - "canDragRowsWithIndexes:atPoint:", - "_NSNibPathForUIItemIdentifier:", - "_closeAndDeleteFileAsync", - "newWithFilterInfo:upperItem:", - "observingBinder", - "beginLocalContext", - "indexMenuBarDynamically", - "subpredicates", - "_rightGroupRect", - "_scalesBackgroundHorizontally", - "isEqualFunction", - "_updateCellForDatePreferencesChange:", - "_isBooleanTransformer", - "lockForThreadedOperation", - "displaysEnabledAtRow:", - "tableView:nextTypeSelectMatchFromRow:toRow:forString:", - "processKeyword:option:keyTran:arg:argTran:", - "outlineView:draggedImage:movedTo:", - "_windowTitlebarButtonSpacingWidth:", - "_cheapItemAtRow:", - "flushAllCaches", - "undo:", - "_shouldCopyItemAtPath:toPath:", - NULL, - "_nameWithLooseRequiredExtensionCheck:", - "nts_RecordFromDictionaryRepresentation:withRecordMapping:addressBook:generateIds:", - "_backingCGSFont", - "_cancelAllUserAttentionRequests", - "_menuForNote:", - "getFilterFromFilterArray:", - "arrangeInFront:", - "setEra:", - "setTableView:", - "_isRowHeaderColumn:", - "highestMipmapItemIndex", - "deserializer", - "_maxYmaxXResizeRect", - "_coreUILinearBarIsFocused:", - "beginTrailer", - "_elementAttributeRelationship", - "_createPatternFromRect:", - "_defaultInformation", - "_alternateAutoExpandImageForOutlineCell:inRow:withFrame:", - "outlineView:didClickOnDisabledCell:forTableColumn:byItem:", - NULL, - NULL, - "_constructRequestForURL:isHead:", - NULL, - "removeChild:", - "birthRate", - "fullscreenStatus", - "isHidden", - "modifierFlags", - "questionMarkImage", - "showToolbar:", - "removeAppleUseCoreUIObject:", - "_setErrorExpectedType:", - "_blockHeartBeat:", - "setPriority:forFlavor:", - "setOutputTraced:", - "preferredLocalizationsFromArray:forPreferences:", - "_attachedCell", - "_dropHighlightColorForRow:", - "_updateAllLayerPropertiesFromView", - "previewViewClassForPreviewType:", - "_takeValuesFromTextBlock:", - "_getRowHeaderFixedContentRect:rowHeaderScrollableContentVisibleRect:", - NULL, - "movieWithTimeRange:error:", - "baseURLForDocument:", - "_presentError:delegate:didRecoverSelector:context:", - "isEqualToTimeZone:", - "_offsetRelationshipIndex:fromSuperEntity:andIsToMany:", - "_drawTextFieldWithStepperWithFrame:inView:", - "findString:", - NULL, - "proxyPortClass", - "invalidateLayout", - "attributeExists:withValue:", - NULL, - "_computeHeightOfTop:bottom:", - "stringsFromGUIDs:", - "accessibilityIsPositionAttributeSettable", - "lockObjectStore", - "registerNode:withName:", - "setDefaultValue:", - "minFrameSize", - "_colorSelected:", - "_increaseContainerReferenceCounter", - "pointerID", - "killHUD", - "_writeParagraphStyle:", - "textView:didHandleEvent:", - "valueClass:", - "commitTransaction", - "setMax:", - "_showTextColorImmediatelyInObject:mode:", - "pageRange", - "_setWindowTag", - "_blueControlTintColor", - "initWithNode:", - "clearSearchField:", - "appendBytes:length:", - NULL, - "binders", - "_setDrawingToHeartBeatWindow:", - "restoreCustomInputPortStates:fromState:", - "handleDelegateChangedSelection", - "setSelected:forSegment:", - "isEmpty", - "importFinished", - "getName", - "_documentWindow", - "setIndentationLevel:", - "_addEffects:", - "initWithDomainName:key:title:image:", - "fillAttributesCache", - "_aetePropertyDescriptions", - "_wsmIconInitFor:", - "setUsesUserKeyEquivalents:", - "updateQueryNode:", - "_scriptTerminologyNameOrNames", - "requestWithSession:method:path:", - "renderRoundedRect:radius:strokeColor:fillColor:mode:lineWidth:", - "invalidateDisplayedMembersListAndNotify:", - "fixKeyViews", - "_selectCrayon:updateSelection:", - "performAction:", - "enclosedAreaBounds:", - "layoutRectForTextBlock:atIndex:effectiveRange:", - "availableMembersOfFontFamily:", - NULL, - "stringForObjectValue:", - "allowsIdentitySelection", - "labelRectOfRow:", - "status", - "accessibilityVisibleCharacterRange", - "subscribedPeopleCount", - "documentURL", - "_buttonCellAccessibilityRoleAttribute", - "_restoreSplitPositionFromDefaults", - "drawWithFrame:inView:characterIndex:layoutManager:", - "_selectItems:inIndexSet:", - NULL, - "addDefaultTable", - "_overlayColorForNode:view:", - "_DTDString", - "_postRowCountChangedNotificationOfType:indexes:", - "countOfInputRampParams", - "accessibilityParentAttribute", - "prepareUpdateStatementWithRow:originalRow:", - "len", - "_moveUpAndModifySelection:", - "_removeObject:", - "setInitialFirstResponder:", - "launchApplication:", - "slideshowExportToiPhoto:", - "_web_fixedCarbonPOSIXPath", - "setAudioChannelLayout:error:", - "unbind:", - "setObjectZone:", - NULL, - NULL, - "pullsDown", - "autoscrollWithLocalPoint:", - "_coreUIBackgroundDrawOptionsForSegment:withView:", - "keyPathsForValuesAffectingValues", - "objectInInputExtentAtIndex:", - "_allowsSizeMode:", - "needsPageControl", - "setFrameRate:", - "setScreenRect:", - "_saveCurrentPanelState:", - "_initCurrentThread", - "__saveIfReallyEditedWithDelegate:didSaveSelector:contextInfo:", - "cacheCurrentDBStatementOn:", - "prefersTrackingUntilMouseUp", - "application:openFileWithoutUI:", - "setSlideshowIndexHandler:", - "keyPath", - "setObject:forKey:inDomain:", - "makeDocumentWithContentsOfURL:ofType:", - "fetchWithRequest:merge:error:", - "_coreCursorType", - "addFieldsToDictionaryRef:", - "pixelType", - "setReleasedWhenClosed:", - "_currentListLevel", - "initWithFileName:markerName:", - "copyDebugDescription", - "modificationDateYearless", - "toolbarButton", - "ID", - "searchResult", - NULL, - "_drawRelevancyWithFrame:inView:", - "_expandRep:", - "_presentDiscardEditingAlertPanelWithError:relatedToBinding:", - "countForObject:", - NULL, - "_attributedLabelsFromStringLabels:", - "initWithContentsOfFile:usedEncoding:error:", - NULL, - "_dotMacAccountPasswordFromSystem", - "_glyphForFont:baseString:", - "setOutlookWebAccessServer:", - "_getRequestPostHandler:", - "_crackSize:", - "_sortedEntitiesForConfiguration:", - "nickname", - "setAlphaValue:", - "imageValue", - NULL, - "boundsForNode:", - "_range:containsPoint:", - "_calcWidthsWithMargin:operation:", - "setPurgeable:", - "addConnection:error:", - "_updateCommandDisplayWithRecognizer", - "undoManagerForWindow:", - NULL, - "setForcedContentTypeUTI:", - "_removeSubscriptionConfirmSheetDidEnd:returnCode:contextInfo:", - "_noteKeyValuePairChangedKey:", - "_needsDisplayInRect:", - "writeProfilingDataToPath:", - "_fullCount", - "_postQueryFinishedNotification", - "usedRectForTextContainer:", - "_setDrawsBackground:", - "insertObject:at:", - "menuBarHeight", - "initWithSuiteName:className:dictionary:", - "initWithSearchSliceType:attributeName:", - "implementsSelector:", - "_glyphAttributesFromEventRef:forString:", - "setObscured:", - "_presentableDescription", - "setScrollYEnabled:", - "initWithTextBlock:layoutRect:boundsRect:", - "_cachedGlobalWindowNum", - NULL, - "frameImageAtTime:", - "_cgsEventRecord", - "runModalOpenPanel:forTypes:", - "sortWithSortDescriptors:recursively:", - "_parseCharacterAttributesFromElement:attributes:", - "_collectResourcesForAge", - "requestWithURL:", - "titlebarRect", - "stopUpdateInsertionAnimation", - "_finishedMakingConnections", - "shouldPropagateDeleteForObject:inEditingContext:forRelationshipKey:", - "_fontWithNumber:size:bold:italic:", - NULL, - "setToolTip:forCell:", - "setString:", - "lockButton", - NULL, - "setOverlay:forType:", - "_nextTrackingNum", - "canIgnorePopulatingObject:", - "shadowRadius", - "_findRowObject:startingAtObject:withIndex:", - "_mappedFile", - "popupFrameForAnnotation:", - "initForURL:withContentsOfURL:ofType:error:", - "_invalidateDisplayForMarkedOrSelectedRange", - "popUpContextMenu:withEvent:forView:", - "converterForDatabaseAtPath:", - "setUpGState", - "byValue", - NULL, - "_layoutTreeDescription", - NULL, - "_hiddenTableColumnsAutoSaveName", - "allowsKeyedCoding", - "carbonNotificationProc", - "_initializePredefinedEntities", - "restoreRecord:intoGroup:options:", - "_getColumn:row:cell:cellFrame:toolTipRect:wantsToolTip:wantsRevealover:atPoint:", - "request", - NULL, - "_initWithDIB:", - "_labelColor", - "setResizable:", - "passwordForUser:", - "thumbnailOperationGotThumbnailImage:", - "adjustHalftonePhase", - "_setNeedsRecalc", - "_flashSelectedPopUpItem", - "notActiveWindowFrameHighlightColor", - "flushPDFWindow", - "lockInfo", - NULL, - "usableParts", - "_accessibilityArrowScreenRect:", - "connect", - "_sortNodesForSave:", - "governingAlias", - "addItemWithTitle:", - "setSampleSize:", - "_createAttributeDescriptionForNode:", - "removeTextLayer", - "sendInv", - "_performUserAction:forEvent:", - "_copyForCurrentOperation", - "ISS__ay_postNotification:inThread:", - "setInsertionClassDescription:", - "displayNameForVNodeAtPath:", - "_imageLevel_setBackgroundColor:", - "selectedTabTextColor", - "_getBrowser:browserColumn:", - "deltaZ", - NULL, - "unarchiverWillFinish:", - "arrayForKey:", - NULL, - "setMipmapSize:", - "sendsWholeSearchString", - "representation", - "dragPromisedFilesOfTypes:fromRect:source:slideBack:event:", - "addedGroups:", - "indexAtPosition:", - "scheduledRedisplay:", - "_getGlyphIndex:characterIndex:forWindowPoint:pinnedPoint:anchorPoint:useAnchorPoint:preferredTextView:partialFraction:", - "drawBackgroundForBlock:withFrame:inView:characterRange:layoutManager:", - NULL, - "parseCharDef:", - NULL, - "displayBox", - "invTransformRect:", - "_openChannel", - "_old_initWithCoder_NSComboBoxCell:", - "_exposeBinding:valueClass:", - "_fileUnlock", - "stopLiveSession", - "startObservingModelObjectsAtReferenceIndexes:", - "_delegate", - "_determineGridParametersFromItemPrototype", - "_resumeExecutionWithResult:", - "addEffects:", - "_shouldShowCellExpansionForRow:column:", - "isWithinTimePeriodComparison:forProperty:", - "_activateOverlayControls", - "_finalize_QCConverter_YUV422", - "_shouldRequireAutoCollapseOutlineAfterDropsDefault", - "_pixelFormatAuxiliary", - "_setDragAndDropCharRanges:", - "propertyForRollOverIdentifier:", - "runThreadWithSelector:argument:", - "initWithPerson:imageData:largeImageData:clippingRect:addressBook:", - "applyPasteCallback:layer:", - "ISS_stringByURLUnquoting", - "_cleanUp:", - "setRootPath:", - "_transformerRegistry", - "setSelectionDictionary:", - NULL, - "__oldnf_deleteAllCharactersFromSet:", - "_fetchAllRanges", - "forwardingTargetForSelector:", - "runModalSavePanel:withAccessoryView:", - "addItem:", - "collectionBehavior", - "_folderThread:", - "initPropFindWithSession:withDepth:path:lookingForProps:", - "imageDidChange:imageState:image:", - "colorSpaceModel", - "_queryCanSelectItem:displayValue:inRow:", - "layoutManagerOwnsFirstResponderInWindow:", - "viewDidUnhide", - "valueClass", - "currentThreadDisplayOperationStack", - "_scriptingTextDescriptor", - "typeOfProperty:", - "_web_guessedMIMETypeForXML", - "stringByExpandingTildeInPath", - "_broadcasterThread:", - NULL, - "initWithRole:parent:rect:propertyPath:range:", - "_ql_allowsFileAccessForPreview:", - "scaleTransform", - "filterNamesInCategory:", - "_notifyView_DidSetAllCurrentItems:", - "_delegate_nextTypeSelectMatchFromIndex:toIndex:forString:", - "endFrame", - "sendMouseUpActionForDisabledCell:atRow:column:", - "sourceAttributeName", - "getProperty::", - "isViewOfPickerLoaded:", - "forgetSnapshotForGlobalID:", - "orderedState", - "lineNumber", - "isLayerTreeHost", - "newFetchedArray", - "blackDeviceColor", - "setSegmentedBufferAddress:", - "_nodeBecomesFirstResponder:", - "windowDidResignKey:", - "showsOutlineCell", - "decodeInt32ForKey:", - "clampedBounds", - "_batchOrdering", - "handleEvent:callRef:", - "_isAppSmartFolderNode:", - "bufferPixelsHigh", - "_determineResizingOptionsVertical:horizontal:", - "filesystemItemLinkOperation:shouldLinkItemAtPath:toPath:", - "openGLTextureID", - "deserializeData:", - NULL, - "setSavePanel:", - "fireWillSelectComposition:", - "vCardRepresentation", - "popupViewMoveToFront:", - "cancelPendingLookups", - "setRelativePosition:", - "_showTooltipWithText:", - "_setVariableColumn:", - NULL, - "pushSubnode:recalcPointers:", - "updateUI:", - "isRowSelected:", - "_setPreviewController:", - "indexSheetDidDeactivate:", - "_isMultiMode", - "predefinedNamespaceForPrefix:", - "adobeRGB1998ColorSpace", - "_resetDefaultButtonCycleValue", - "cacheResolutionInfoForResolution:", - "extraGroupsCount", - "_canModifyManagedContent", - "numberWithDouble:", - "initWithData:options:documentAttributes:error:", - "imageTypes", - "setNeedsUpdate:", - "viewedDateForPerson:", - NULL, - "userFixedPitchFontOfSize:", - "subscribedPeople", - "lockedObjects", - "selectionFromPointToBottom:", - "setRange:", - "initWithName:appleEventCode:objcClassName:isHidden:", - "getFontFromAppearanceString:", - "initWithLDAPManager:forServer:sessionUID:", - "_expandableAttributedString:", - "_preeffectBaseImage:state:backgroundStyle:", - "certificate", - "setTime:forKeyFrame:controlType:", - "setFieldName:", - "setMenu:forSegment:", - "initRelockWithURL:lockToken:", - "_chainNewError:toOriginalErrorDoublePointer:", - "_startLoadingPreview:timeoutDate:", - "imageData", - "patchAttributesWithName:", - "recalcOutline:forResolutionData:", - "portMinValue", - "usedSize", - "_checkForObsoleteDelegateMethodsInObject:", - "_autosavingBehavior", - "writeExpansion:", - "awaitReturnValues", - "hasMemberInPlane:", - "isValidInPreviewMode:", - "insertSublayer:above:", - "cacheUsedByJpegData", - "metadata", - "setIntercellSpacing:", - "goBack", - "_closeInputPalette", - "_setAutoscalesBoundsToPixelUnits:", - "_computeMinWidthForSimpleSavePanel:", - "_akWindowDidBecomeKey:", - "runningWithinInterfaceBuilder", - "_performDragFromMouseDown:inColumn:", - "_updateObservingForAutomaticallyRearrangingObjects", - "removePointerAtIndex:", - "_printOperation:wasRunWithSuccess:inContext:", - NULL, - NULL, - "relockRequestWithSession:URI:lockToken:duration:", - "setColorComponents:withColor:", - "ignoreTypos", - "_resetTrackingRect", - "compositionPickerView:didSelectComposition:", - "outlineView:numberOfChildrenOfItem:", - NULL, - "renderMode", - "initWithCFHTTPCookie:", - "_isDrawingMultiClippedContentColumn:", - "decodeDataObject", - "_iDiskSessionWithAccount:host:port:scheme:", - "sizeForDisplayingAttributedString:", - NULL, - "setMaximumThreadCount:", - "helpLinkDidFinishPopulating:", - "_windowChangedKeyState", - "convertSize:toView:", - "setLastUpdatedDefaultKey:", - "_restoreTornOffMenus", - "_blockRangeForCharRange:", - "setSelectionColor:", - "_keyEquivalentModifierMaskMatchesModifierFlags:", - "resetParameterView:", - "currentRamBindedRange", - "setSizeWithoutSavingContent:", - "selectedRowEnumerator", - "_initAnimationForGroup:expand:", - NULL, - "initWithSlideshowEngine:dataSourceIndex:subIndex:", - "browser:titleOfColumn:", - "firstLineParagraphStyle", - "setPrebindingMode:", - "defaultDateFormatter", - "firstRectForCharacterRange:", - "registeredChildrenPaths", - "_removeInputForKey:", - "setRemovedOnCompletion:", - "_wantsToolTipAtColumn:row:", - "ICCProfileData", - "URLAtIndex:effectiveRange:", - "lineScroll", - "appendGRLs:", - "marked", - "mediaWithQuickTimeMedia:error:", - "sensibility", - "_selectedSlices", - "objectEnumerator", - "incrementRefCountForObjectID:", - "setValue:atIndex:", - "initWithPageRef:", - NULL, - "srRecognizer", - "_cleanup", - "raise:format:", - "_addBindVarForConstVal2:", - "initWithWindowNibName:", - "setDirect:", - "cell:needFinalDataForKey:", - "uppercaseLetterCharacterSet", - "removeObjectFromMasterArrayRelationshipAtIndex:selectionMode:", - "isPaneSplitter", - "_CFCachedURLResponse", - "ourPanelWillClose:", - NULL, - "appendDisplayedNode:identifier:title:displaysChildren:", - "drawForPage:withBox:active:inContext:", - "_enumeratedArgumentBindings:", - "_coreUIFocusStyleWithView:", - "samplesPerPixel", - "_parseGlobals", - "updateInputContexts", - "subCacheSizeIndex", - "_focusing", - "_storeNextReferenceInMetadata", - "_web_stringByCollapsingNonPrintingCharacters", - "weekday", - "_newPropertiesForRetainedTypes:andCopiedTypes:preserveFaults:", - "setGridStep:", - "setSelectedSegment:", - "timeZoneWithName:data:", - NULL, - "parseTokenWithMask:", - NULL, - "_loadViewIfNecessary", - "_web_domainMatches:", - "selectThumbnailAtIndex:", - "streamAtIndex:", - "stringWithSavedFrame", - "slotForKey:", - "setWorksWhenModal:", - "getXMLAttributeValueFromObject:forAttribute:", - "_rowHeaderShadowSurfaceBounds", - "_volumeIsEjectableForRefNum:", - "showUI", - "_processRecentChanges:", - "isaForAutonotifying", - "_viewsArray", - "nts_Touch", - "focusedColumn", - "childGlyphStorageWithCharacterRange:", - "_obtainKeyFocus", - "initWithType:itemIdentifier:", - "__escapeString5991", - "rectValue", - NULL, - NULL, - "_pixelBufferAuxiliary", - "setTemporaryAttributes:forCharacterRange:", - "blackComponent", - "_prepareToMessageClients", - "indentationPerLevel", - "_rulerAccViewSpacingAction:", - "point:inNameRange:", - "_standardEffectsForImageWithCocoaName:state:backgroundStyle:startingWithBaseArt:", - "_ensureRangeCapacity:", - NULL, - "_registerDynamicToolTipManagerInstance:", - "setPanelController:", - "_needsToUseHeartBeatWindow", - "dragSelectionWithEvent:", - "trackMouse:inRect:ofView:atCharacterIndex:untilMouseUp:", - "_clipViewAncestor", - "_sendDelegateShouldShowCellExpansionForColumn:row:", - NULL, - "swapOldImage:oldState:newImage:newState:", - "_doRemoveFromSuperviewWithOutNeedingDisplay:", - "_didCreateFile", - "initWithRect:color:ofView:", - "_rowContainsLeaf:", - "_registerSuiteDescriptions:", - "initWithDictionary:", - "_appWillTerminate:", - "_recursiveEnableTrackingRectsForNonHiddenViews", - "_setBatchingParams", - NULL, - "deviceDescription", - "processRequests:", - "registerChannel:", - "markerLocation", - "_restoreDefaultSettingsForOpenMode", - "setPositivePrefix:", - "textContainerForGlyphAtIndex:effectiveRange:withoutAdditionalLayout:", - "initWithInputController:andField:", - "defaultClientID", - "colorFromAppearanceTokens:", - "_drawBadgeLabel", - "invalidateConnectionsAsNecessary:", - "initWithContentsOfURL:options:error:", - "initWithData:type:size:", - "childrenKeyPath", - "movieShouldTask:", - "_needsToResetDragMargins", - "_extendNextScrollRelativeToCurrentPosition", - "_enclosingBrowser", - "_recursiveAllKeys", - "setParentNode:", - "_createSubgraphFromSelection:", - "setTimeStyle:", - NULL, - "_web_changeFileAttributes_nowarn:atPath:", - "pipe", - "attributedSubstringFromRange:", - "scaleFactorChanged", - "canInitWithPasteboard:", - "setPreloadingURL:", - "removeListSheetDidEnd:returnCode:context:", - "archiveRootObject:toFile:", - "_cancelKey:", - "enlargedBounds:withXOffset:andCount:", - "_setLevelForAllDrawers", - "pasteboardByFilteringData:ofType:", - "mouseInHUD", - "isExpandedNode:", - "_validate", - "drawsShadows", - "_showKeyboardUILoop", - "_tryLockViewHierarchyForModification", - "_processKeyboardUIKey:", - "isNodeRegisteredWithName:", - "shouldUnmount:", - "dependenciesList", - "_setForcesLeadingZeroes:", - "_skipsSynchronizationForEditingTextView:", - "_docController:shouldTerminate:", - "_updateInfo:", - "keywordColors", - "validateItem:", - "enumerator", - "_setNumVisibleSwatchRows:", - "itemChanged:", - "_drawImageFrameAtIndex:animationValue:alpha:", - "cellsRenderedIndexes", - NULL, - "_setPreHandler:andTargetObject:", - "superClass", - "setSelectedIndexes:", - NULL, - "columnResizeButtonImage", - "cachedImageForEmail:", - "itemRolledOver", - "setLocalizationFromDefaults", - "resizeIncrements", - NULL, - "_substituteEntityAndProperty:inString:", - "fileOperationCompleted:ok:", - "_setEncipherOnlyUsage:", - "imagingModeResetting", - "putData:toPath:withHeaders:rangeStart:rangeEnd:", - "windingRule", - "_clearLiveResizeColumnLayoutInfo", - "hasObjectValue", - "_setToolbarView:", - "initWithDir:nodeRef:nodeName:", - "drawerShouldOpen:", - "_web_preferredLanguageCode", - "collectResources", - "setDatabase:", - "compositions", - "numberOfLights", - "_fontDescriptor", - "descriptor", - "filenameWithOriginalFilename:", - "_baseWritingDirection", - "_endMyEditing", - "_chooseSizeFromList:", - "setDefaultMessage:", - "servicePortWithName:", - "showRGBView:", - "publishWithOptions:", - "itemHeight", - "setTempTintAtPoint:", - "layerForImage", - "_databaseContextState", - "colorList", - "copyCachedInstance", - "_shouldBeTreatedAsInkEventInInactiveWindow:", - "setUpdatedCompositionValue:forKey:", - "_providerTransformationForImage:inBounds:toTextureWithTarget:maxSize:outBounds:", - "addedToGroup", - "_updatePlaceholdersForBindingInfo:", - "_posterForMovie:", - "_beginSpeakingString:optionallyToURL:", - "_delegateRespondsToSelectCellsByRow", - "expandedGridFrame", - "_forceFlushWindowToScreen", - "encodeInt:forKey:", - "backupInfoForBackupAtPath:", - "slideshowWasStartedWithStartRect", - "deserializeNewObject", - "_setItemIdentifier:", - "accessibilityFrontmostAttribute", - "_markSelectionIsChanging", - "clientID", - "sendDoubleAction", - "_certAuthorityKeySize", - "setRotationAngle:centerPoint:", - "_visibleRectOfColumns", - "decodeDownloadHeader", - "_attachToSupermenuView:", - "removeColorAllowed", - "_insertMissingSubviewLayers", - "_doImageDragUsingRowsWithIndexes:event:pasteboard:source:slideBack:", - "initWithContentsOfFile:options:error:", - "_noteNewRecentDocumentURL:forKey:", - "elementWithEffectName:", - "emissionLongitude", - "_addedTab:atIndex:", - "runModalForTypes:", - "_isTextured", - "_willPopUpNotification:", - NULL, - "_simultaneousSegmentAndLabelTrackingWithEvent:forSegmentAtIndex:withLabelRect:", - "drawEffectGizmo", - "_popUpButtonCellInstances", - "resetDisplayDisableCount", - "_savedVisibleFrame", - "createMinimalSharedContextWithAdditionalAttributes:recycleWhenDone:", - "setVolatileRepresentation:", - "recordsForUIDs:", - "clickedRow", - "_rowEntryForItem:requiredRowEntryLoadMask:", - NULL, - "descriptionWithCalendarFormat:", - "doDoubleClick:", - "setShadowState:", - "fileGroupOwnerAccountID", - NULL, - "compare:", - "_cancelClicked:", - "groups", - "_emptyMatrix:", - "handleSwitchToCardOnlyFrom:animate:", - "precomposedStringWithCanonicalMapping", - "pixelFormatsWithCompatibility:", - "addEntity:index:", - "getLastHoleStart:len:", - "_addDeclaredKey:", - "_deselectColumn:", - "_setupSegmentSwitchForControl:firstImage:secondImage:thirdImage:action:showDropDown:", - "_cancelRequest:", - "topBorderColor", - "willRemoveFromPersistentStoreCoordinator:", - NULL, - "_processDocument", - NULL, - "ensureLayoutForTextContainer:", - "_blackRGBColor", - "_collectResourcesForSize", - "setMandatoryClient:", - "nextStringInEncoding:quotedPrintable:stopTokens:trim:", - "animateToEncloseElements", - "_getNewIDForObject:", - "_scriptingRealWithDescriptor:", - "property", - "colorWithCalibratedWhite:alpha:", - "imageBorderFrame", - "_parseParagraphAttributes1", - "reallyRemoveObjectAtIndex:", - "lastCrayon", - "_removeBlankLines", - "_updateButtons", - "execute:", - "_updateDocumentMetadata", - "_sizeWindowForPicker:", - "setTypesetter:", - "isDrawingFindIndicator", - "keyBindingState", - NULL, - "brownColor", - "drawWithCGImage", - "setLockedObjects:", - "_setNextToolbarDisplayMode:", - "addPolicy:", - "resetGroupAndPeopleFromDefaults", - "dataRef", - "isIndeterminate", - "initPostWithSession:path:data:", - "_setData:encoding:", - "doHorizontalBoxPass:xOffset:count:factor:sums:", - "tableView:shouldEditOnSingleClick:inRow:tableColumn:", - "_insertionGlyphIndexForDrag:", - "updateReferenceIndexesToReflectRemovalAtIndex:", - "_createImageForLockFocusUseIfNecessary", - "didLoadBytes:loadComplete:", - "isMarkupAnnotation", - "handleValidationError:description:inEditor:errorUserInterfaceHandled:", - "replaceValueAtIndex:withValue:", - "groupsController:outlineView:numberOfChildrenOfItem:", - "clearAsMainCarbonMenuBar", - "doPerformResource:", - "startContainer", - "objectAtIndex:", - "_reflectSize", - "_truncatedAlwaysTrustCertString:forHostOrEmail:", - "castObject:toType:", - "_lockForAllThreads", - "setPosition:", - "rowTypeForRow:", - "registerViewNotifications", - "initWithEntity:insertIntoManagedObjectContext:", - "initWithSelector:target:", - "_pathLengthPresent", - NULL, - "updateMagnifying:", - "beginDocumentWithTitle:", - NULL, - "panAngle", - "isOpen", - "_changeEditable:", - "varietyCharSet:", - "setValidatesImmediately:", - "autoconfigureWithProtocol:", - "_canDeselect:", - "_mapTime:repeatIndex:", - "initMkpathWithSession:URI:token:", - "_setTextAttributeParaStyleNeedsRecalc", - "scriptingEndsWith:", - "_toggleTypographyPanel", - "parseData:", - "referenceWillDie", - "initWithCGLSContext:pixelFormat:", - "_setNeedsDisplayForFirstResponderChange", - "_fetchedIndexes", - NULL, - "_cornerViewHidesWithVerticalScroller", - "validationPredicates", - "wantsNotificationForMarkedText", - "_issuePropFindAtPath:withDepth:lookingForProps:", - "shapeHeight", - "browser:shouldSizeColumn:forUserResize:toWidth:", - "updateSearchView", - "animations", - "_attemptToPerformClickOnFocusedColumn", - "handleMouseEvent:callRef:", - "textStorage", - "isVisible", - "_checkDataSource", - "_readCAConfigFileFullPath:trustRefOnErr:identityNameInfo:subjAltNameExtObj:keyUsageExtObj:keyPairAttrsObj:certInfoObj:basicConstrExtObj:extKeyUsageExtObj:additionalCertInfoObj:caWebSite:caPemData:caPubKeyHash:", - "_inputManagerInNextScript:", - "_tightenResizables:intoGivenWidth:", - "_updatedParameters:", - "highlightedMenuTextColor", - "fxPickerDidValidate:", - "willStartClosingTransition", - "_allowsDuplicateItems", - "animates", - "pictureTakerView", - "startCapture", - NULL, - "_menuItemViewer", - "createRepresentationOfType:forManager:withOptions:", - "sizeValue", - "setAvailableVideoPreviewConnections:", - "_drawContents:faceColor:textColor:inView:", - "credentialsForProtectionSpace:", - "initWithContainerClassID:key:implementation:selector:extraArguments:count:", - "_keyboardNavigateDoSelectOfFocusItem:", - "setIndex:ofObject:", - "signUpURL", - NULL, - "removeAllDependentTextures", - NULL, - "pane", - "needsPlayControl", - "addServer:", - "createOptimizedProviderWithTransformation:cropping:", - "attributeAtIndex:", - "transportType", - "greenReconstruction:edges:phase:scale1:scale2:decisions:votedDecisions:image:decisionImage:votingImage:", - "accessibilityTitleUIElementAttribute", - "preferencesContentSize", - "autosizesAndCenters", - "initWithType:arg:", - "types", - "dataReferenceEnumeratorWithQTMedia:", - "serializeList:", - "membersAndSubgroups", - "_setUseBasicAuth:", - "_appendAttachment:atIndex:toString:", - "setTargetIconSize:", - "_segmentedMenuDragSlopRect", - "_beforeDrawCell:atRow:col:clipRect:", - "_invokeSingleSelector:withArguments:onKeyPath:", - "connection:shouldMakeNewConnection:", - "setHidesSharedSection:", - "bitmapRepresentationOfItem:withUID:", - "indentAtIndex:", - "setCanBecomeVisibleWithoutLogin:", - "initWithNibNamed:bundle:", - "_clearCachedStatements", - "startSlideShow:", - "_updateThumbnailLayers", - "initWithURL:MIMEType:expectedContentLength:textEncodingName:", - "isNSOrderedSet__", - "swatchWidth", - "_feImage", - "_createdDescriptor", - "_initializeButtonCell", - "cancelAuthenticationChallenge:", - NULL, - NULL, - "setDataReference:", - "_willStartTrackingMouseInMatrix:withEvent:", - "_allocData:", - "_deferredAdjustMovie", - "initForSerializerStream:", - "_wantsRowAnimations", - "accessibilityElementForAttachment:", - "URL:resourceDidFailLoadingWithReason:", - "activeAttributeEditorControl", - "instantiateNodeWithClassName:identifier:", - "formatChanged:", - "setObject:forResolution:", - "_attributedStringForRepresentedObjects:", - "_checkLinksAfterChange", - "userInterfaceItemIdentifier", - "minX", - "accessibilityIsSortButton", - "canGoNext", - "proxySource", - "forgetExternalDataForObjectID:", - NULL, - "_setCurrentDocumentURL:withTransition:blocking:", - "_shouldDrawSelectionIndicatorForItem:", - "cellSizeForBounds:", - "_adjustFontSize", - NULL, - "savedSearchDictionaryWithCriteriaSlices:anyAttribute:viewOptions:", - "infoQuery", - NULL, - "selectedTextActive", - "_handleCurrentDirectoryChanged:", - "_statusItemWithLength:withPriority:", - "removeAnnotationControl", - "_personFromRecent:", - "_scriptingIndexOfObjectWithName:inValueForKey:", - NULL, - "_fillPropertyCache", - "currentAnimationManager", - "_updateLabelViewByLabelRect", - "addWindowIdentifier:", - "keyCode", - NULL, - "domainWillUnbindAll:", - "invoke", - "importBegan:", - "_beginDraggingColumn:", - "setImage:imageProperties:imageState:", - "advancementForGlyph:", - "_prepareForPushChanges:", - "organization", - "_thumnailDidUpdate:", - "_setFilterPredicate:", - NULL, - NULL, - "initWithAXUIElementRef:", - "_compareMultiLabelDictionaryKeyWithRecordValue:", - "connection:didCancelAuthenticationChallenge:", - NULL, - "_elementHasOwnBackgroundColor:", - "_impactsWindowMoving", - "selectPreviousKeyView:", - "_updateItemsBySimpleTemplates", - "_initWithProperties:primitiveType:", - "keyDown:inRect:ofView:", - "getAttributesAndValuesInNode:fromBuffer:listReference:count:", - "className", - "closeBackgroundWindow", - "_inactiveButtonsNeedMask", - NULL, - "registerUndoWithTarget:selector:object1:object2:object3:", - "nts_Description", - "_makeSureFirstResponderIsNotInInvisibleItemViewer", - "title", - "createAdapterOperationsForDatabaseOperation:", - "setImagingModeForcedToVisualContext:", - "defaultCountryCode", - "_itemIdentifiersForColorPickers:", - "_argument", - "nts_SetMe:", - "isNSData__", - "beginPageWithBounds:", - "_uniqueKeyFromNode:", - "manyToManyDeltas", - "okClicked:", - "isInUseByAnotherApplication", - "addSample:", - "orPredicateOperator", - "initForKeys:count:", - "canExportToIPhoto", - "_web_setObject:forUncopiedKey:", - "deviceConnectionDidChange", - "documentForFileName:", - "_getFloat:forNode:property:", - "abAssimilatedRecordFor:", - "setChildrenKeyPath:", - "_cell_isEditable", - "initWithLDAPManager:forServer:queryString:sessionUID:", - "setDefaultTabInterval:", - "_toggleFrameAutosaveEnabled:", - "_hideAttachedWindows:findKey:", - "_registeredObjects", - "textView:willChangeSelectionFromCharacterRange:toCharacterRange:", - "_needsRedrawForMovement", - "_maxXTitlebarDragWidth", - "_canInitiateRowDragInColumn:", - "editable", - "removeKeyFrame:fromTimeLine:", - "_readBBox", - "email:forToken:hasCert:", - "_backgroundStyle", - NULL, - "adjustToFileFormatInfo:imageInfo:utType:", - "_makeDownCellKey", - "_isDaylightSavingTimeForAbsoluteTime:", - "operationThread", - NULL, - "imageByCroppingToShape:", - "formats", - "_tryDrop:dropItem:dropChildIndex:", - "initWithExpression:trailingKeypath:inScope:", - "executablePath", - "setDrawsOutsideLineFragment:forGlyphRange:", - "supportsUnicode", - "accessibilityVisibleColumnsAttribute", - "_learnOrForgetOrInvalidate:word:dictionary:language:ephemeral:", - "numberOfSelectedColumns", - "_stopFileWritingForConnection:fileControlToken:runningOperation:stopWritingFlags:stopError:", - "_getButtonImageParts:::", - "flushGraphics", - NULL, - "_clipViewBoundsChanged:", - NULL, - "effectNamed:", - "_duplicateItemReason", - "IKFixDPI", - "menuForTokenAttachment:", - "repeatPattern:atScale:withOffset:", - "setTotalSpace:", - "_systemColorChanged:", - "contentSize", - "setDTD:", - "attachSubmenuForItemAtIndex:", - "canRenderWithCGLContext:", - "_progressPanel:didEndAndReturn:contextInfo:", - "membersSelectionChanged:", - NULL, - "_responderInitWithCoder:", - "positionOfGlyph:precededByGlyph:isNominal:", - "_readPersistentBrowserColumns", - "viewDelegateChanged", - "orderFrontStylesPanel:", - "shouldByDefaultInsertAtBeginning", - "openFile:withApplication:andDeactivate:", - "fileManager:shouldLinkItemAtPath:toPath:", - "labelBoundsWithFrame:", - "_attributesAtPath:partialReturn:error:", - "descType", - "_createArrays", - NULL, - "crayonClosestToIndex:", - "_setDrawingInRevealover:", - "rangeForUserCompletion", - NULL, - "setBooleanValue:", - "standardContentBorderThicknessForEdge:borderSize:", - "localizedInputManagerName", - NULL, - "_addDefaultScopeButtons", - "transformedRange", - "originalDontInteractFlag", - "menuKeyEquivalentAction:forEvent:", - "sharedTypesetter", - "invalidateDisplayedMembersList", - "initWithData:documentClass:isSingleDTDNode:options:error:", - "copyItemAtPath:toPath:error:", - "drawPDFHighLevel:", - NULL, - "_sourceListGroupTitleTextColor", - "registerImageExporterClass:", - "highlightImageBackgroundPiece", - "newDocument:", - "useAllLigatures:", - "_keyboardLoopNeedsUpdating", - "_generateErrorWithCode:andMessage:forKey:andValue:additionalDetail:", - "_recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:", - NULL, - "removeSubItemWithAttribute:", - "fetchContext", - "makeObjectsPerformSelector:withObject:", - "_setPartialKeysWithTableBinder:forAllTableColumnBindersOfTableView:", - "constraintDefinitions", - "setShouldFlip:", - "_subpredicateDescription:", - "_isDying", - "_doSetAccessoryView:topView:bottomView:oldView:", - "roundsToInteger", - "_saveFailed", - "setFilters:", - "isTemporaryID", - "_candidateDragRowIndexForClickInRow:", - "loadRecentsIfNeeded", - "setViewOfPickerIsLoaded:", - "writeHyphenation", - "initWithScheme:host:port:", - "_updateInlineSlideshow", - "isAttribute", - "lastIndex", - "_adjustPort", - "altIncrementValue", - "sharedCredentialStorage", - NULL, - "control:isValidObject:", - NULL, - "setSendsActionOnEndEditing:", - "IKCleanTimedOutCache", - "_obeysHiddenBit", - "setActiveColorSpace:", - NULL, - "boundsForBox:", - "_dropHighlightColor", - "textTransform", - "generateGlyphsForLayoutManager:range:desiredNumberOfCharacters:startingAtGlyphIndex:completedRange:nextGlyphIndex:", - "accessibilityProxyAttribute", - "createImageWithOptions:", - "netServiceBrowserDidStopSearch:", - "unscript:", - "objectAtIndex:effectiveRange:", - "_changeColorToColor:", - "_scriptingDescriptorOfObjectType:orReasonWhyNot:", - "_URLByEscapingSpacesAndControlChars", - "_localizerForSlice:", - "horizBlur2ROI:destRect:", - "setFade:", - NULL, - "_nextTypeSelectMatchFromRow:toRow:inColumn:forString:", - "_setNeedsValidation:", - "outlineView:shouldCollapseItem:", - "initWithRow:ofTableView:", - "setFinalValue:", - "_periodicEvent:", - "tableView:shouldTypeSelectForEvent:withCurrentSearchString:", - "unlockFocusInRect:", - "_modeMenuKeys", - "_refreshesAllModelObjects", - "markABCoreDataImportCompleted", - "_setFilteringSearchString:", - "windowWillMinimize:", - "_commonNewScroll:", - "replyTimeout", - "localizedEntityNameForEntity:", - "_registerWithDockIfNeeded", - "_lockViewHierarchyForDrawingWithExceptionHandler:", - NULL, - "dictionaryAtURL:securely:andReturnResultCode:", - "accessibilityRoleAttribute", - "initWithSQLEntity:objectID:", - "replaceObjectsInRange:withObject:length:", - "restoreDrawingState:", - "invalidateMipMaps", - "_setEmbeddedData:", - "endInstanceCreationForEntityMapping:manager:error:", - "_makeNewListFrom:", - "removeAllObjects", - "defaultNeutralChromaticityY", - "_collectionWithName:", - "_generateSQLForConst:inAttribute:expression:sensitiveOptions:inContext:", - "_createMapForRadius:strokeColor:fillColor:mode:lineWidth:", - "_setContents:", - "resizingMask", - "setPlusButtonAction:target:", - "_moveGapAndMergeWithBlockRange:", - "pointValue", - "tableView:writeRows:toPasteboard:", - "placeholderString", - "detailsDisclosedClicked:", - "lockFocusForView:inRect:needsTranslation:", - "_convertToQDRect:", - "_wantsHideOnDeactivate", - "initWithAddressBook:", - "getImage:rect:", - "_cleanupBindingsWithExistingNibConnectors:exception:", - "fileLocker:lockWasStolen:", - "isPlaying", - "descender", - "setAllowsTypeSelect:", - "_makeNextCellKey", - "tableRows", - "indexSheet:titleForDocumentURL:", - "buildRepresentationFromSearchElement:builder:order:level:", - "isMutable", - "mouseDown:inView:", - "searchButtonCell", - "indexOfSubItem:", - "nodeBecomesFirstResponder:view:", - "_loadAllPlaceholderItems", - "subject", - "setEditableTrust:", - "_cachedChildrenForNode:createIfNeeded:", - "_todayString", - "isNSString__", - "_clockAndCalendarContinueTracking:at:inView:", - "modes", - NULL, - "searchMenuTemplate", - "_runModalSavePanelForSaveOperation:delegate:didSaveSelector:contextInfo:", - "_receiveHandlerRef", - "_setInputTopLine:", - "setIgnoreMenuClosedEvents:", - "transactionState", - "areAllContextsSynchronized", - "_subtreeDescription", - "_storeInfo1", - NULL, - "_mergeDeletionWithStoreChangesForObject:withRecord:", - "outlineView:shouldHighlightWithoutSelectingCell:forTableColumn:byItem:", - "_validateAnyKey:error:", - "_minYWindowBorderHeight", - "deleteGlyphsInRange:", - "dimensions", - "media", - "trackMouseEvent:", - "accessibilityDecrementButtonAttribute", - "suppressSpecificNotificationFromObject:keyPath:", - "synchronousMode", - "_ensureAndLockPreferredLanguageLock", - "sendsActionOnEndEditing", - "TXTRecordData", - "onTimer", - "_autoExpandItem:", - "optimalBytesPerRowForWidth:", - "showDistribution:", - "_clockAndCalendarTakeDisplayedMonthFromDateValue", - "_convertStringToData:", - "_makePreviousCellOrViewKey", - "_canonicalURLForURL:", - "drawRulerLines", - "indexOfItem:", - "captureOutput:mustChangeOutputFileAtURL:forConnections:dueToError:", - "countOfInputImage", - "connectToLDAPServer:", - NULL, - "readFromFile:error:", - "_doCloseDrawer", - "setFlatness:", - "setShowPanels:", - "_preferredPopupHeight", - "_minYTitlebarTitleOffset", - "selectionSupportsEnabledState", - "initWithThreadPool:target:", - "_setUserEmailAddressOfRequestor:", - NULL, - "ISO8061StringFromDate:", - "_updateTrustPopupValues:", - "attributesOfFileSystemForPath:error:", - "setInputImageOrientation:", - "_calculateLockInfos", - NULL, - "sizeOfLabel:", - NULL, - NULL, - "_parsePredefinedAttributes2", - "accessibilitySharedCharacterRange", - "getMinificationFilter", - "initWithIdentifier:", - "_updatePlayButtonImage", - NULL, - "_wantsPastedURL:allowFileURLs:", - "targetAndArgumentsAcceptableAtIndex:", - "setAllowsBranchSelection:", - "clearMembersSelection", - "_clearDefaultMenuFormRepresentation", - "setClearsDepthBuffer:", - "pathForUIDTaggedImage", - "_errorAlert:wasPresentedWithResult:inContext:", - "_sliceTopBorderColor", - "setOptions:", - "setFetchColumns:", - "showsGetInfoButton", - "_timedAdjustTextControl:", - "imageCropView:mouseDown:", - "rowHeight", - NULL, - "addWindowsItem:title:filename:", - "_deepCollectEntitiesInArray:entity:", - "_dictionaryForArchiving", - NULL, - "_synchronizeWithPeerBindersInArray:", - "_hasKeyAppearance", - "_removePasswordForRealm:URL:", - "isScrolling", - "handleEvent:", - "autoreleasedObjectCount", - "parameterList", - "currentTab", - "_scriptingRemoveObjectsAtIndexes:fromValueForKey:", - "doubleClickOpensImageEditPanel", - NULL, - "verticalBoxInitROI:destRect:userInfo:", - "setDragAndDropCharRanges:", - "levels", - "drawPagePost:", - "_setPreviewFont:", - "_originalCard", - "_update", - "atEOF", - "expressionForConstantValue:", - "scale", - "initWithGroup:newMe:addressBook:", - "borderType", - "_updateTrackingAreas", - "rightMouseDownDelegate:", - "view:stringForToolTip:point:userData:", - "personSelected:", - "setServersInDefaultsFile:", - "_referenceQueue", - "_updateVisibleLayers", - "_drawViewBackgroundInRect:", - "certificateAuthorityWithName:", - "nibInterfaceDidAwakeFromNib:", - "arrayWithObject:", - NULL, - "startInputStream:", - "accessibilityMenuFormRepresentationHasOwnTargetAction", - "isIdentifiedByUTIs", - NULL, - "cardsWithCategory:", - "calcPostions", - "_removeObjectFromSubNodesAtIndex:", - "loadItemAtIndex:", - "accessibilityIsClearButtonAttributeSettable", - "_centerInnerBounds:", - "_isHelpMenuAppKitOnly", - "lockOperations", - "ramCacheLength", - "_needImportMipmap:forCellSize:", - NULL, - "arrayByAddingObjects:count:", - "windowForSheet", - "hasDataRepresentation", - "setAllDestinations:", - "nts_GroupsMatchingNormalizedName:inSubscribedContent:context:", - "resetCacheWithSize:", - "proxyForObject:", - "lockWhenCondition:beforeDate:", - "createThumbnails", - "nts_threaded_sortMembers:", - "pathsForResourcesOfType:inDirectory:forLanguage:", - "_fileAttributes", - "canExportSlideshowItemAtIndex:toApplication:", - "setUserData:ofType:atIndex:", - "reconcileToSuiteRegistry:suiteName:commandName:", - "_visibleColumnIndexesForKeyPath:", - NULL, - "_scriptingValueOfObjectType:withDescriptor:", - "isAccessError:", - "_postSessionNotificationIfNeeded", - "_old_drawArrow:highlightPart:", - "setMatchesOnMultipleResolution:", - "_loadPreviewFailedForDocumentPreviewView:", - "_setIsChecked:", - "removeItemWithObjectValue:", - "elementAtIndex:", - "backupDatabaseToPath:addBackupInfo:", - "_setNextToolbarSizeMode:", - "setKnobThickness:", - "_setPreventsActivation:", - "groupsThatUseGroup:", - "setTimeMachineDelegate:", - "_windowRefCreatedForCarbonApp", - "parseABOrder", - "setCardSourceDelegate:", - "viewDidMoveToWindow", - "HTMLData", - "setLineFragmentRect:forGlyphRange:usedRect:", - NULL, - "_enlargeToFitText:newSize:difference:", - "_defaultButtonCycleTime", - "_columnsForDragImage", - "fadeToolTip:", - "_accessibilityToolbarItemLabel", - "_markerHitTest:", - "addFeatureDescriptions:", - "windowDidLoad", - NULL, - "_argumentBindingCount", - "_drawBorderInRect:", - "store", - "_findMisspelledWordInString:language:learnedDictionaries:wordCount:countOnly:", - "mediaTypeString", - "_webViewClass", - "_scriptingRemoveAllObjectsFromValueForKey:", - "ab_queryPiecesNoLowerCase", - "setDateStyle:", - "cancelButton", - "directoryResultsController", - "buttonNumber", - "_libxml2TreeRepresentationWithNamespaces:", - "_readURLIntoRange:fromPasteboard:", - "clearCurrentContext", - "parser:foundInternalEntityDeclarationWithName:value:", - "isFlipped", - "_renderGLContext", - "titleFrame", - "reloadItem:reloadChildren:", - "_setUseModalAppearance:", - "customCall:withAuthorization:", - "sendMessage:withData:withReply:", - "swapFirstLastName:", - "toggleGrammarChecking:", - "_selectedNodeAtColumn:", - "_doSingleStep:inView:", - "closeWithEffect:canReopen:", - "addImportedRecord:", - NULL, - "predefinedEntityDeclarationForName:", - "secondsSinceTop:", - "_toolbarViewCommonInit", - "setPrompt:", - "getTitle", - "drawText:inRect:withAttributes:withAlpha:", - "_userDeleteRange:", - "ghostCellCountOnTheLeft", - "initWithGenerator:", - "selectionForLineAtPoint:", - "_protocolWithRequest:cachedResponse:client:allowCF:", - "initWithOriginalString:", - "_certTable", - "titleForRollOverIdentifier:withSelection:", - "_setShowAlpha:andForce:", - "setNotShownAttribute:forGlyphRange:", - "updateBatchSizeForRange:", - "_findHitItemViewer:", - "IKIPMenuWindowBackgroundColor", - NULL, - "loadAllPlugIns", - "isAnimating", - "titlebarColor", - "stringForDPSError:", - "_registerForMovieIdle", - "startTasks", - "_updateMenuItem:", - "_setKeyViewSelectionDirection:", - "rotateLeft:", - "clearAll", - "knownTimeZoneNames", - "popUp:", - "_handleEventRecursively:", - "_setUnicodeInputEventReceived:", - "setTextureSize:", - "initWithCGSConnection:options:", - "preparedCellAtColumn:row:", - "nibInstantiate", - "configurePersistentStoreCoordinatorForURL:ofType:modelConfiguration:storeOptions:error:", - "_firstSelectableRowInMatrix:inColumn:", - "countOfAppleUseCoreUI", - "isExtensionSupported:", - "progress", - "setItem:forAbsentKey:", - NULL, - "connection:didReceiveData:lengthReceived:", - "_keywordsAndColorsFromXML:", - "_setPlaceholderString:", - "_generateSerialNumber", - "registerConnection:", - NULL, - "_pluginProtocol", - "nextCard:", - "calculationMode", - "clearNavNode", - "objectAtIndexPath:", - "_rulerAccViewIncrementLineHeightAction:", - "_isSuitableForFastStringDrawingWithAlignment:lineBreakMode:tighteningFactorForTruncation:", - "isRootCertificate", - "newStringFrom:usingUnicodeTransforms:", - "setUserFixedPitchFont:", - "updatedObjects", - "_initializeSharedApplicationForCarbonAppIfNecessary", - NULL, - "_setNeedsZoom:", - "drawText:withAttributes:inRect:context:", - "removePathFromLibrarySearchPaths:", - "_unbindAllInDomain:notifyDelegate:", - "scaleFactorAtIndex:", - "_setEnabledCriticalDigitalSignature", - "remapCracklibError:", - "_referenceBinding", - "knobUnderPoint:", - "endTrailer", - "invitation", - "imageWithTexture:size:flipped:colorSpace:", - "keyClassDescription", - "initWithURL:allowNonExecutable:", - "cellSelectionStateDidChangeTo:", - "setGradientType:", - "affineTransform", - "findAllUsers", - "setKBURLString:", - "_unregisterForSessionNotifications", - "splitView:constrainMinCoordinate:ofSubviewAt:", - NULL, - NULL, - "_isDeactPending", - "entryForNode:inCachedChildrenForNode:", - "_doRotationOnly", - "removeOutput:", - "setPrimaryOnOpenGLContext:", - "setFriction:", - "popupStatusBarMenu:inRect:ofView:withEvent:", - "simpleControllerWithUIController:", - "repeatCount", - "dataUsingEncoding:", - "parentWindow", - "setInContext:", - NULL, - "_handleChildRemoved:", - "filesystemItemCopyOperation:shouldProceedAfterError:copyingItemAtPath:toPath:", - "initWithOperatorType:modifier:variant:position:", - NULL, - "_setCommonName:", - "messageType", - "_inHideCollectionsMode", - "autoupdatingCurrentLocale", - "_reallyNeedsDisplayForBounds", - "_dragUntilMouseUp:accepted:", - "CGBitmapInfo", - "nextBase64Data", - "setImageName:bundle:", - "_queue", - "IKIPArrayByApplyingSelector:withObject:", - "accessibilitySelectedAttributeOfChild:", - "setZoomFactorX:", - "_isLucidaGrande", - "setCommandKeys:", - "_createCAConfigFile:pemData:identityNameInfo:subjAltNameExtObj:keyUsageExtObj:keyPairAttrsObj:certInfoObj:basicConstrExtObj:extKeyUsageExtObj:additionalCertInfoObj:CACert:webURL:returnedInvite:", - "handleCarbonBoundsChange", - "_logError:fallbackMessage:relatedToBinding:", - "initWithType:subpredicates:", - "_extractOrderedNonStaticItemsFromArray:", - "unload", - "cacheCustomProperties:withRecordType:", - "setScaleFactor:atIndex:", - NULL, - "_selectCellIfRequired", - "setTextView:", - "compositionAspectRatio", - "_paragraphClassforParagraphStyle:range:", - "_outlineDoubleAction:", - "addItemsWithObjectValues:", - "_localizedStringForKey:value:", - "overrideKeyboardWithKeyboardNamed:", - "_shouldTrack", - "splitView:willMoveDivider:distance:", - "attemptRecoveryFromError:optionIndex:delegate:didRecoverSelector:contextInfo:", - "_setFalse:", - "IMAVManager", - NULL, - "updateFlare", - "isSpeaking", - NULL, - "_validateMenuFormRepresentation:", - "accessibleAttachments", - "_defaultIndicatorSize", - "mutatingMethods", - "_sendDelegateCreateRowsForColumn:inMatrix:", - "noteQueryAttributesChanged", - NULL, - "_canShowFileAtPath:", - "_sizeToFit:", - "_loadPreviousModeAndLayout", - NULL, - "_createDockMenu:", - "isSupersetOfSet:", - "directoryResultAtIndex:", - "isRichText", - "initWithTable:startingRow:rowSpan:startingColumn:columnSpan:", - "hintCapacity", - "removeView:fromView:layoutManager:", - "nodeWillRemoveFromGraph", - "_setIsLastItem:", - "addObjectsToMasterArrayRelationship:selectionMode:", - "setSelectedIndexPaths:", - "drawHighlight:inRect:", - "animationDataForCell:", - "_runInNewThread", - "_discardTrackingRect:", - "_sizeTableColumnsToFitForColumnResizeWithStyle:", - "initWithX:Y:", - "setMiniwindowTitle:", - "signature", - "initWithScreen:", - NULL, - "setIgnoreOpenAndClose:", - "markedTextAbandoned:", - "setFont:", - "_drawLegend", - "setMediaBrowserView:", - "setOffStateImage:", - "_focusImageAtIndex:", - "_executeAdd:didCommitSuccessfully:actionSender:", - "initFromDictionary:", - "_needsRedrawOnMouseInsideChange", - "URLHandleClassForURL:", - "performAdapterOperations:", - "superviewBeingDeallocated", - "setSearchMenuTemplate:", - "_deselectAnySelectedDirectories", - "setIsClosable:", - "_accessibilityRowsInRange:", - "currentHost", - "isCountOnlyRequest", - "localNode", - "_currentListNumber", - "initWithXMLNode:", - "defaultSortDescriptorPrototypeForTableColumn:", - "_keysForPropertyDescriptionKind:", - "hidesEmptyCells", - "drawSegment:inFrame:withView:", - "popupsAreEditable", - "writemipmapData:intoFile:filePosition:", - "moveWordForwardAndModifySelection:", - "_initWithView:printInfo:epsNotPDF:bounds:data:orPath:", - "invalidateOutputCache", - "isSubsetOfHashTable:", - "_addStaticSubfieldWithString:", - "_sendToRemainingReceivers", - "_coreUIDrawBackgroundWithFrame:inView:", - "setInitialGState:", - "lastPathComponent", - NULL, - "setBoundsSize:", - "popUpContextMenu:withEvent:forView:withFont:", - "_registerTableColumnBinder:toTableColumn:autoCreateReferenceController:", - "_realCompositeNameIncludingAuxiliaryElements:", - "returnID", - "image:focus:", - "manyToMany", - "putCell:atRow:column:", - "_disableObserving", - NULL, - "_doStartDrawer", - "dispatchInvocation:", - "pathCell:willPopUpMenu:", - NULL, - "setLimitIntermediate:", - "displayedFileProperties", - "verticalPageScroll", - "loadPlugInsInLibrary:", - "_branchDescription", - "IMProperties", - "deepPropertiesCopy:", - "setStringIndex:forIndex:", - "drawCheckBox:inContext:", - "findNode:", - "_updateDetailLevel", - NULL, - "_explicitlyCannotInsertChild", - "_setMetadataDirty:", - "removeFile", - "_changeContentsToPath:", - NULL, - "PDFOperationWithView:insideRect:toData:printInfo:", - "typeOfProperty:withAddressBook:", - "_storeCurrentDirectory", - "depth", - "titleButtonOfClass:", - "postscriptName", - "_fileOperationCompleted:", - NULL, - NULL, - "_setKeyEquivalentListTable:", - "characterSetWithBitmapRepresentation:", - "decodeReturnValue:", - "compositeToPoint:fromRect:operation:fraction:", - "proxyClass", - "resizeWithDelta:fromFrame:beginOperation:endOperation:", - "_setForceSuccess:", - "_shouldHaveBlinkTimer", - "moduleWillBeRemoved", - "initWithAuthDelegate:url:", - "removeAllEffects", - "_preferOnArtForBezel", - NULL, - "moveCurrentPointInDirection:", - "maxWidth", - "isModalPanel", - "blurHalfSizeImage:sampler:radius:kind:", - "setResolvesAliases:", - "value:withObjCType:", - "_identifiedItems", - "ignoresMultiClick", - "resizeWithOldSuperviewSize:", - "lastRenderedMipmapItem", - "spellCheckerDocumentTag", - "accessibilityHorizontalScrollBarAttribute", - "_parseText", - "_clearUnprocessedInsertions", - "order", - "currentNibPath", - "propertyHasActions", - "setValue:withProperty:comparison:entryView:", - "locationZ", - "_heightIsFlexible", - "setUpTokenAttachmentCell:forRepresentedObject:", - "setIdentifier:forTimeLine:", - NULL, - NULL, - "_rowHeightStorageInvalidateCacheAndStorage", - "setOpenGLContext:", - "_real_didChangeValueForKey:", - "_setLayerNeedsDisplayInViewRect:", - "_updatePauseLock", - "IKCreateCGImageFromMeshedData", - "_createValueGetterWithContainerClassID:key:", - "setEditedFlag:", - "columnSpan", - "startDirectorySearch", - "intersectGroupMembers:withSearchResult:", - "_noticeEditablePeerBinder:", - "setIndexed:", - "ISOCountryCodes", - "initWithContext:object:", - "setModified:", - "_setNeedsDisplayInRow:", - "_recursive:displayRectIgnoringOpacity:inContext:topView:", - "setTruncationMode:", - "_setCurrentDirectoryNode:makeHistory:notify:", - "decompressionOptionsDidChangeForConnection:", - "_removeSelectionIndexPathsBelowNode:", - "preferredSizeOfLayer:", - "setTextLists:", - "_managedObjectContextEditor:didCommit:contextInfo:", - NULL, - "drawDragBoundries", - "setEventCoalescingEnabled:", - "observedKeys", - "setCellsStyleMask:", - "_setPendingUpdate:", - "deleteLastCharacter", - "_createBackingStore", - "_performKeyEquivalentWithDelegate:", - "_recursiveSetTrackingAreasDirty:", - "indexOfDirectoryResult:", - "_paperNameInPageFormat:", - "valueForRequiredAttributeKey:", - "passwordUIDisplayed", - "mipmapImageChanged", - "animateSetIconSize:", - "characterAtIndex:", - "_computeCameraDY", - "_setAutomaticRearrangementKeyPaths:", - "_fontSetChanged:", - "indentationLevel", - "tightBilateralInitROI:destRect:userInfo:", - "flipVertical:", - "_contextDidSave", - "bindVariables", - "unbindMipmapItem:withUID:", - "setFileWrapper:", - NULL, - "resizeSubviewsWithOldSize:", - "addRecent:", - NULL, - "_hitTestClockAndCalendar:inRect:ofView:", - "_setupRuleEditorForScopeView", - "pruneGRLs:toLimit:results:", - "initWithAttribute:relativeTo:attribute:scale:offset:", - "_done", - "boundsForPointArray:", - "archive:streamForEntryName:", - "_coreUIDefaultIndicatorImage", - "_assignObjects:toStore:", - "_performFastConflictDetectionForObjects:withChannel:", - "frameInterval", - "_activateServer", - "addUID:", - "setCompositionsFromRepositoryWithProtocol:andAttributes:sortedBy:", - "setPrevShownGRL:", - "controllerType", - "last", - "validateMipmap:withModel:withQuality:", - "deinterlacesVideo", - "rightExpressions", - "application:openTempFile:", - "moveToEndOfLineAndModifySelection:", - "_doAnimationStepWithProgress:", - "populatePicker:", - "_isJavaSubclass", - "bindItem:withUID:forCaching:fromDiskOnly:", - "setMinusSign:", - "_handleMouseUpWithEvent:", - "drawsGrid", - "_getDidEndSelector", - "localizations", - "subtractRect:", - "_disableLayout", - NULL, - "isKindOfClass:", - "_refreshIsInUseByAnotherApplication", - NULL, - "lastVisibleColumn", - "setAttribute:forKey:", - "hasImportErrors", - "externalData", - "_lastModifiedDate", - "setFloatValue:", - "_additionIndexPathAppendChildIndex:", - "_saveIfReallyEditedWithDelegate:didSaveSelector:contextInfo:", - "accessibilityIsOrientationAttributeSettable", - "setDefaultCountryCode:", - "imageAndTitleWidth", - "addObjectToMasterArrayRelationship:selectionMode:", - "widthForHeight:", - "createBackgroundWindow:", - "_isReadOnly", - "name:reason:status:", - "engineOfClass:forDisplayID:", - "outlineColumn:willDisplayCell:row:", - "isItemSelectedAtIndex:", - "_rowHeightStorageComputeRowAtPoint:cacheHint:", - NULL, - "loadSavedLayoutWithKey:", - "makeMainWindow", - "contentsForEntryName:", - "smallChromaMorphologyMinimumROI:destRect:", - "attachedMenu", - NULL, - "callbackDataWithOutput:connection:backgroundQueue:", - "nts_DoesPropertyExist:forClass:", - "_shouldPreventCustomViewFromDraggingWindow:", - "queuePriority", - "_realDoModalLoop:peek:", - "selectionDuration", - "countOfObjectsForClass:withPredicate:managedObjectContext:", - "_setSingleChild:", - "alignRight:", - "unsuppressAllNotificationsFromObject:", - "setFireDate:", - "_makeFirstResponderForKeyboardHotKeyEvent", - "attributeValueForSlot:", - "doPeriodicFlush", - "_addToolTipRect:", - "_updateCountLabelForLayout:", - "_cacheMipmapSize:fromModel:", - "initRenderingContext", - "_identityName", - "maxTextureSizeForTarget:", - "pageDown:", - "_initForPropPatchUpdatingProps:inNameSpace:", - "removeEntryAtIndex:", - "controlsView", - "_wantsDeviceDependentEventModifierFlags", - "subdivideBezierWithFlatness:startPoint:controlPoint1:controlPoint2:endPoint:", - "webFrame", - NULL, - "setOpacity:", - "_validIndexes:indexType:", - "draggingEntered:", - "_destinationFloatValueForScroller:", - NULL, - "_adjustForGrowBox", - "sendInvocation:", - "_dragOperationFromInfo:", - "_removeGrammarAttributeForRange:", - NULL, - "_unregisterForChildChangedNotifications", - "rangeForPropertyPath:", - "fileType", - NULL, - "setPrincipal:", - "initWithData:objectID:", - "_setCanAnimateScrolls:", - "parser:foundNotationDeclarationWithName:publicID:systemID:", - "_indexAtIndex:", - "_setRealm:forURL:", - "isInputExtent", - "_searchMenuForProxy", - "_onQCTimer", - NULL, - "disableExecution:", - "_insertionPointDisabled", - "createTexturePackerAtIndexIfNeeded:", - "_invalidNavNodePopUpLabelAction", - "nts_SetValue:forProperty:recordCouldBeInDatabase:", - "createSelectionWithEvent:", - "mouseTracker:handlePeriodicEvent:", - "documentDidUnlock:", - "exponentSymbol", - "unloadNib:", - "nts_SubscriptionsWithAddressBook:", - "getInputImage", - "drawPage:", - "_ensureCapacity:", - "_updateWindow:withWidth:height:", - "getBitmapDataPlanes:", - "performSelector:withObject:afterDelay:inModes:", - "findInSpotlight:", - "_mergeGlyphHoles", - "textContainerForGlyphAtIndex:effectiveRange:", - "pagesCount", - "windowTitlebarLinesSpacingWidth", - "namesByAlias", - NULL, - "_registerDefaultPlaceholders", - "setupViewsForNode:", - "_clearOriginalSnapshotForObject:", - "invalidateDisplayForCharacterRange:", - "decodeFloatForKey:", - "imageFileTypes", - "_borderInset", - "setCurrentDocumentIndex:withTransition:blocking:", - "_parent:", - "disconnectO3Console", - "pathExpression", - "sourceRepresentationType", - "accessibilityFocusedWindowAttribute", - "unblockAllOperationsForGroup:", - "_BMPRepresentation:", - "setRangeToParent:", - "addStringToRecentSearchStrings:", - "_dataIfDoneBufferingData:", - "_addObject:", - "_sendActionOrDoubleAction:", - "newLockButton", - "_combobox_windowWillBeginSheet:", - "_indexesOfPassingObjectsInContainer:", - NULL, - "prepareInsertStatementWithRow:", - "_layerTreeRenderer", - "_syncItemSet", - "_compareSingleDictionaryNoKeyWithRecordValue:", - "setClickableArea:target:selector:info:", - "_predicateForToManyRelationshipName:relativeKeyPath:comparison:value:label:", - "setContextualMenu:", - NULL, - "handlesContentAsCompoundValue", - "setHelpAnchor:", - NULL, - "timestampForKey:", - "_canHaveToolbar", - NULL, - "moveWordBackward:", - "_tableBinderForTableView:", - "handleQueryWithUnboundKey:", - "setShowEjectButton:", - "domainForResolution:createIfNeeded:", - "isDescendantOfNode:", - "textAttributesForNegativeInfinity", - "responseContentLength", - "localizedNameForCategory:", - "removeFile:", - "sortUsingFunction:context:range:", - "failedPasswordHandler", - "setPlusSign:", - "_acquireRetainedCGImageRef", - "_cacheRowHeightsIntoBucket:bucketFirstRowIndex:lastCacheableRowIndex:", - "widgetRectangleForResolutionData:", - "disableKeyEquivalentForDefaultButtonCell", - "_noteKeyValuePairChangedValue:", - "prefetchThumbnailsDelay", - "searchString", - NULL, - "copyDropDirectory", - "dateByAddingTimeInterval:", - "selectFirstTabViewItem:", - NULL, - NULL, - "specifierWithPath:traverseLink:", - NULL, - "getHue:saturation:brightness:alpha:", - "_decodePropertyListForKey:", - NULL, - "_updateLayerBackgroundFiltersFromView", - "mouseUpOnCharacterIndex:atCoordinate:withModifier:client:", - "_replaceCString:withCString:", - NULL, - "innerTitleRect", - "_adjustEffectsAndCameraUI", - "_runFullDialogSheet", - "modifyFontViaPanel:", - "setPhase:", - "textColorAtIndexPath:", - "_executeSelectNext:didCommitSuccessfully:actionSender:", - "lastName", - "titleFieldPresent", - "setMedia:", - "setOnStateImage:", - "_currentDisplayColor", - "eventID", - "setScalesWhenResized:", - "openMenuFromDepth:shiftFocus:", - "showsBaselineSeparator", - "previewView:didUpdateDisplayForURL:withImage:", - "_hasMetalSheetEffect", - "restoreNameColumnWidth", - "_allowedItems", - "_trueCount", - "keyDownDelegate:", - NULL, - "setMetadata:forKey:shouldForward:", - "_canUseReorderResizeImageCache", - "hash", - "selectedIdentifiersForPerson:", - NULL, - "initWithFile:error:", - "setImageWithCGImageSource:imageProperties:options:", - "setCachedChildren:", - "movieWithURL:error:", - "appendBezierPathWithArcFromPoint:toPoint:radius:", - "makeFirstResponder:", - "unregisterObservingForAnalyzableKeyPath:", - "_platformFont", - "decodeSize", - "_configureForFileListMode:", - NULL, - "initWithAdapterOperator:row:", - "_setToolbar:", - "containsRect:", - "emissionLatitude", - "initWithRequest:delegate:startImmediately:", - "_mapURLForAddressWithId:", - NULL, - "reloadRootNode", - "keychain", - "_findKeyLoopGroupingViewFollowingKeyLoopGroupingView:direction:", - "stopRenderingPatch:", - "_initializeAttributes", - "newObjectIDSetsForToManyPrefetchingRequest:andSourceObjectIDs:", - NULL, - "horizontalPagination", - "compareWithPixelFormat:", - NULL, - "replaceSelectedPagesWithPage:drawNow:", - "_pathOfImageWithName:inBundle:", - "releaseResource", - "initGlyphStack:", - "headIndent", - "boldSystemFontOfSize:", - "retainedLocaleString", - "parsePolicyConstraints:", - "backgroundQueue", - NULL, - NULL, - "_scriptingArrayOfType:withDescriptor:", - "checkIfCoreVideoWorksOnCurrentDisplay", - NULL, - "controlDrawsSelectionHighlights", - "_nq:", - "stringWithCharacters:length:", - "readDocumentFragment:", - "classDescriptionForEntityName:", - "setImageView:", - NULL, - "setObjectBeingTested:", - "resetCache", - "_updateFormatDescriptionFromPropertyListener", - "mapping", - "updateOutlineColumnDataCell:forDisplayAtIndexPath:", - "_applicationDidBecomeActive", - "_bestSettingWithBitsPerPixel:width:height:refreshRate:exactMatch:", - "_viewFromOperatorTypes:", - "_setNeedsDisplayForTabViewItem:", - "setLoopsBackAndForth:", - "_horizontalScrollerClass", - "finalValue", - NULL, - "setWeekday:", - NULL, - "window", - "makeCurrentSearchOptionsDefault", - "copyAndReparentGRLs:forWindow:forNewParent:", - "setExternalName:", - "_isHiraginoFont", - NULL, - "indexOfPointer:", - "lastItem", - NULL, - "isDisconnectedMountPoint", - "_usesCustomDrawing", - "forceBreaks", - "parse:", - "_executeMain:result:", - "attributeDescriptorForKeyword:", - "showsTrustButton", - "updateSchedulePriorityRange", - "selectLayer:", - "_freeImage", - "determineCurrentPage", - "_appHasOpenNSWindow", - "getResolutionData:figureMetricsTop:left:bottom:right:", - "setWidthTracksTextView:", - "patchManager", - "_animationThread", - "_createDeleteRowButton", - "connectionID", - "_remove:andAddMultipleToTypingAttributes:", - "accessibilityAttachments", - "addViewToViewsAdded:", - "marqueeBoundsForPage:", - NULL, - "singlePage:", - "_doRemoveDrawer", - NULL, - "_button", - NULL, - "utType", - "drawDragOverlays", - "_web_visibleItemsInDirectoryAtPath:", - NULL, - "_attachToParentWindow", - "setObject:atIndex:", - "setSelectsAllWhenSettingContent:", - "scrollCellToVisibleAtRow:column:", - "_terminate:", - "_dumpSetRepresentation:", - "fontDescriptorWithMatrix:", - NULL, - "setCachedImageRef:forNSImage:", - "_stopListeningToMouseMovement", - "tooltipString", - "vcardFieldisPrivate:", - "protocol", - "compoundTypes", - "alertShowHelp:", - NULL, - "setPixelsHigh:", - "initResolutionData", - "_selectPopUpWithTag:", - "setCurrentMigrationStep:", - "rehash", - "viewForCharacterIndex:layoutManager:", - "_valuesForProperty:inNode:", - "rects", - "exceptionAddingEntriesToUserInfo:", - "setAutorecalculatesContentBorderThickness:forEdge:", - "flushAllKeyBindings", - "_realControlTintForView:", - "hasAudio", - "_beginScrolling", - "initWithKind:name:stringValue:", - "_setCurrentlyEditing:", - "canAddNode:", - "setYear:", - "recordChangesInContext:", - "_handleQueryStateChange:", - "_initWithFileSpecifierOrStandardizedPath:", - NULL, - "redBluePreBlurROI:destRect:", - "isEjectable", - "movieWithPasteboard:error:", - "spellingPanel", - "imageScalingX", - "_addCertAndEndSheet:certData:commonName:", - "setIndexAtTop:", - "rangeOfString:options:", - "viewSizeChanged:", - "_setVersionReference:", - "setPosterTime:", - "_setWithoutNotificationLocalizedKey:key:", - NULL, - "_firstPassGlyphRangeForBoundingRect:inTextContainer:okToFillHoles:", - "getHomePath", - NULL, - "_getKernelFolderCPath", - "initToBuffer:capacity:", - "zoomFactorY", - "disableNotifications", - "createAttributedString", - "_displayRectIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:", - "configurationName", - "_adjustFrameOfOutlineCellIfNecessary:frame:", - "newWithIdentifier:", - "beginLineWithGlyphAtIndex:", - "_clearModalWindowLevel", - "beginCertLookupForEmail:", - "acceptsFirstResponderForView:", - "indexOfComposition:", - "isTitled", - "metaDataLockFile", - "_learnWord:inDictionary:", - NULL, - "performAdapterOperation:", - NULL, - "_setRevealoversDirty:", - "pathNamesForRecords:", - "nts_SetValue:forProperty:", - "sortUsingFunction:context:", - "_positionForValue:", - "insertCorrelation:", - "destKey", - "transformerWithItems:", - "_processInstanceNode:", - "_scriptTerminologyDescription", - "_unaffixedMarkerFormat", - "scaleWindow:fromFrame:toFrame:duration:delegate:", - "dataForType:fromPasteboard:", - "_setDefaultWindowKeyViewLoop", - "setLineCapStyle:", - NULL, - "updateStatus:", - "setupGuessesBrowser", - "didFinishOpeningTransition", - NULL, - "initWithRects:count:", - "_implicitObservationInfo", - "_predicateForKeyPath:comparison:value:", - "_rectToDisplayForItemAtIndex:", - "_needsRolloverTracking", - "_allLocation", - "pathsMatchingExtensions:", - "isDRMProtected", - "fontWithPDFFont:size:", - "_scaledFrameForWindowFrame:withFrame:matchingFrame:scalable:", - "_updateFormats:", - "_captureAllScreens:", - "readDataOfLength:", - "rolloverMenuForSelection:", - "setCurrentEntityMapping:", - "initWithBytes:length:", - "_destroyViews", - "isFault", - "launchIPFXPickerWithParent:withDelegate:fromView:centerPoint:onScreen:currentEffectName:", - "writeDefaultTabInterval", - "initFromMemoryNoCopy:length:freeWhenDone:", - NULL, - NULL, - "endLayoutChange", - "setShowsLogonButton:", - "numberOfVirtualScreens", - "initDirectoryWithFileWrappers:", - "annotationHit:", - "_fastGetCachedRect:forRow:", - "_argumentDescriptionForKey:", - "isAlternate", - "ancillaryData", - "shouldUseCrossfadingForURL:", - "movies", - NULL, - "SCTIndexOfObject:containingValue:withAccessor:", - "minValueForControlType:keyFrame:", - "initialSearchIndex", - "floatCocoaVersion", - NULL, - "_editingFirstResponderIfIsASubview", - "isInUpdate", - "selectColumn:byExtendingSelection:", - "_shouldHandleAsGotoForTypedString:", - "awakeFromInsert", - "switchToIndexMode:", - "_applyValue:forKey:registrationDomain:", - "endEntityMapping:manager:error:", - "setStateToUnselected", - "_inMiniMode", - "sendCarbonProcessHICommandEvent:", - "_startFileControlCallbackTimeoutTimer", - "keyWindow", - "_rulerAccViewAlignmentAction:", - "sharedMappings", - "autosaveName", - "_old_encodeWithCoder_NSTabViewItem:", - "valuesForKeys:", - "_web_hasCountryCodeTLD", - "caption", - "_view", - "setCIAffineClampFilter:", - "setIncrement:", - "addJoinForManyToManyRelationship:sourcePath:destinationPath:", - "doesPropertyExist:forClass:", - "_accessibilityIsCommonToolbarButtonItem", - "_longestStringSize", - "getAdvancements:forPackedGlyphs:length:", - "setRotationAngle:", - "ghostCellCountOnTheRight", - "scriptErrorOffendingObjectDescriptor", - "_startHitTracking:", - "startLiveCapture", - "paste:", - "autoplay", - "sizeFunction", - "_liveResizeCachedImageIsValid", - "_unhideAllDrawers", - "_toolbarUnregisterForNotifications", - "_collection:setHidden:", - "setOpaque:", - "arrayWithFrames:count:", - "evaluateXQuery:constants:contextItem:error:", - "texturePackerIndex", - "_ns2cfCookies:", - "initWithReferenceToURL:", - "setCGImage:", - "autorecalculatesKeyViewLoop", - "_scrollTo:animate:", - "boundingRectOfOrientedRect:rotation:pivot:", - "_syncToolbarItemUserVisibilityPriorityToValues:", - "stopSendingConversionUpdates", - "maximumSignificantDigits", - "setHighQualityVideo:", - "_registerDragTypesIfNeeded", - "compareGeometry:", - NULL, - "_hasCustomVisibilityPriority", - "resizeWindow:animate:fromLayout:toLayout:paneWidths:numberOfPanes:", - "_enumeratedEditableBindings:", - "calcViewHeight:", - "pixelBlockHeight", - "_displayValueForCompoundPredicateType:", - "iconView:loadCell:forIndex:", - "nts_Disconnect:", - "windowHidden:", - "modDateForURL:andReturnResultCode:", - "useStandardKerning:", - "_valueOfType:", - "_pasteboardWithName:", - "showPackedGlyphs:length:glyphRange:atPoint:font:color:printingAdjustment:", - "placeholderAttributedString", - "_reorderResizeImageCache", - "_encodeMapTable:forTypes:withCoder:", - "setConstrainsToOriginalSize:", - NULL, - "createImageFromNSImage:", - "appendObjectClassDeclarationToAETEData:includingParts:", - "_restoreTypeSelectCellValue", - "setTimebase:", - "_isBeingTracked", - "validateMetaDataIfNeeded", - "_trust", - "unlockOperation", - "_updateLogLevel", - "decimalDigitCharacterSet", - "_minXTitlebarWidgetInset:", - "_setAutoResizeDocView:", - "offset", - NULL, - "changedItemsOnly", - "hyphenationFactor", - "update", - NULL, - "autoreleasePoolExists", - "archiverWillFinish:", - "nameForParameter:", - "__patchExecuted:", - "_setWantsRevealovers:", - "applicationDidChangeScreenParameters:", - "mainWindowFrameShadowColor", - "setDateFormat:", - "_pagesCountForCompositions:", - "clearTableParameters", - "changeOptionsPanelSettings:", - "setKBVersionString:", - "_containerRelativeFrameOfInsideOfColumn:", - "setClassName:forClass:", - "_drawCellAtRow:column:inFrame:", - "writeData:length:", - "_convertSetOfObjectsToSetOfObjectIDs:", - "setMarkedText:selectedRange:", - "shiftIndexesStartingAtIndex:by:", - "setSynthesizerIsRetained:", - "switchToImage:orientation:", - "generateSubqueryVariableAlias", - NULL, - "locateLongitude:latitude:", - "bookList", - "charIndex", - "_drawerTopOffset", - "frameRate", - "getDataSourceArray", - NULL, - "insertNewObjectForEntityForName:inManagedObjectContext:", - "parserDidStartDocument:", - "_managesWindowRef", - NULL, - "take", - "_defaultNewFolderName", - "_insertRange:inArrayAtIndex:", - "_typeSelectEndCurrentSearchWithRedisplay:", - "_iconSizeForControlSize:", - "defaultBehavior", - "willRecycleResource:", - "_addObserver:forProperty:options:context:", - "setNonRetainedCachedRecord:forKey:", - "_getUserInfo:", - "_dumpFullImageInfo", - "zoomToFitFullScreen", - "resetAuthList", - "_flags", - "_title", - "scope", - "toolMode", - "setIsFileListOrderedAscending:", - "updateTemperatureAndTint", - "addChild:", - "startOrStopTargetAnimation", - "_canOverrideUserAction:", - "_drawRectIfEmptyWhenSubviewsCoverDirtyRect:", - "run", - "_indentationHorizontalPadding", - "mipmapItemAtIndex:", - "getResolutionData:padMetricsTop:left:bottom:right:", - "activeListAnalyzer", - "titleTextColor", - "_menuOwner", - "storeColorPanel:", - NULL, - "comparisonPopUpForProperty:withSelection:", - "_refreshDevices", - "buffer", - "setGain:", - "nts_DoInitialImports", - "standardFontFamily", - NULL, - "_valueOfType:withDeferredSpecifierEvaluation:", - NULL, - "frameOrigin", - "_setupTrackingArea", - "initWithTimeIntervalSince1970:", - "_timeRect", - "selectCellAtRow:column:", - "dateValue", - "initWithContainerClassDescription:containerSpecifier:key:relativePosition:baseSpecifier:", - "locationForGlyphAtIndex:", - "_appendWhereClauseForConstVal:", - "_initFromAbsolutePositionRecord:", - NULL, - "componentsFromLocaleIdentifier:", - "viewToAddForAnnotation:", - "_prefixUp", - NULL, - "zipCode", - "_drawsBackground", - "_doSlideDrawerWithDelta:", - "setAttributedStringForZero:", - "selectedNavNode", - "_loadInitialItemIdentifiers:requireImmediateLoad:", - "numberOfRowsInTableView:", - "_cacheDisplayValue:", - "convertToQDRect:", - "dayOfCommonEra", - "_doneColor:", - "createNewTimeLine:", - "initWithFrameColor:fillColor:", - NULL, - "breakLock", - "heartBeat:", - "_recomputeLabelHeight", - "fieldContentsForProperty:", - "setTemplateView:", - "_setParameter:forOption:withBindingInfo:", - "cornerRadius", - "updateFrameWithCellFrame:", - "poolStack", - "run:", - NULL, - "sendThisCard:", - "_initRelockRequestWithToken:", - "_setTimelineVisibility:", - "isMember:", - "_findFirstNonSelectedRowFrom:to:", - "cleanup", - "_markRememberedEditingFirstResponderIfIsASubview", - "reformatValueAtLocation:", - "_plainFontNameForFont:", - "_setKeyboardFocusRingNeedsDisplayAroundPerimeter", - "prebindInRamMipmapItem:withUID:", - "initWithCString:length:", - "_storeUserSetHideExtensionButtonState", - "_machineLibraryPath", - "setRenderLevel:", - "windowTitlebarTitleLinesSpacingWidth:", - "_setNeedsDisplay", - "closeAllDocumentsWithDelegate:didCloseAllSelector:contextInfo:", - "stepBackward:", - "initAsPeoplePicker:mainSplit:searchLabel:searchField:", - "executeCommand", - "noteSecondLineParagraphStyle", - "activeColumnFilter", - "_sliceLastBottomBorderColor", - "initWithColorSyncProfile:", - "dateRangeAnchoredSelectionWithDate:", - "writeCharacterAttributes:previousAttributes:", - "setLastQueryDate:", - "setOwner:", - "deselectRow:subrow:", - "_highlightOutlineCell:highlight:withFrame:inView:", - "configurationDictionary", - NULL, - "_cycleDrawersReversed:", - "availableMemoryForRequestedMemory:ofType:virtualScreen:", - "depthLimitPaths", - "_enumerationBinding", - "_needsRedrawOnKeyChange", - "_preflightDatabaseAtURL:", - "itemTitles", - "_imageForEjectType:", - "initWithContext:patch:", - "ruleEditorRowsDidChange:", - "modDate", - "backingReleaseInfo", - "cancelFindIndicator", - "errorType", - "_persistentStoreCoordinator", - "_removeSaveFile", - "enabledState", - "_prepareConst:inManyToMany:", - "_createKeyValueBindingForKey:name:bindingType:", - "_takeColorFromAndSendActionIfContinuous:", - "addressBookImagesDirectory", - "setImpossibleCondition:", - "windowControllers", - "acceptsMouseMovedEvents", - "_didImportMipmap:throughCopy:forDisplayedCell:index:flatten:importedItem:", - "descriptionWithLocale:indent:", - "postResultsAreInNotificationNotification:", - "createShadowMaskParts", - "rememberForPreviousSelectedItem", - "hotSpot", - "_calculatePageRectsWithOperation:pageSize:layoutAssuredComplete:", - "beginSheetWithSmartGroup:modalForWindow:modalDelegate:didEndSelector:contextInfo:", - NULL, - "setImageData:", - "setSRRecognitionSystem:", - "_isDefaultFace", - "setMonoCharacterSeparatorCharacters:usualPunctuation:", - "moveColumn:toColumn:", - NULL, - "drawCenteredIcon:", - "createButtons", - "provideNewButtonImage", - "_updateUserKEsAfterActivationAndDelay:", - "firstUnlaidGlyphIndex", - "_scheduleDelegateCallback", - NULL, - "_syncItemSetAndUpdateItemViewersWithSEL:setNeedsModeConfiguration:sizeToFit:setNeedsDisplay:updateKeyLoop:", - "subRowIndexAtPoint:", - "trackMouseDragDisallowed:", - "_enumeratedDisplayPatternTitleBindings:", - "printerWithName:", - "_doDelete:", - "_removeBottom", - "_segmentedCellStyle", - "PMPrintSettings", - "timingFunction", - "one", - "outputNow:forTime:flagsIn:flagsOut:", - "_editableBinderForTableColumn:", - "autorepeat", - NULL, - "setIconView:", - "_removeClipIndicatorFromSuperview", - "_drawAnalogClockWithFrame:inView:", - NULL, - "__select:context:", - "_compositeHiddenViewHighlight", - "initLockWithSession:URI:duration:", - "resetSearchButtonCell", - "_checkToolTipDelay", - "descriptorAtIndex:", - "_minXLocOfOutlineColumn", - "clearController", - "filenameExtension:isValidForType:", - "_useBasicAuth", - "setOrderedIndex:", - "CA_JSClass", - "setDictionary:", - "compositionWithFile:", - "_paragraphInTable", - "attemptOverwrite:", - "serializeAlignedBytesLength:", - "shouldOpenURL:", - "_doOpenFile:ok:tryTemp:", - "initWithCarbonMenu:itemIndex:", - "isEqualToValue:", - NULL, - "_notifyView_MovedFromIndex:toIndex:", - "directoryTraversalOperation:foundPath:", - "tooltipExtensionViewSize:", - "_handleApplyValueResult:cachedValue:displayValue:objectValue:", - "SCTConvertToScreenRect:", - "knobThickness", - "contentFilters", - "setBackgroundFilters:", - "_imageRepClassForFileNameExtension:andHFSFileType:", - "_invalidateTextColor", - "canDraw", - "_toggleToolbarConfigPanel:", - "delegate", - "_verifyDataIsPICT:", - "preloadingURL", - "parseMachMessage:localPort:remotePort:msgid:components:", - "setExternalType:", - NULL, - "book", - "nts_dbCache", - "lockForReading", - "_isUnprocessedInsertion", - "_errorWithErrno:sourcePath:destinationPath:", - "entityForName:inManagedObjectContext:", - "_attachWindowForOrdering:relativeOp:", - "_setItemIndex:", - "_updateCompositions:", - "requiredOpenGLExtensions", - "_multipleMutableArrayValueForKeyPath:atIndex:", - "convertAttributes:", - "primitiveType", - "_sizeNeedsUpdate", - "zoomImageToRect:", - "adjustRulersForMaxSize", - "_imageToBezelOrIndicatorPadding", - "_CGSremoveWindow:", - "_tableViewDoubleClick", - "isMultiple", - "showModalPreferencesPanelForOwner:", - "versionFromState:", - "isDrawingContentAtIndex:", - "_updateCaretToIndex:mouseLocation:", - "_parent", - "_setupProfileUI", - "reviewUnsavedDocumentsWithAlertTitle:cancellable:", - "hasPropertyForKey:", - "lineFragmentUsedRectForGlyphAtIndex:effectiveRange:withoutAdditionalLayout:", - NULL, - "endUpdateBuffer:", - "suppressionButton", - "notifyDelegateWithResultCode:", - "_beginColumnAnimationOptimization", - NULL, - "fetchRequestTemplatesByName", - "archive:propertiesForEntryName:", - "initWithAssignmentExpression:expression:", - "supportsColorMatching", - "hoverRectForDirection", - "_appHasNonMiniaturizedWindow", - "keyEventWithType:location:modifierFlags:timestamp:windowNumber:context:characters:charactersIgnoringModifiers:isARepeat:keyCode:", - "resetDefaultInputValues", - "validateMenuPath", - "draggingKeyBindingManager", - "_abbreviationForAbsoluteTime:", - "SCTSubViewWithSCTID:", - "constrainsToOriginalSize", - "frameChanged:", - "_generateSQLForConst:inManyToMany:expression:inContext:", - "doneButton:", - "initWithProvider:transformation:croppingRect:", - "createManyToManyJoinIntermediateForProperty:direct:lastStep:inScope:context:", - "_createEllipsisRunWithStringRange:attributes:", - "_reconcilePrintSettingsAttributes", - "_setAllItemsTransparentBackground:", - "totalAutoreleasedObjects", - "_runGarbageCollectionForSize", - "writeMetadata:forRecordWithUniqueId:", - "mainSplit", - "scheduleOnRunloop:mode:", - NULL, - "setImage:badge:", - "attributeWithName:URI:stringValue:", - "_sendDelegateHeightOfRow:", - "sortedClassDescriptions:", - "lineRangeForRange:", - "ageStatistics", - "_isTableColumn:boundWithKeyPath:", - "_hasAnyChanges", - "scanHexFloat:", - "initWithURL:", - "retain", - "setColorRed:Green:Blue:Alpha:", - "compositionPickerView:didLoadComposition:", - "cameraCallbackFindParent:parentClass:", - "_nearestCrayonUnderViewPoint:", - "subentityKey", - "availableColorLists", - "nts_ImportFromMetaKitDatabaseAtPath:includeMailRecents:includeAddressBook:andSave:", - "collect:", - "_scriptingObjectForSpecifier:", - "invalidateCursorRectsForView:", - NULL, - "updateGridContentAtIndexes:", - "setPropertyCache:", - "updateThumbnail", - "stopImmediately", - "didLoadData:lengthReceived:", - "_getGlobalWindowNumber:andRect:forRepresentation:", - "reloadChildrenForNode:", - "dragImage", - "_browser:performKeyEquivalent:inColumn:", - "parseItem", - "_completeTypeDescription", - "getAdvancements:forGlyphs:count:", - "nodeClass", - "decimalNumberByRaisingToPower:", - "fetchResultSet:usingFetchPlan:", - "_adjustStatesOfObject:mode:state:triggerRedisplay:", - "expansionFrameWithFrame:inView:", - "_cellThatHasContentAtPoint:withEvent:", - "sendTaggedMsg:", - "_lastRightHit", - "HTTPBodyStream", - "classNameDecodedForArchiveClassName:", - NULL, - "reloadData", - "parameterAtIndex:", - "_mipmapCopyForThreadedOperation:", - "classForKeyedUnarchiver", - "initWithQuickTimeTrack:error:", - "nts_migrateMailRecentsToCurrentStoreWithPath:model:error:", - "textTabForGlyphLocation:writingDirection:maxLocation:", - NULL, - "contentViewFrameDidChange:", - "_setConvertedData:pboard:generation:inItem:", - NULL, - "normalizedPageBounds:", - "genFold:aboutAngle:", - "cachedTextForText:", - "setCaptureSession:", - "removeElementsInRange:coalesceRuns:", - "_setDrawingHIView:", - "_protectEvilCharacter:", - "_lightWeightRecursiveDisplayInRect:", - "_abCompareSuffixMatch:options:", - "_isNodeKeyInUse:", - "uppercaseString", - "deltaY", - "initWithContentsOfURL:encoding:error:", - "trace", - "choices", - "_setNeedsDisplayForIndex:", - "_setNeedsDisplayIfTopLeftChanged", - "_appendSuffixIfNeeded:", - "_fileNameExtensionsForType:forUseInSavePanel:", - "nts_PeopleAtRemoteLocation:", - "refresh:", - "originalImageSizeCache", - "_initWithImageSource:imageNumber:properties:", - "selectColumnIndexes:byExtendingSelection:", - "bytes", - "showsControlCharacters", - "resetFlushDisableCount", - "persistentStoreType", - "_stopSkippingSnapshotUpdates", - "_selectFirstEnabledCell", - "setNeedsDisplay", - "isNegation", - "backgroundColors", - "currentControlTint", - "setHasHorizontalRuler:", - "stringForStatus:", - "vCardControllerWithUIController:", - "clientIndexToGridIndex:", - "prepareSavePanel:", - "_web_URLFragment", - "_unload:", - "_processMetadataNode:", - "_multipleValuesObjectAtIndexPath:", - "_hashMarkDictionary", - "outlinesCells", - "setDuplicates:", - "loadSuiteWithDictionary:fromBundle:", - "elasticWidth", - "rowForItem:", - "setPreviewView:", - "_createAlert", - "_setFirstResponderNode:", - NULL, - "fontColor", - NULL, - "printOperationWithView:", - "initWithPath:delegate:timeout:", - "_gridStepForAxis:", - "_performDragOperationForFilenameDrop:asChildOfNode:atIndex:", - "previousKeyView", - "initWithContentRect:", - "_colorForConnection:", - "parentForItem:", - "_bonafiedDeallocHelper", - "dataStampForTriplet:littleEndian:", - "_resetPostingCounts", - "allocateSpaceForLen:added:", - "viewWithFrame:filter:", - "load", - NULL, - "setAffineTransform:", - "queryHitResultsFilterUTIs", - "setTimestamp:", - "openReadStream:", - "saturationComponent", - "becomeFirstResponder", - "setUID:", - "_fieldEditor", - "numberOfItemsInIconView:", - NULL, - "darkerOf:and:opacity:", - "setResource:", - "_engravedBoldDisabledForegroundTextColor", - "_storeExpandedState", - "descriptorWithTypeCode:", - "resetLayer", - "putRequestWithSession:file:URI:token:", - "_doSetAccessoryView:topView:bottomView:previousKeyView:oldView:", - "_threadedSave:", - "_stringToWrite", - "addPersistentStoreWithType:configuration:URL:options:error:", - "initWithTimeIntervalSinceNow:", - "sendDidReceiveChallenge:", - "dataReferenceWithReferenceToFile:", - "_shouldInstallToolTip:", - "createInputWithPortClass:forKey:attributes:arguments:order:", - NULL, - "_draggingUpdatedForReorder:proposedItem:proposedChildIndex:", - "_notifyDelegateIndexOfSelectedSubfieldDidChange", - "_fetchBatchForIndexes:", - "shiftModifySelection:", - "fetchPublicRecordForClass:withUniqueId:addressBook:", - "ikLayerWasAddedToSuperlayer", - "setKeyTimes:", - "moveToBeginningOfParagraphAndModifySelection:", - NULL, - "_viewVisibleBoundsChanged", - NULL, - NULL, - "setFocusedColorChipIndex:", - "_info", - "canBecomeKeyView", - "orderFrontTableOptionsPanel:", - "addReordedItemsToBrowserItems", - NULL, - "attributeIsReadOnly:", - "typeSelectString", - "allCategories:", - "updateFavoritesFromDefaults", - "verticalLineScroll", - "modalMode", - "startAnimation:forObject:keyPath:", - NULL, - "updateOptionsInfo:", - "_beginTableRow", - "setShadowRadius:", - "abDifferencesBetweenArray:", - NULL, - "setIdling:", - "runSharedEditorWithString:inView:atPoint:width:numLines:", - "setupShowcaseWindow", - "initWithProperties:suiteName:usesUnnamedArguments:classSynonymDescriptions:", - "inverseRelationship", - "_setSelectedNodes:", - "isCompositionIdentity:", - "_actionHasBegun:atIndexPath:", - "_reallocData:", - "_rangeOfTextTableRow:atIndex:completeRow:", - "_dispatchRequest:withPostHandler:requiringResult:", - "encodeConditionalObject:forKey:", - "topLevelObject", - "_setLastFocusRingView:bleedRegion:", - NULL, - "parametersViewForPatch:", - "drawsOutsideLineFragmentForGlyphAtIndex:", - "pop", - "_setWrapsDateComponentArithmetic:", - "RTFDFromRange:documentAttributes:", - NULL, - "isEPSOperation", - "sharedMagnifier", - "navNodeWithSimpleQueryString:searchScopes:", - "_loadKeyboardBindings", - "_autoSaveConfiguration", - "currencyCode", - "cellsHaveSubtitle", - "_displayPathForPath:", - "_startListeningToMouseMovement", - "_columnClosestToColumn:whenMoved:", - NULL, - NULL, - NULL, - "_isPortKeyInUse:", - "setBindVariables:", - "parseMetaSyntaxLeafResultShouldBeSkipped:", - "stringByDeletingPathExtension", - "allowsNonContiguousLayout", - "setHandlesContentAsCompoundValue:", - "imageWithContentsOfURL:options:", - "scrollBy:", - "lockBufferRepresentationWithPixelFormat:colorSpace:forBounds:", - "addObserverTextField:", - "transformedOriginalImageSize", - "setMatchedColor:", - "initWithKey:type:access:isHidden:shouldByDefaultInsertAtBeginning:", - "_handleDeviceIsAliveNotification:", - "_computedColorForNode:property:", - "proxySize", - "_copyWindows", - "runAutoPlay:", - "_sortedAETEElementClassDescriptions:", - "localizedDescription", - "sendMouseUpActionForDisabledCell:", - "pasteboard:provideDataForType:", - "typeOfFile:error:", - "bindTextureToCGLContext:textureUnit:applyInternalMatrix:externalMatrix:savedState:", - "grantRequestWithLockToken:", - NULL, - "nts_SaveWithFileLock:triggerSync:updateModificationDate:", - "_setSelectedWithoutNotification:", - "bottomColor", - "_generateSQLBetweenStringInContext:", - "imageForImageState", - NULL, - "_changeKeyState", - "halfSizePictureEdges:scale:", - "imageWithData:bytesPerRow:size:format:colorSpace:", - "removeToolTipForView:tag:", - "_moveTrackingArea:toRect:", - "loadWindow", - NULL, - "removeClient:", - "sourceModelForStoreAtURL:metadata:error:", - "enumerateSubIndices:", - "parseExtension:", - "insertStatement", - NULL, - "smartGroups", - "dispatchGroupDoubleClick:", - "nts_MembersOfGroup:", - "_targetViewDidMoveOrChangeSize:", - "_encodeDepth:", - "netService:didUpdateTXTRecordData:", - "setPaperSize:", - "updateLayoutAtIndexes:", - "_startRunMethod", - "appendBezierPathWithGlyphs:count:inFont:", - NULL, - "sharedTypographyPanel", - "acceptsFirstResponder", - "_filenameHasNonEmptyAcceptableFileType:", - NULL, - "nts_MatchesRecord:", - "_areWritesCancelled", - "_decodeByte", - "_canAcceptDocumentPreviewView:", - "_maxSizeFromUsableFrame:", - "_web_parseAsKeyValuePair_nowarn", - "createFirstLastSorting:part1:forPerson:", - "_offsetFromStartRect", - "_maxXTitlebarBorderThickness", - "quartzFilterManager:didModifyFilter:", - "_coreUIDrawBezelInRect:withClip:", - "netService:didNotResolve:", - NULL, - "shouldDrawOnMainThread", - "_imagesFromURL:forImage:fileType:extension:", - "fileWrapper", - "_copyCoreUILinearKnobDrawOptionsWithView:", - NULL, - "installViewport", - "_accessibilityButtonUIElement", - "setTextAttributesForNil:", - "_windowDying", - "filterWithFilterSpec:intype:outtype:", - "_defaultMessageAttributes", - "_mouseInside:", - "_getColorFromImageAtPoint:", - "setResizeWindow:", - "createDirectoryAtPath:withIntermediateDirectories:attributes:error:", - "_controlTintChanged:", - "clear:", - "controlViewWillResignFirstResponder:", - NULL, - "browser:typeSelectStringForRow:inColumn:", - NULL, - "insertPopItemWithTitle:andObject:", - "isExpandableAtArrangedObjectIndexPath:", - "_offsetSelectedKeyFramesByOffset:primaryKeyFrameIndex:primaryTimeLineIndex:", - "recursivelyRemoveQFilterCellViews:", - "_setAllowedItems:", - "window:shouldPopUpDocumentPathMenu:", - "createTexture", - "textViewDidChangeSelection:", - "startWatchingLDAPCards", - "fileListOrderedByFileProperty", - "relationship", - "nts_SubgroupsOfGroup:", - "_userSelectSingleRow:", - "updatePropertyWidth:andComparisonWidth:", - "intersectHashTable:", - NULL, - "selectionRectAdded", - "reloadThumbnailAtIndex:", - "isPredicateSearchingEnabled", - "_monitorKeyBinding:flags:", - "_initQLAccessiblity", - "replace:", - "_imageForColorPicker:", - "fileAttributesToWriteToFile:ofType:saveOperation:", - "normalizeFindOptions:", - "_keychainItem", - "_writeFontInRange:toPasteboard:", - NULL, - NULL, - "deleteRows:atIndex:", - "_supportsSimultaneousSegmentAndLabelTrackingWithEvent:segment:", - "_scrollColumnsForScrollerIncrementOrDecrementUsingPart:", - "_messageString", - "_isEditingTextView:", - "resetOptionsInfo", - NULL, - "_syncToChangedToolbar:itemMoved:", - "indexOfFirstRangeContainingOrFollowing:", - "runModalForDirectory:file:types:", - "_hideWithoutResizingWindowHint", - "removeTexturesInContext:owner:", - "_initWithCredentials:owner:host:port:scheme:", - "_handleCommand:", - "sharedInstance", - "writeFilter:toLocation:", - "setIndeterminate:", - "textureIsPacked", - "_CGImageRef", - "_clearTableCells", - "_actualOrderingFilePropertyAscending:", - "clearRecentDocuments:", - "initInNode:recordRef:", - "_convertersListMutex", - "_handleSelectionInFocusRingMode:", - "dateWithTimeIntervalSinceReferenceDate:", - "createUsersDictionaryFromNames:inNode:", - "copyDeepStateFromMovie:", - "popGlyph:", - "chainChildContext:", - "initWithPath:traverseLink:", - NULL, - "originalSize", - "validate", - "initWithCapacity:compareSelector:", - "_accessibilityUIElementForPartCode:", - NULL, - NULL, - "viewWillBecomeActive", - "__setDictionaryRepresentation:", - "stopEditing", - "interpretEventAsText:forClient:", - "shouldProceedAfterError:copyingItemAtPath:toPath:", - "_shouldRestoreSharedPreviewViewForURL:", - "horizBlur16ROI:destRect:", - NULL, - "setBidiLevels:forGlyphRange:", - "_selectedRanges", - "setFeature:isEnabled:", - "setupSlider:input:", - "xHeight", - "_parseArgumentsWithSeparator:", - "_addOutput:forKey:", - "enumerateRects:outRect:", - "_scriptingDateDescriptor", - "attributedStringForZero", - "_unlockQuickDrawPort", - "setBaseAffineTransform:", - "characterIndexAtPoint:", - "backgroundHasAlpha", - NULL, - "openWithApplication", - "drawCrayonLayer", - "setImportsGraphics:", - "_dateIsAM:", - "isUsingDefaultAddressBookDirectory", - "sharedDocumentController", - "_buildCursor:cursorData:", - "setState:", - "setupAsPeoplePicker:", - NULL, - "imageExporterRegistryTimestamp", - "_allowAnimated_setBackgroundFilters:", - "setSubviews:", - "_canCreateCollapsedSpecifierFromRangeRecord:", - "_resizeForMetal:style:topHeight:bottomHeight:", - "setImageScaling:", - "_vCardKeysForPhoneLabel:", - "setRed:green:blue:alpha:", - "_coreUIBorderDrawOptions", - NULL, - "_generateErrorDetailForKey:withValue:", - "setValue:forProperty:recordCouldBeInDatabase:", - "_prepareResultsFromResultSet:usingFetchPlan:", - "_continuousCheckingAllowed", - "_distillFilterList:", - "_selectorDictionary", - "_scaledBackground", - "initializeBackingStore:sentinel:", - "_stopRun", - "_imageKitViewClass", - "setClientData:", - "isEqualTo:", - NULL, - "rootData", - "hasMarkedText", - "scopeButtonAction:", - "orderOut", - "printOidAsDecimal:", - "shapeWithCGSRegion:", - "outlineViewItemDidCollapse:", - "commandDescriptionsInSuite:", - "allXMLNSAttributes", - "setRootGraph:", - "postNotificationNamed:", - "unlockDocument", - "_userSelectColumnIndexes:withNewAnchorColumn:", - "_setCacheWindowNum:forWindow:", - "vCardRepresentationOfRecord:", - "_batchCollapseItemsWithItemEntries:collapseChildren:", - "_rowHeightStorage:", - "initWithNSBitmapImageRep:options:", - "removeAllContentObjectsInCellOrControl:", - "_restoreInitialMenuPosition", - "_isAncestorOf:", - "_allBinderClasses", - "_doModalLoop:peek:", - "_subImageFocus", - "animationDidStart:", - "setDataRetained:", - "comboBoxTextDidEndEditing:", - "takeIntegerValueFrom:", - "_abCompareNotWithinIntervalFromTodayYearless:", - "abortTransition", - "hide", - "leftExpression", - "_isInsertingText", - NULL, - "_referralSignUpURLWithLookupPath:andApplicationID:", - "_menuItem", - "_deselectRowRange:", - "minimumIntegerDigits", - "isAsync", - "_listRequestPostHandler:", - NULL, - "nts_mailRecentsManagedObjectContext", - "_initTransactionWithRequest:synchronousFlag:delegate:", - "valueTransformer", - NULL, - "updateMovieFile", - "initWithStatement:forAdapter:", - "_processText:", - "setMinSize:", - "like:", - "_isDraggable", - "_computedStringForNode:property:", - "showGotoWithInitialFilename:", - "replyEvent", - "isDirty", - "prepareForDifferentCard", - "setShortMonthSymbols:", - "mappingForRelationship:forConfigurationWithName:", - NULL, - "scrollItemAtIndexToVisible:", - "initWithIconRef:", - "_registerRuleDelegateForNotifications", - "bindItem:withUID:", - "_setSearchSlice:toHaveAttributeName:inButton:", - "selectIdentifier:forPerson:byExtendingSelection:", - "_handleWordCallbackWithParams:", - "matchesAnyFile", - "panel:isValidFilename:", - "createTranslatedImageByX:Y:", - "_alignmentGridWidth", - "accessibilityIsRowsAttributeSettable", - "hasText", - "_prepareConst:inAttribute:sensitiveOptions:", - "_conversionChainFrom:to:", - NULL, - "copyThumbnailImage", - "_detachFromParent", - "_relativeURLPath", - "_wrappingAttributes", - "startAutoscroll", - "handleKeyDown:inNode:view:", - "_thumbnailThread:", - "setNavDataSource:", - NULL, - "converterLockFileName", - "nicestRenderingPrepareExpendStep:", - "_accessibilityConfigureToolbarItem", - "numParts", - "setDisplayColorSpace:", - "scriptErrorNumber", - "_cancelDelayedShowOpenHandCursor", - "initWithFilterArray:", - "outlineView:willDisplayOutlineCell:forTableColumn:item:", - "setKeyEquivalentFont:size:", - "valuesForKey:", - NULL, - "changeInstantField:", - "ruleEditor:displayValueForCriterion:inRow:", - "_key", - "_coreUIWidget:", - "_listTypeDescriptions", - "makeStale", - "layoutParagraphAtPoint:", - "invalidateTransformedImage", - "clip:", - "ascender", - "putPropertyInOtherMenu:", - "revertToSavedFromFile:ofType:", - "_SFCertificatePanel_disclosureStateChanged:", - "_scaleFactor", - "didOpen", - "imageColorSpace", - "_firstJobPageNumber", - "_containsIMKeys:", - "_lockWaitingForOperation", - "_isBindingEstablished:", - "metadataForKey:", - "rulerAttributesInRange:", - "setAttachmentCell:", - "_attachmentCellForSelection", - NULL, - "setInputsVisibilityMask:", - "disableHeartBeating", - "loadLibrary:", - "_valueTypeForParameter:", - "executableArchitectures", - "_gaugeImage:", - "_proxyInitWithContainer:getter:", - "setPressedImage:forControlTint:", - "isHiddenOrHasHiddenAncestor", - "rangeOfTextList:atIndex:", - "setStores:", - NULL, - "_themeContentRect", - "_menuItemViewerChangedFrame:", - "CA_lastPathComponent:", - "unSelectedImageBackgroundPiece", - "frameOfCellAtColumn:row:", - "data", - "alternateMnemonicLocation", - NULL, - "_maximumItemViewerHeight", - "curveToX1:andY1:andX2:andY2:andX3:andY3:", - "_mouseDragged:", - "_setFrameFromHIViewFrame:", - "applyPaste", - NULL, - "_accessibilityIsSupportedPartCode:", - NULL, - "fontDescriptorWithSize:", - NULL, - "_notifyEditorStateChanged:", - NULL, - "_cffireTime", - "removeFilter:", - "setupSearchResults", - "resetHUDFadeTimer", - "_indexOfNode:inOrderedNodes:", - "vCardRepresentationOfRecords:", - "orderFrontSpacingPanel:", - "dateWithCalendarFormat:timeZone:", - NULL, - "_reconcileToExtensionDescription:suiteRegistry:", - "_rowHeaderShadowSurfaceIsShowing", - "vectorWithPoint:", - "nts_Subscriptions", - "empty", - "setPublicID:", - "_isAppSmartFolderNameUsed:", - "_doPostColumnConfigurationDidChangeNotification:", - "_isEmptyMovie", - "_disableTrackingArea:", - "_drawKeyboardFocusRingWithFrame:", - "isNativeName:", - "runMode:beforeDate:", - NULL, - NULL, - "_addMultipleToTypingAttributes:", - "dataCell", - "_installCocoaWindowEventHandlers", - "_setDisplayedView:transition:willShowPreview:", - NULL, - "alternateImage", - "gotoPosterFrame:", - "computeTableHeight", - "setValue:forKeyFrame:controlType:", - "allowsTickMarkValuesOnly", - "unchainContext", - "drawFocusRing", - NULL, - "_freeData", - "imageFlow:didSelectItemAtIndex:", - "willRemoveCacheNodes:", - "_pauseLayerTreeRenderingForWindowOrderOut:", - "setTopBorderColor:", - "drawsWithFinalCutStudioCompatibleColors", - "_drawerDefaultRightTrailingOffset", - "andPredicateOperator", - NULL, - "_multipleValueForKey:atIndex:", - "_patchFromComposition:", - "removeMovieFromIdleList", - "_scriptingRectangleWithDescriptor:", - "_setFrameSize:forceScroll:", - "setSidebarOutlineView:", - "createFirstLastSorting:part1:", - "bestLocationRep", - "URLProtocol:didFailWithError:", - "_attachSheetWindow:", - "stopTracking:at:inView:mouseIsUp:", - NULL, - "drawGridInClipRect:", - "rotateImageRight:", - "statusForABPerson:", - "_generateScaledBackground", - "adjustedDocumentPreviewFrame:withMinSize:maxSize:", - "speechSynthesizer:willSpeakWord:ofString:", - "_surface", - "_replaceObject:forKey:", - "entities", - "isLoaded", - "relativePosition", - "initWithUnsignedLong:", - NULL, - "purgeable", - "load:", - "setQueryTitle:", - "setCachedWindow:", - "uniqueSpellDocumentTag", - "setGraphicsState:", - "_invalidateResourceForGraphicsContext:", - "_scriptingInsertObject:inValueForKey:", - "setIsFileProperty:displayed:", - "_setSavedDelegate:", - "pageRef", - "_setModalWindowLevel", - "scrollColumnToVisible:", - "removeAllToolTipsForView:withOwner:", - "names", - "hyphenCharacterForGlyphAtIndex:", - "_sheetHeightAdjustment", - "_announce", - "mouseCell", - "sharedInit", - "proposedCredential", - "initWithFileAtPath:", - "templateViews", - "_setPrinter:inPrintSession:", - NULL, - "windowDidChangeScreen:", - "mouseInside:", - NULL, - NULL, - "importedCards", - NULL, - "HTTPMethod", - "_flushCaches", - "objectValueSupportsEnabledState:", - "_unshowOpenHandCursor:", - NULL, - "_incrementLocalProxyCount", - "isCardPaneVisible", - "setCreatesSortDescriptor:", - "apply", - "addSubview:", - "setGoverningAlias:", - "_expandItemEntry:expandChildren:", - "setAncillaryData:", - "mouseExited:", - "_processHeadElement:", - "composite:over:", - "_dispatchRequest:requiringResult:", - "isExtensionHidden", - "_proxyLocator", - "setSourceAlias:", - "qdPort", - "columnAverageImage:extent:", - "linkWithCharacterRange:parent:", - "insertElement:atIndex:", - "setMaximumLineHeight:", - "reallySaveFilter:notification:", - "_addLibxml2TreeRepresentationToDoc:context:", - "_editOtherSliceKind:", - "downloadResource:", - "registerTaskName:withTaskDescriptor:taskOrder:", - NULL, - "uniqueNameForPerson:atPath:", - "windowDidBecomeKeyNotification:", - "_createFSRefForPath:", - "trackWithEvent:inView:withDelegate:", - "saveWithGlyphOrigin:", - "writeToFile:ofType:originalFile:saveOperation:", - "convertNeutralTemperature:tint:toX:y:", - "messagingAddressesWithService:owner:withAddressBook:", - "_getRemainderFrame", - "extract1ROI:destRect:", - "setHorizontalEdgePadding:", - "visibleRect", - "unlockMipmapItem:", - "setMouseDownLayer:", - "rectForBlock:layoutAtPoint:inRect:textContainer:characterRange:", - "stringByAppendingFormat:", - "iconForFile:", - "initWithScrollView:orientation:", - "ordinalityOfUnit:inUnit:forDate:", - "headerLevel", - "stamp", - "acceptColor:atPoint:", - "verticalBoxAddROI:destRect:userInfo:", - "response", - NULL, - "compositionPickerViewWillStopAnimating:", - "removeCollection:", - "_affectedExpandedNodesForNode:", - "beginUpdateBuffer:colorSpace:", - NULL, - NULL, - "setDictionaryRef:", - NULL, - NULL, - NULL, - "_validateViewIsInViewHeirarchy:", - NULL, - "hideHUDNow:", - "_drawingHIView", - NULL, - "instanceMethodFor:", - "_uploadLocalFileAtPath:toPath:withProps:andHeaders:", - "initWithGraph:", - "_didPresentDiscardEditingSheetWithRecovery:contextInfo:", - "discardCursorRects", - "_iconForOSType:", - "nextIndexInFreeFormLayoutWithDirectionKey:currentIndex:", - "_useIconNamed:from:", - "releaseGlobally", - "_layoutRowStartingAtIndex:withFirstItemPosition:gridWidth:", - "tokens:", - "allowAliasing", - "_filenameHasAcceptableFileType:", - "_chooseIdentitySheetDidEnd:returnCode:contextInfo:", - "registerName:withNameServer:", - "_applicationDidLaunch:", - "copyPixelsFromBounds:toSharedCGLContext:usingInternalFormat:", - "styleMask", - "emptyRectSet", - "_asciiDescription", - "_clearRememberedEditingFirstResponder", - "_cleanUp", - "toolTipForView:cell:", - "_setupImages", - NULL, - "setOpaqueShape:", - "registerObservingForAnalyzableKeyPath:", - "encodeNXObject:", - "hasSpaces:", - "initWithTitle:andURL:", - "instanceMethodDescFor:", - "disableFlushWindow", - "releaseSegment:ofSize:", - "newSelectStatementWithFetchRequest:", - NULL, - "setCaseSensitive:", - "_generateJoinSQLStringInContext:", - "speed", - "zeroPairedEntries", - "selectedGroup", - "_shouldProceedAfterErrno:linkingItemAtPath:toPath:", - "_formatObjectValue:invalid:", - "abortNicestRendering", - "initWithPath:documentAttributes:", - "_getConfigRequestPostHandler:", - NULL, - "_autoSizeView:::::", - "graphNode", - NULL, - "initWithObjectSpecifier:comparisonOperator:testObject:", - "finishSession", - "_updateContent", - "addedMembers:toGroup:", - "popActiveListAnalyzer", - "imageBrowser:moveItemsAtIndexes:toIndex:", - "_toolTipTimer", - "groupsController:outlineViewSelectionDidChange:", - "finishDownloadDecoding", - "tabView", - NULL, - "nts_hasSharedInstance", - "removeObjectAtIndex:", - "setAlternateMnemonicLocation:", - "_removeOutputForKey:", - "initPropPatchWithURL:patchProperties:deleteProperties:", - "currentImageIsAnimated", - "localDateOccurringOnSameCalendarDayAsDateInGMT:", - "_tokenizeCharactersAdjacentToSelectionForTextView:terminatorsNeeded:", - NULL, - "_drawUnifiedToolbarBackgroundInRect:withState:", - "lockOperation", - "_getInputTopLine", - "labelSizeForBounds:", - "_needsViewerLayout", - "onlineStatusButton", - "rearrangeObjects", - "_drawNode:bounds:", - NULL, - NULL, - NULL, - "_forceRedrawDragInsertionIndicator", - "_forceInsertionForObject:", - "initWithKind:options:", - NULL, - "backgroundStyleForHighlight:", - "_postscriptName", - "knobLayer", - "allResolutions", - "setParameter:forOption:", - "nextUnicodeStringStopTokens:quotedPrintable:trim:", - "addOriginalWidth:", - "magicCookie", - NULL, - "removeFavoriteInWindow:", - "setCalculatesAllSizes:", - "setIcons:forAnimationFilenames:", - "_drawRect:clip:", - "startPlayer:", - "letterCharacterSet", - "awakeAfterUsingCoder:", - "reverse", - "__invalidateInspector:", - "responseAsString", - "setNumberOfItems:", - "setShowIdentityBadges:", - NULL, - "localizedDisplayName", - "prepareRenderingOrderingWithIndexes:", - "generateDefaultThumbnail", - "addColumnFilter:forColumnTitle:andIdentifier:", - "copyBindingsFromObject:toObject:", - "selectedTextColor", - "patternRepeatROI:forRect:userInfo:", - "mergeSimilarMultiValuesForPerson:", - "dateStyle", - "blurVerticalPass7ROI:destRect:", - "replaceAndFindInView:", - NULL, - NULL, - "niceImageForSize:forGLRendering:cacheIt:", - "effectsDisabledIcon", - "_reserved_SFCertificateTrustPanel", - "_drawDropHighlightAroundRect:isSelected:", - "drawAlphaFrame:", - "encodePoint:", - "edited:range:changeInLength:", - "_selectItem:", - "_drawTitledFrame:", - "layoutManagerDidInvalidateLayout:", - "_minExpandedFrameSize", - "setupAuthType:", - "_propertyKeyFromElement:withName:", - "_bonafiedDealloc", - "generateSQLStringInContext:", - "characterBuffer", - "_attributedValuesFromStringValues:", - "isSubclassOfClass:", - "_refreshFormatDescriptionsAttribute", - "accessibilityHelpAttribute", - "_dateFormatter", - "loadCompositionFromFile:", - "_discardCursorRect:", - "_cellForObject", - "unlockBufferRepresentation", - "currentCommand", - "_setBackgroundTransparent:", - "sharedTableOptions", - "_propertyType", - "addFieldTypeToDictionaryRef:", - "_fixedSelectionRangesForRanges:affinity:", - NULL, - "_searchFieldDoRecent:", - "_shouldByDefaultInsertAtBeginningOfRelationshipForKey:", - "addObject:toPropertyWithKey:", - "_loadSavedLayout", - "stopObservingPreviewNode", - NULL, - "source", - "setDisplayedStringsArray:", - "tokenFieldCell:displayStringForRepresentedObject:", - NULL, - "_adapter", - "showsStateBy", - "_pinnedInDirectionOfScroll:", - "_initFromGlobalWindow:inRect:styleMask:", - "zipFileArchive", - "_imageLevel_backgroundColor", - "_rulerAccViewSetUpLists", - "_scriptingRectangleDescriptor", - "startPoint", - "writeToURL:atomically:", - "_stopTimeOut", - "_centerScanSeparatorRect:", - "_initNicestRenderingCellOrderedIndexes", - "viewForPreferenceNamed:", - "_suppressNotification", - "_errSheetDidDismiss:returnCode:contextInfo:", - "_newShowFontsItem", - "dataSize", - "_updateWidgets", - "_shouldTerminate", - "_copyConnectionsOfView:referenceObject:toView:referenceObject:", - "typesetterLaidOneGlyph:", - "setCountPerLines:", - "readFromURL:ofType:error:", - "clearSelectedPagesDrawNow:", - "setRepeatCountForNextCommand:", - "_renderTimer", - "_updateTheaterWindowState", - "runModalPrintOperation:delegate:didRunSelector:contextInfo:", - "isInInterfaceBuilderApp", - "_setPrintEventRetrofitInfo:", - "syncPageIndexToScrollView", - "initSetLengthActionWithItem:withLength:", - NULL, - "_manuallyDrawSourceListHighlight", - "_adjustCancelButtonCellImages::", - NULL, - "clearPrivateFields", - "_updateWindowAnchor", - "_toggleShown:", - "_trustHeaderValue", - "outlineView:acceptDrop:item:childIndex:", - "setHeader", - "initWithCGLSContext:pixelFormat:options:", - "initWithView:height:fill:isHorizontal:", - "_generateSQLForProperty:startEntity:startAlias:keypath:inContext:", - "channelMapping", - "addPersonButton", - "_drawLineForGlyphRange:inContext:from:to:at:thickness:lineOrigin:breakForDescenders:flipped:", - "dbSnapshot", - "_changeKeyAndMainLimitedOK:", - "_resetDiscardMask", - "_invalidateAllRevealovers", - "endPageSetup", - "authenticationType", - "windows", - "_enableItem:", - "registerModelKeyPaths:unregisterModelKeyPaths:", - "setPassword:", - NULL, - "representedURL", - "startArrowScrolling", - "initWithMetadataManager:", - NULL, - "scrollScreenBy:", - "releaseTexturePackerAtIndex:", - "_allowAnimated_setBoundsSize:", - NULL, - "_collectItemRectsForViews:count:inBounds:", - "itemViewer", - "addFieldIndex:forKey:", - "resetCursorRect:inView:", - "_optionsForBinding:specifyOnlyIfDifferentFromDefault:", - "_createMutableSetValueWithSelector:", - "methodDescriptionForSelector:", - NULL, - NULL, - "updateOptionsUI", - "createRelationshipChildOnNode:forRelationshipDescription:", - "notifyPerform:", - "accessibilityIsTitleUIElementAttributeSettable", - "dateRangeTrimmedFromNearestEndWithDate:", - "_web_addDefaultsChangeObserver", - NULL, - "freeFormLayoutMoveWithDrop:", - "_generateSQLForString:expressionPath:sensitiveOptions:wildStart:wildEnd:allowToMany:inContext:", - NULL, - "_dataSourceNumberOfChildrenOfItem:", - "_appendStringInKeyNode:key:value:", - "serializePListKeyIn:key:value:", - "_textTransform", - "advanceToSingleByteString", - "_blueAlternatingRowColor", - "_windowDidResignKeyNotification:", - "hideOtherApplications", - "primaryKeyColumnDefinitions", - "_labelRectForTabRect:forItem:", - "initWithSearchStrategy:", - "timeZone", - "_commonNavFilepathInputControllerInit", - "_isToManyRelationship", - "resetStandardUserDefaults", - "_deregisterForAutosaveNotification", - "sizeToFit", - "isTransient", - "saveAndTriggerSync:udpateModificationDate:", - "initWithSQLEntity:ownedObjectID:andTimestamp:", - "addTabStop:", - "willApply", - NULL, - "_removeObjectsAtArrangedObjectIndexes:contentIndexes:objectHandler:", - "containerComponent", - "_finish_initialization", - "_layerTreeRendererPaused", - "_notifyIM:withObject:", - "horizBlur1ROI:destRect:", - "_calcTextRect:", - "smartGroup", - NULL, - "setDocumentURLs:withVisibleIndex:", - "_isNativeType:forDocumentClass:", - "_isRowVisible:", - "mergeCells", - "firstObjectCommonWithArray:", - "_allowsContextMenus", - "numberOfItemsInComboBox:", - "_cellFrame", - "validAttributesForMarkedText", - "_sizeWithSize:attributedString:", - "_setHidden:setNeedsDisplay:", - "setLeftChild:", - "regionWithCGRect:", - "_isSaveFilenameLengthLegal", - "_indexOfSubfieldAtPoint:inFrame:", - "pageIndex", - "raisesForNotApplicableKeys", - "_setShowingModalFrame:", - "decrementNumberOfThreadsAlive:withSessionUID:", - "refreshObject:mergeChanges:", - "interpolate:", - "_exitElement:tag:display:startIndex:", - "initWithHTML:options:documentAttributes:", - "continuouslyUpdatesValue", - NULL, - NULL, - "destinationTypeForMigration:sourceMetadata:error:", - "setSelectIntermediate:", - "_setConfigurationFromDictionary:notifyFamilyAndUpdateDefaults:", - "captureOutput:shouldChangeOutputFileAtURL:forConnections:dueToError:", - "stringWithContentsOfURL:encoding:error:", - "_setShouldDrawArrow:", - "_viewFromAttributeType:", - "_needsUpdate", - "removeObjectsInArray:", - "_moveItemFromIndex:toIndex:notifyDelegate:notifyView:notifyFamilyAndUpdateDefaults:", - "_setKeyboardFocusRingNeedsDisplayForTabViewItem:", - "createNewImageWithCallback:param:applyFilters:", - "resumeWithScriptCommandResult:", - NULL, - "fastMipmapItemWithExactSize:", - "_initLockRequest", - "canGoForward", - "_loadDeadKeyData", - "setShowsResizeIndicator:", - NULL, - "_setPathWithBuffer:", - "_scrollViewForColumnsDocumentViewFrameDidChange:", - "doSetValue:", - "buttonROI:forRect:userInfo:", - "highlightedItem", - NULL, - "mutableSet", - NULL, - "_setSingleValue:forKey:", - "rangesForUserCharacterAttributeChange", - "_forgetSpellingFromMenu:", - "adminGroup", - "_drawerDefaultTopLeadingOffset", - "outlineView:namesOfPromisedFilesDroppedAtDestination:forDraggedItems:", - "_copyValueOfDescriptorType:toBuffer:ofLength:", - "compositionURL", - "initWithAccount:", - "_setPredicate:", - "_manualDrawBackgroundForGroupRow:inRect:", - "attribute", - "_diskCacheSetSyncTimer", - "decimalNumberByMultiplyingBy:withBehavior:", - "_boundToHIView", - "execute", - "initWithNib:", - "cachePropertyValue:withKey:uniqueId:addressBook:", - "browserScroll", - "allModes", - "_setWantsToBeOnMainScreen:", - NULL, - "cacheItem:withUID:", - "lineFragmentPadding", - "initWithQuickTimeMedia:error:", - "_noteNote1:", - "SMPTETimeValue", - "registerSearchDataSource:", - "annotationType", - "_initWithResumeInformation:delegate:path:", - "noiseReduceROI:destRect:", - "setRegion:", - NULL, - "resizeWindow", - "_observeValueForKeyPath:ofObject:context:", - "_computeCameraDZ", - "_allocAuxiliaryStorage", - "deselectRow:", - "tableView:didChangeToSelectedRowIndexes:", - "LDAPQueryString", - "indexToRenderForNonOrderedIndex:", - "accessibilityNumberOfCharactersAttribute", - "control:didFailToFormatString:errorDescription:", - "setPreferredVolume:", - "_openFileWithoutUI:", - "suggestDiscloseTextClicked:", - "createConnectionFromPort:toPort:forKey:", - "__copyPixels:withSize:toCurrentFocusedViewAtPoint:", - "_setAutosizedWindowHeight:", - "handleMetadataCallback", - "_minBoundsHeight", - "_implicitObservationInfoForEntity:forResultingClass:", - "stringByAddingPercentEscapesUsingEncoding:", - "rotate:by:about:", - "initWithTreeController:keyPath:", - "dateByAddingYears:months:days:hours:minutes:seconds:", - "setImageWithURL:imageState:", - NULL, - "destinationEntityName", - "indexOfObjectIdenticalTo:inRange:", - "putLocalFileAtPath:toPath:withHeaders:", - "setContainerSpecifier:", - "_finalize_QCCGLContext", - "_addNote:", - "_mappingForConfigurationNamed:", - "drawDragHighlight", - "activeFileListDelegate", - "_expandToFitTextFields", - NULL, - "setURL:blockingUntilLoading:timeoutDate:transition:", - "_generateSQLForExpression:allowToMany:inContext:", - "_markLiveResizeColumnLayoutInfo", - "invalidateTextContainerOrigin", - NULL, - "fileSystemRepresentation", - "defaultGutterWidth", - "_handleObservingRefresh", - "_processPendingDeletions:withInsertions:withUpdates:withNewlyForgottenList:withRemovedChangedObjects:", - "compositionPickerView:willSelectComposition:", - "textView:willChangeSelectionFromCharacterRanges:toCharacterRanges:", - "setStroke", - "mouseDownFlags", - "_rangeOfTextTableRow:atIndex:", - "_fetchCurrentDirectory", - "thumbnailMaxSize", - "nibName", - "createTextureBufferFromTextureBuffer:target:bounds:flip:options:", - "_getAppleUseCoreUI", - "processProcessingInstruction:", - "emailList", - "_handleFileListConfirmedSelection:", - "initWithContentsOfFile:error:", - "defaultMappingGenerator", - "jumpSlider:", - "updateTextView", - "takeValue:forKey:", - NULL, - "_createTimer:", - "download:decideDestinationWithSuggestedFilename:", - "initWithSetFunc:ivarOffset:", - NULL, - "searchField:shouldChangeCancelButtonVisibility:", - "internalState", - "_web_URLByRemovingUserAndPath_nowarn", - "_makeRightCellKey", - "_removeKey:", - "setCropZoneBehavior:", - "_contentsTypeDescription", - "setAbsorbedCount:forIndex:", - "comparisonChanged:", - "_windowResizeCornerThickness", - "writeToFile:atomically:updateFilenames:", - "_setCancel:", - "minimumFontSize", - "hueComponent", - "restoreAttributesOfTextStorage:", - "initWithHTML:documentAttributes:", - "boundingRectWithSize:options:", - "_tile:", - "orderAdapterOperations", - "setHeadIndent:", - "viewTranslationCallback:whichView:mousePt:", - NULL, - "_doUpdateServicesMenu:", - "controlTextDidBeginEditing:", - "windowWithWindowNumber:", - "initWithQuickTimeMovie:disposeWhenDone:delegate:error:", - "gridIndexToClientIndex:", - "_old_initWithCoder_NSTabViewItem:", - "accessibilityColumnIndex", - "insertPages:", - "setQuoteBinding:", - "initWithJSString:", - "deselectItemAtIndex:", - "runModalForCertificates:showGroup:", - "_subrowEqualing:inArray:", - "_popTableState", - "disappearingItemCursor", - NULL, - "next", - "firstCharBounds", - "editingTextRect", - "makeLocalPath:", - "abEndOfParagraphStartingAtIndex:", - NULL, - "addMoveOperationFrom:to:", - "setShowsStateColumn:", - "_noise3d:y:z:", - "retainCount", - NULL, - "setCurrentConstructionContext:", - "_size", - NULL, - "initWithMovie:timeRange:error:", - "stuckPixelElimination:threshold:phase:", - "userKeyEquivalent", - "initWithCarbonWindowRef:takingOwnership:disableOrdering:", - "askReviewDocumentsWithClient:documentCount:", - NULL, - "_drawDragBoundries", - "_setSelectionColorRed:green:blue:", - "setupImageBackgroundLayer", - "panTiltSpeed", - "_deleteSlice:", - "isSizeDisplayedForNode:", - "_shouldSmoothFonts", - "initWithBytes:length:encoding:", - "tickMarkValueAtIndex:", - "_postItemDidExpandNotification:", - "valueWithUniqueID:inPropertyWithKey:", - "knowsPagesFirst:last:", - "_configureLabelCellStringValue", - "_lockForWriting:", - "_getCollections", - "_setDataForkReferenceNumber:", - "beginTime", - "decodeForkWithData:count:CRCCheckFlag:", - "_registerClearStateWithUndoManager", - "_generateModel:", - "newSelectionIndexesWithIndexesInRect:withModifier:", - "coerceData:toTextStorage:", - "setIntValue:", - "outlineView:mouseDownInHeaderOfTableColumn:", - "secondaryInit", - "centerToPosition:", - "_web_isToday", - "endParagraph", - "flipImageVertical:", - "setDisableCountDown:", - "setStringParameterValue:to:", - "registerCoercer:selector:toConvertFromClass:toClass:", - "preloadWithQuality:", - "selectedControlColor", - "initWithWindow:delegate:", - "isSelecting", - "setObservingToModelObjectsRange:", - "maximizeSize:", - "_fireFindIndicatorTimer:", - NULL, - "finished", - "_configureGreyButton:index:", - "initWithInfo:withRepository:", - "canClickDisabledFiles", - "stringByDeletingLastPathComponent", - "encodeInt32:forKey:", - "opaqueShape", - "setCornerRadius:", - "_setUsesQuickdraw:", - "badgeLabel", - "accessibilityMaxValueAttribute", - "_titlebarHeight", - NULL, - "_childlessParentsIfSlicesWereDeletedAtIndexes:", - "writeParagraphStyle:", - "_rangeOfPrefixOfString:fittingWidth:withFont:", - "pauseSpeakingAtBoundary:", - "_createFontPanelRepFromCollection:removingHidden:", - "documentView", - NULL, - "_accessibilityIsModal", - "useSSL", - "destinationConfiguration", - NULL, - "setTextContainer:", - "classForAnnotationDictionary:", - "miniWindowFrameForItemFrame:canZoomFromCenter:", - NULL, - "isEnumeration", - "getObjectValue:forString:errorDescription:", - "encodeBycopyObject:", - "_runModalWithColor:", - "drawCapsule", - "trackKnob:", - "sync", - "entitiesForConfiguration:", - NULL, - NULL, - "_isCellSelected:", - NULL, - "channelLayout", - "setTextSizeMultiplier:", - NULL, - "dissolveToPoint:fromRect:fraction:", - NULL, - "_viewFromExpressionObject:", - "copyAllResources", - "hasValidObjectValue", - "_scriptingPointDescriptor", - "_adjustNibControlSizes", - "setDictionaryController:", - "setDisplayState:", - "_CAViewFlags", - "allowsDocumentBackgroundColorChange", - "setOriginalDontAskUnresolvedDataRefsFlag:", - "_descriptorOfType:withValue:", - "setSlideshowWasStartedWithStartRect:", - "drawRowIndexes:clipRect:", - "layoutSanityCheck", - "_menuItemViewFrameChanged:", - "initWithWhite:alpha:", - "serialize:length:", - "notifyObjectWhenFinishedExecuting:", - "_beginSrcDragItemViewerWithEvent:", - "addGroup:inGroupList:", - "drawBorderAndBackgroundWithFrame:inView:", - "usesItemFromMenu", - "imageBrowser:titleOfCellAtIndex:shouldEndEditing:", - "pressedImage", - "fileHFSCreatorCode", - "setLineHeightMultiple:", - "_sendDelegateWriteRowsWithIndexes:inColumn:toPasteboard:", - "_currentTitleAttributes", - "_drawBackground:", - "_setLineColor:", - NULL, - "setLineBreakMode:", - "initWithAttributedString:", - "pixelFormatM_If", - "displayValueForObjectValue:", - "_setGlyphGenerator:", - "cellForProxy", - "goForward", - "_positionsMenuAsPullDown", - "_updateAttributesFromAudioChannelVolumes", - "tmpNameFromPath:extension:", - "setPort:", - "setArgumentBinding:", - "popSubnode", - "_imageToDrawRefreshingCacheIfNecessaryForSize:", - "selectPrevious:", - "ignoreSpelling:", - "_addToOrphanList", - "advanceToEOLSingle", - "_sortUsingDescriptors:", - "_refactor:", - "accessibilityAttributeNames", - "createThumbnailFromURL:", - "isContainer", - "createUniqueContextWithOptions:", - "allBundles", - "frameExceedsMaximumOpenGLViewport", - "detachInstanceInfo:", - "_rowType", - "allowsFileCreation", - "setUsesFindPanel:", - "_validateSubviewFrames", - "closeMenuToIntersectionWithNewMenu:", - "_setFieldEditorUndoManager:", - "_setupAuxiliaryStorage", - "addAuthInfo:", - NULL, - "nts_TypeOfProperty:withAddressBook:", - "readFromData:options:documentAttributes:error:", - "initWithBytes:objCType:", - "_mainThreadCallback:", - "_hasAttributedStringValue", - "colorPanelColorDidChange:", - NULL, - "_updateWindow:withVisibilityState:", - "splitView:additionalEffectiveRectOfDividerAtIndex:", - "indexOfIdentityGroups", - "_kitBundle", - "mipmapWithSize:", - "supportedDecoderVersions", - "_accessibilitySplitterMinCoordinate", - "handleKeyboardShortcutWithEvent:", - "shouldSubstituteCustomClass", - "genericLabel", - "currentCalendar", - "rangeCount", - "displayMode", - "drawInteriorWithFrame:inView:", - NULL, - "_applicationStatusNotification:when:data:affectedASN:session:notificationID:", - "tighteningFactorForTruncation", - "otherMouseDragged:", - "qt_localizedUnknownErrorWithUnderlyingOSStatus:", - "_getCGCustomColorSpace", - "_refreshStreamsFromCallback", - "shadowState", - "configurePersistentStoreCoordinatorForURL:ofType:error:", - "lanczosTable", - "getInputWhiteParams", - NULL, - "alwaysPresentsApplicationModalAlerts", - "segmentedBufferAddress", - "_tryChallenge:", - "stopAutoUpdate", - "_initContent:styleMask:backing:defer:screen:contentView:", - "_selectModuleOwner:", - "_scriptingReplaceObjectAtIndex:withObjects:inValueForKey:", - "_setMouseTrackingForCell:", - "bufferDestination", - "_mostCompatibleCharset:", - "relativeLineToPoint:", - "findCombinationForLetter:accent:", - "signUpURLWithApplicationID:", - "_sendDelegateWriteIndexes:toPasteboard:", - "_sizeToFitColumn:withEvent:", - "convertViewRectToImageRect:", - "_setSinglePageScrolling:", - "compositionPickerView:performDragOperationOnComposition:sender:", - "setPreviewState:", - "setAttachment:", - "removeExisitingSyncSchedule", - "scrollWheelDelegate:", - "setVerticalPagination:", - NULL, - "setNumberOfSelectedItems:", - "_createScrollViewAndWindow", - "_web_isJavaScriptURL", - "_regenerateFormatter", - "encodeColumns", - "initWithPeople:parentGroup:addressBook:", - "initWithNotificationObject:", - "memberOfInputImage:", - "setPartialStringValidationEnabled:", - "mountedLocalVolumePaths", - "setFormattingDictionary:", - NULL, - "_validRememberedEditingFirstResponder", - "minimalSizeForText", - "beginDocument", - "_imageWithProgrammaticEffectsWithCompositeName:", - "bufferColorSpace", - NULL, - "initWithScope:", - "getRow:column:forPoint:", - "drawArrowedIndeterminateInteriorWithFrame:inView:", - "setInsertionPointColor:", - "firstRectForCharacterRange:actualRange:", - "tokenTextView:writeSelectionToPasteboard:type:", - "_centeredScrollRectToVisible:forceCenter:", - NULL, - "loadActions", - "mergeAttributesInto:", - "_configurationAutosaveName", - "_freeNonEssentialCaches", - "stopDelayedShowcase", - "_typographicLeading", - "canInitWithDataReference:", - "initWithAttributes:error:", - "textView:clickedOnCell:inRect:atIndex:", - "binderClassesForObject:", - "_clockAndCalendarTrackMouse:inRect:ofView:untilMouseUp:", - "markRecordWithGroupSubscription:", - "loadComposition:options:stateOK:", - "_collectItemRectsForLabels:count:inBounds:", - "rows", - "_old_initWithCoder_NSTableColumn:", - "fastMipmapItemForSize:forOpenGL:useMinimumQualityThreshold:", - "_dotMacEmailSigningUsage", - "textContainer", - "cacheMiniwindowTitle:guess:", - "invalidateLayoutForCharacterRange:actualCharacterRange:", - "removeUID:", - "_createPlusButtonIsRequired", - "setTextBlocks:", - "createTrustWithCertificates:policy:trust:", - "IMAVManagerStateChangedNotification", - "setSegmentSize:", - "getSavedNumVisibleRows:", - "fieldType", - "initWithDragInfo:tableView:completion:andRow:", - "_reducedSubpredicates:", - "printOperationWithSettings:error:", - "moveDownAndModifySelection:", - "topBorder", - "_iconRef", - "getCharacters:", - "_oldFirstResponderBeforeBecoming", - "initWithChar:", - "_setHasSeenRightToLeft:", - "_copyFlattenedPath", - "_insertionCharacterIndexForDrag:", - "initWithBitmap:rowBytes:bounds:format:", - "_shouldUpdateWindowFrame", - "_threadedImportTipCards", - "CTM", - "dateWithNaturalLanguageString:", - "delayedProcessGetInfoButtonClick:", - "_autoscrollDate", - "setZoomFactorY:", - "resourceBundles", - NULL, - NULL, - "initializeMaterialStructure:", - NULL, - "_fullCacheUpdateRecursive:intoRow:withIndentation:", - "_addTrackingRect:andStartToolTipIfNecessary:view:owner:toolTip:reuseExistingTrackingNum:", - "_lineFragmentDescription", - "removeDescriptorAtIndex:", - "trackEnumeratorWithMovie:", - "isNewPerson:", - "stringsByAppendingPaths:", - "deleteWordBackward:", - "_contextByfeContext:", - "setDynamicDepthLimit:", - "inputController", - "_compositeImage", - "setShowIdentityBadge:", - NULL, - "invokeServiceIn:msg:pb:userData:menu:remoteServices:", - "discardEditing", - "currencyGroupingSeparator", - "attributeColumns", - "QCImageKernelJavaScriptROIHandler:destRect:userInfo:", - "editingIndex", - "dismissWindow:", - "setShadowBlurRadius:", - "doIt", - NULL, - "_defaultProgressIndicatorColor", - "internCString:pointer:", - "drawSelectionArea:", - "initWithUIController:", - "newWithPath:prepend:attributes:cross:", - "setWidth:height:", - "abortEditing", - "_preferFilter", - "resetFormExcludingFields:", - "_isAnimating", - "vendorPointingDeviceType", - "_queryAccountForKey:synchronousFlag:delegate:", - "setShowsTrustButton:", - "_syncToChangedToolbar:itemRemoved:", - "__oldnf_containsString:", - "_insertDigit:", - "_addItemsInMenu:toTable:recursively:", - "_blankEvent:kind:", - "_parserableCollectionDescription:", - "_codeSigningAppleUsage", - "setNames:", - NULL, - NULL, - "imageWithData:", - "setPullsDown:", - "_makeCursors", - "_stretchWindowIfNecessaryToFitResizedColumnWithInfo:resizeColumnDelta:", - "PDFViewPerformPrint:", - "addClient:", - "_noLockForThread:", - "_dateRecorded", - "fetchedAddressBookSourceWithAddressBook:", - "previewView:didLoadPreviewForURL:", - "_prepPanel:showGroup:", - NULL, - "windowDidOrderOffScreen:", - NULL, - "_retainedObjectWithID:", - "showAsPerson:", - "_setScriptErrorExpectedType:", - "browser:validateDrop:proposedRow:column:dropOperation:", - "replacementObjectForArchiver:", - "setInitialToolTipDelay:", - "_undoManagerCheckpoint:", - "_setAnimationTargetRect:", - "_processPerformsInArray:", - "openFirstDrawer:", - "setSystemID:", - NULL, - "releaseCalendarSpecificResources", - NULL, - "setHeightTracksTextView:", - "rangeOfString:", - "_rowHeightStorageUpdateForInsertedRows:atIndex:", - "_windowFileButtonSpacingWidth", - "handleRollOverSelection:", - NULL, - "setShowsGetInfoButton:", - "_generateProperties", - NULL, - "snapsToDefault", - "selectedGRL", - "drawGlyphsForGlyphRange:atPoint:", - "removeIndex:", - "_previousKeyWindow", - "minColumnWidth", - "setMouseDownLocation:", - "issueCommandWithActionName:", - "_repeatTime", - "_finishInitialization", - "_contextImplByfeContext:", - "shouldStartEditingOnDoubleClick:key:", - "_valueForInputPort:", - "_invalidateFocus", - "hostName", - "keyForType:", - "_addQuoteForElement:opening:level:", - "_undoableSetCropPRSWithDisplay:", - "UIElementValue", - NULL, - "_oldValueForKeyPath:", - "_isTabEnabled", - "stripReconfiguringGRLs:", - "_drawThemeBackground", - "selectedFontChangedTo:", - "populateObject:withContent:valueKey:objectKey:insertsNullPlaceholder:", - "setPerMillSymbol:", - NULL, - "deserializeNewData", - "selectedImageFrame", - "turnObject:intoFaultWithContext:", - "_discardCursorRectsForView:", - NULL, - "insertRows:atIndex:", - "handleFetchRequest:", - "clearCurrentValues", - "usageInPreview", - "_viewSurfaceWillGoAway:", - "setDeferSync:", - "accessibilityInsertionPointLineNumber", - "setPaddingCharacter:", - "iconView:shouldTypeSelectForEvent:withCurrentSearchString:", - NULL, - "setDepthLimit:", - "nextText", - "reflectNewPageOn:", - "objectIDFactoryForSQLEntity:", - "initWithContainerClassID:key:proxyClass:", - "showAsCompany:", - "_removeTrackingRectsForView:stopTimerIfNecessary:", - "imageBrowser:titleOfCellAtIndex:didBeginEditing:", - "boundingBoxYAtRow:", - "initWithKey:appleEventCode:type:isOptional:presentableDescription:nameOrNames:", - "_nodeFromObject:objectIDMap:", - "setItemSupportedByiPhoto:", - "orderOutToolTip", - "horizontalCornerRadius", - "_editor:didCommit:withContext:", - "setDefaultFlatness:", - "toolTipColor", - "_postNetworkChangeNotification:", - "_hasSheetFactor:", - "control:textView:completions:forPartialWordRange:", - "classWithStore:andEntity:", - "_installRootMetricsHandler", - "framesProvider", - "_setDataSource:", - "domainOfDefinition", - "numberOfOperations", - "setLimit:", - "quiesce", - "stateImageRectForBounds:", - "_nodePreviewHelper", - "initWithDocumentURLs:controller:", - "deserializeNewPList", - "certSerialNumberIndex", - "_setConfigurationUsingName:domain:", - "addObject:objectIDMap:", - "containsWindowIdentifier:", - "_pointForTopOfBeginningOfCharRange:", - "indexSheetDidActivate:", - "_setUIConstraints:", - "_drawerIsOpen", - "deleteSelectedAnnotations", - "drawColor", - "windowDidEnableToolTipCreationAndDisplay", - "_recursiveOrderFrontSurfacesForNonHiddenViews", - "_setUpFoundationCoercions", - "applicationIconImage", - "webView", - "abProperURLWithString:", - "drawNormalInteriorWithFrame:inView:", - "_stopRendering:", - "newInsertedObjectForEntity:", - "_setRunningOperation:", - "waitUntilExit", - "textView:writablePasteboardTypesForCell:atIndex:", - "_crayonRowBelowRow:", - "autosaveExpandedItems", - "loadTextChars", - "_registerForAutosaveNotification", - "setSelectedGroup:", - "rulerMarkersForTextView:paragraphStyle:ruler:", - "prepareSelectStatementWithFetchRequest:ignoreInheritance:", - "setHorizontalLineScroll:", - "updateContext", - "removeAttribute:range:", - "textDidEndEditing:", - "supportsMutableFBENode", - NULL, - NULL, - "expandGroup:", - "ikInMainLoopWait:", - "_resizePostingDisabled", - "tokenFieldCell:readFromPasteboard:", - "_drawsOutsideBBox", - "updateCellOrControl:forMinValue:", - "_parseParagraphAttributesFromElement:attributes:", - "selectUp", - "dictionaryRepresentation", - "setCells:", - "containsPort:forMode:", - "SCTArrayByApplyingFunction:context:", - "stopObservingModelObjectsAtReferenceIndexes:", - "_releaseNodePreviewHelper", - "_checkInList:listStart:markerRange:emptyItem:atEnd:inBlock:blockStart:forCharacterRange:", - "_compatibility_seemsToBeVertical", - "_connectGraphUnitsForAudioOutputConnection:error:", - "computeRectOfRow:cacheHint:", - "imageWithCGLayer:options:", - "setFinalFrame:", - "_executePerformAction", - "comboBox:objectValueForItemAtIndex:", - "versionNumber", - "_handleFileListDidReloadChildrenForNode:", - "removeKnobLayer", - "cell:needInitialDataForKey:", - "_setHasActiveAppearance:", - NULL, - "enumeratorDescriptions", - "abortZoomPrefetchTask", - "configureForCanClickDisabledFiles:", - "draggingSequenceNumber", - "filterPasteboardWithPasteboard:", - "_separatorHeight", - "_traverseNode:depth:embedded:", - "setCharacterIndex:forGlyphAtIndex:", - "_terminateSendShould:", - "contentsOfDirectoryAtPath:error:", - "addAnimationGroup:", - "lockFilePath", - "setBoolParameterValue:to:inResolutionData:", - "parseCert:", - "_postFocusChangedNotification", - "setGhostCellCountOnTheLeft:", - "_parseDocumentAttributes", - "setWriteDefaultValue:", - "clockProviderNodeForConnection:", - "initWithDomains:Categories:Objects:Manager:", - "runBeforeDate:", - "clearCustomImage:", - "setShouldUpdateMarkers:", - "_animate:", - "URLHandleResourceDidFinishLoading:", - "_stringByReplacingChar:withChar:inString:", - "newReferenceObjectForManagedObject:", - NULL, - "isSourceType:", - "_printDataSourceWarning", - "browserDatasourceChanged", - "_releaseRFC822NamesArray", - "_paletteLabel", - NULL, - "_storeExpandedFrameSize", - "_000104", - "doCommandBySelector:commandDictionary:client:", - "setTooltipDelay:", - "largeImageData", - "defaultValueForParameter:", - "horizontalRulerView", - "_canUseTiledBackingLayer", - "hotspotEnumeratorWithNode:", - NULL, - NULL, - "createAlternateNameForPerson:", - NULL, - "calculateSetSize:::", - "choiceMenu:", - "sourceEntityName", - "exceptionRememberingObject:key:", - "initWithContainerClassID:key:methods:proxyClass:", - "rightMargin", - "_decodeDownloadData:dataForkData:resourceForkData:", - "mouseDownCanMoveWindow", - NULL, - NULL, - "imageRepsWithData:", - "sqlType", - "iconView:didClickOnDisabledCell:", - "addCertificate:toKeychain:", - "_trackingHandlerRef", - "_initWithContentsOfURL:ofType:", - NULL, - "remove:", - "startMagnifying:", - "didAccessValueForKey:", - NULL, - "setZoomsOnSelection:", - "_addColumnSubviewAndAnimateIfNecessary:", - "rulerView:didAddMarker:", - "createTablesForEntities:", - "drawers", - "_deactivateDocumentPreview:", - "visualizePatchExecution", - "_okClicked:", - NULL, - "_hideTooltip", - "_itemsFromRowsWithIndexes:", - "_cancelEditOnMouseUp", - "drawMessageInVisibleRect:", - "_fileButtonOrigin", - "_updateMenuItemIcon:", - "isSelectable", - "animateScrolling", - "addFieldNameToDictionaryRef:", - "_generateManyToManySQLStringInContext:", - NULL, - "_updatePanelTitle", - "_enableLayout", - NULL, - "timeIntervalSince1970", - "_actualPreviewType", - "subtractRegion:", - "_invitationFromContentsOfFile:", - "_resolveMarkerToPlaceholder:forBindingInfo:allowPluginOverride:", - "_filterPredicate", - "pixelFormatWithName:", - "_drawRulers:", - "_willChangeValuesForKeys:", - "insertItemViewer:atIndex:", - "binaryAttributes", - "setAutoPlay:", - "lastFilterElement", - "greenReconstruction:edges:phase:scale1:scale2:decisionImage:votingImage:", - "boundsRotation", - "privateVCardEnabled", - "startSlideshowWithDocumentURLs:fromView:controller:itemIndex:", - "_untitledNumberForDocument:", - "_findDictOrBitmapSetNamed:", - "setTransparent:", - "foreignEntityKeyForSlot:", - "purgeKeyFrameCache", - "process:", - "principalIDWithName:andOwner:", - "_canonicalRequestForRequest:allowCF:", - "_switchImage", - "runEditorForTimeLine:atKeyFrame:forTimeLine:controlType:inView:atPoint:", - "initWithOptionFlags:maxSize:maxAge:", - "user", - "_descriptor", - "addBinder:", - "paragraphGlyphRange", - "initPropFindWithSession:withDepth:URI:lookingForProps:", - "setTitleCell:", - "setCell:", - NULL, - "indexDataSourceArray:", - "componentsToDisplayForPath:", - NULL, - "_fetchExpandedState", - "connectO3Console:", - "setElementName:", - "scrollView", - "indexPathWithIndexes:length:", - "setActionName:", - "addWindowController:", - "_valueForKeyPath:ofObject:mode:raisesForNotApplicableKeys:", - "_findCoercerFromClass:toClass:", - "loadInForeground", - "initWithFrame:styleMask:owner:", - "descriptionForDebugger", - "selectNextKeyView:", - "_cycleWindowsBackwards:", - "baseSpecifier", - NULL, - NULL, - "_parseOpenGuide", - "_getValue:forKey:", - "_recursiveWindowDidEnableToolTipCreationAndDisplay", - "_validateExtrasButton:", - "setFrameUsingName:force:", - "openGLRenderingLockedForUnsynchronizedOperation", - "_setCertSigningUsage:", - "setPlugin:enabled:withAuthorization:", - "_runLoopThread:", - "enumeratorOfInputBottomLineParams", - "mipmapSize", - "_keysForPMKeys:", - NULL, - "initWithRootAttribute:", - "changedGroups:", - "getThreadResult", - "_toOneRange", - "notifySelectionDidChange", - "abDecodeBase64", - "_setAltContents:", - "prepareBetween:", - "setImageValue:", - "_drawBackgroundForGlyphRange:atPoint:parameters:", - "GDBDumpCursorRects", - "_newUniqueIdForTable:", - NULL, - "initWithCell:", - "setMinContentSize:", - "initWithString:attributes:", - "convertPoint:fromView:", - "refreshRow:", - "takeIntValueFrom:", - "_removeFileAtPath:handler:shouldDeleteFork:", - "isSynchronous", - "postsFrameChangedNotifications", - "phoneticMiddleName", - "indexOf:::", - NULL, - "allowsEditingMultipleValuesSelection", - "_prefersToBeShown", - "createMinimalSharedContext", - "_trackSelectedItemMenu", - "notifyCellsForChanges:", - "_allowAnimated_setFrameOrigin:", - "pixelFormatRGBAf", - "setThumbnailSize:", - "draggingSourceOperationMask", - "safeCloseReadStream:forceClose:", - "expiresDate", - "setAppearanceStyle:", - "setAllContextsSynchronized:", - "_boundingRectForGlyphRange:inTextContainer:fast:fullLineRectsOnly:", - "initWithEntity:andUUIDString:", - "_loadShaders:", - "_unformattedAttributedStringValue:", - "flatten:fromRect:format:colorSpace:", - "hideAddPeopleButton", - NULL, - "movieControllerBounds", - "_discardValidateAndCommitValue:", - "representations", - "_saveAppSmartFolderQueryNode:", - "sharedCoercionHandler", - "allowsColumnSelection", - "_shouldUseParensWithDescription", - "replaceLayoutManager:", - "parentRowForRow:", - "_computedStyleForElement:", - "recoveryAttempter", - "_multipleValuesObjectAtIndex:", - "setShowZoomMinMax:", - "invalidateSelectionBounds:", - "initCopyWithSession:sourceURI:destinationURI:token:", - "connection:willCacheResponse:", - "_web_URLByRemovingUserAndQueryAndFragment_nowarn", - "replacementObjectForCoder:", - "_performActivationClickWithShiftDown:", - NULL, - "dateWithNaturalLanguageString:locale:", - "matchingFontDescriptorsWithMandatoryKeys:", - "performSelector:object:afterDelay:", - "setValuesForKeysWithDictionary:", - "invokeSelector:withArguments:forBinding:object:", - "nextItemToUnbind", - "_scheduleWindow:forBatchOrdering:relativeTo:", - "_initWithSuiteName:commandName:implDeclaration:presoDeclaration:", - "window:didChangeToVisibleState:", - "setBorderColor:forEdge:", - "initWithSockaddrBuffer:", - "_drawerRightOffset", - "setVolatileDomain:forName:", - "registerThread", - NULL, - "_commitEditingDiscardEditingCallback:", - "setToolTipForView:rect:owner:userData:", - "_rfc822Name", - "setPortMaxValue:", - "rightMouseDraggedDelegate:", - "initWithConverters:softwareOnly:sourceTarget:sourceFormat:sourceColorSpace:destinationTarget:destinationFormat:destinationColorSpace:transformationType:", - "_secondsFromGMTForAbsoluteTime:", - NULL, - "certStatusFromDomainTrustSettings:isMixed:", - "drawCommentIcon:inContext:", - "_handleCurrentDirectoryNodeChanged", - "unselectedImage", - "moveToEndOfDocumentAndModifySelection:", - "inactiveColor", - "demosaic0:pattern:scale1:scale2:phase:redBlueSwap:hsp:hspe:green:gdec:gvdec:emask:sgreen:bhse:red:blue:", - "_addGrammarAttributesForDetailRange:detail:", - "savePDF:", - "showHSBView:", - "saveNameColumnWidth", - "isDeleted", - NULL, - "_dynamicToolTipManager", - "stopTheater", - "pauseAnimation:", - "imageFlow:writeItemsAtIndexes:toPasteboard:", - "croppedImageWithSize:", - "_getAllAttributesIncludeValues:", - NULL, - "tearOffTitlebarHighlightColor", - "registerToNotifications", - "initWithCGContext:options:", - "gel:over:opacity:", - "lowerBaseline:", - "pictureTakerCommonInit", - "_drawThemeContents:highlighted:inView:", - "_clearCachedTransientStateOfObject:", - "releaseGState", - "awakeFromNib", - "serviceConnectionWithName:rootObject:usingNameServer:", - "showValue:inObject:", - "level", - NULL, - "_abCompareWithinIntervalFromToday:", - "_isAnimatingScroll", - "extractStringFromLocalizedStringData:", - "_keyEquivalentSizeWithFont:", - "inlinePreviewURL", - "fogAtLocation:", - "_minYWindowBorderHeight:", - "setCanSelectHiddenExtension:", - "setSavedQueryData:", - NULL, - "indicesOfObjectsByEvaluatingObjectSpecifier:", - "addressBookCoreDataDatabaseFileName", - "_invokeJavaOverrideForSelector:withErrorAndOtherArguments:", - "canHighlightNode:", - "titleAtIndexes:", - "isHorizontallyResizable", - "JSContext", - "handleHelpQuery:", - "imageCropView:mouseUp:", - "closestTickMarkValueToValue:", - "initWithLeftExpression:rightExpression:modifier:type:options:", - "stopModalWithCode:", - "track", - "_requestIsCacheEquivalent:toRequest:allowCF:", - "hidesSharedSection", - "setReceiversSpecifier:", - "__image", - "flush", - "destinationURLForMigration:sourceURL:sourceMetadata:error:", - "rowForObjectID:after:", - "performSelector:onObject:withObject:waitUntilDone:", - "_beginCustomizationMode", - "__oldnf_stringForObjectValue:", - "changedMember:", - "_userSelectTextOfPreviousCell", - "smartInsertBeforeStringForString:replacingRange:", - "initWithName:reason:userInfo:", - "prototype", - "addComponent:", - "_nodesToDisplayForNodeInfo:", - NULL, - "parseRelativeDistinguishedName:indent:", - "abFileLock", - "_recentDocumentRecordsKeyForMenu:", - "_flattenMenuItem:", - "download:willSendRequest:redirectResponse:", - "_updateRenderFormat:", - NULL, - "_rangeToPrefetch", - "swapGlyph:withIndex:", - "initWithDictionary:forDocument:", - "tableRow", - "imageBrowser:titleOfCellAtIndex:shouldBeginEditing:", - NULL, - "setSimpleCommandsArray:", - "subarrayWithRange:", - "firstVisibleColumn", - "bottomBorder", - NULL, - NULL, - "SCTViewIdentifier", - "setInputSourceID:", - NULL, - "_restoreDefaultSettingsForSaveMode", - "startQuery", - "setSelectionKeys:", - "handleControlEvent:callRef:", - "initWithDynamicMenuItemDictionary:", - "_controlShadowColor", - NULL, - "scrollViewDidTile", - "_positionSheetAndDisplay:", - "draggedColumn", - "_availableChannelFromRegisteredChannels", - "_loadSystemScreenColorList", - "_initWithIdentifiers:values:labels:primaryIdentifier:", - "explicitURLOfSlideshowItemAtIndex:", - "acceptsDrop", - "destroyLayer", - "removeTrack:", - NULL, - "destinationType", - "_removeDeclaredKey:", - "isHighlighted", - NULL, - "_checkMiniMode:", - "sharedCertificatePanel", - "inputWhiteParamsAtIndexes:", - "parentCrayonRow", - "containsAttachments", - "initWithDocument:forStore:", - NULL, - "_imageRepsWithData:fileType:hfsType:expandImageContentNow:", - "_changedRowArray:withOldRowArray:forParent:", - "_setupDefaultTextViewContent", - "removeCachesForUID:", - NULL, - "descriptorWithInt32:", - "readablePasteboardTypes", - "applicationIcon", - "initWithInvocation:conversation:sequence:importedObjects:connection:", - "addSpecialGStateView:", - "_forceDisconnectOnError", - "_userActionForEvent:", - "pickerViewCommonInit", - "_commandFromEvent:", - "initialValueForKey:forCell:", - "setAppearance:forType:", - "_stateOK", - "shadowGroup", - "builtInPlugInsPath", - "_shadowFlags", - "didPushRenderState:", - "connectionUnitInputNumberForConnection:", - "valueInOrderedWindowsWithUniqueID:", - NULL, - "borderWidth", - NULL, - "scrollVerticalBy:animate:", - "updateSpellingPanelWithGrammarString:detail:", - "_continueMovementTracking", - "setTextContainerInset:", - "_applyAudioChannelMapFromAttributes", - NULL, - "isEditingWithObject:", - "getParagraphStart:end:contentsEnd:forRange:", - "spellServer:suggestCompletionsForPartialWordRange:inString:language:", - "splitView:shouldCollapseSubview:forDoubleClickOnDividerAtIndex:", - "layer", - "initWithOptions:andTimestamp:", - "_colorForNode:property:", - "_acceptsMarkedText", - "saveable", - "netServiceWillResolve:", - "abbreviation", - "makeDocumentWithContentsOfFile:ofType:", - "_updateUndoTransactionForThisEvent:withDeletions:withUpdates:", - "allowsEmptySelection", - "dropFirstComponent:", - "cameraAttached", - "transformOutline:by:", - "updateEditButton:", - "setSelectionIndexPaths:", - "accessibilityMinValueAttribute", - "setCriteriaSlice:forRuleEditer:withRootMenuItem:atRowIndex:", - "_arrowScrollingCallback", - "accessibilityIsSelectedTextSettable", - NULL, - "initWithPointerFunctions:capacity:", - NULL, - "stringValueOfProperty:", - "_defaultHelpAnchor", - "invalidateDisplayForGlyphRange:", - "setShowFlare:", - "documentPreviewViewForPreview:forView:", - "setPrimitiveUniqueId:", - "setURLs:", - "_drawAsMultiClippedContentInRect:", - "_updateInstancesForDatePreferencesChange", - "_flushNotificationQueue", - "textColor", - "_newSlice", - "vertBlur8ROI:destRect:", - NULL, - "resetOperation", - "_filtersUnderbars", - "localizedCompressionOptionsSummary", - "fullFrame", - "searchForBrowsableDomains", - "setController:retainController:", - "serializeString:", - "phoneticFieldsPresent", - "resetCursorRects", - "flattenMipmapItemIfNeeded:domain:", - NULL, - "navNodeWithSavedQueryData:title:", - "_attributes1ForPageOffset:entryOffset:baseAttributes:", - "initWithCString:", - "setBoxType:", - "inPalette", - "abPublicRecordIsGone:", - NULL, - "_forceOriginalFontBaseline", - "activeApplication", - "initWithUniqueID:connectionID:IOType:", - "startZoomPrefetchTask", - "_allItems", - "colorWithCGColor:", - "configButton:action:title:", - "_updateLayerHiddenStateFromView", - "_addRevealoverIfNecessaryForCell:cellRect:", - "accessibilitySetFocus:forChild:", - NULL, - "selectLine:", - NULL, - "_parseReleaseTwoList:", - "imageVersion", - "tightenThresholdForTruncation", - "_postNotificationNamed:", - NULL, - "sizingConstraints", - "_restoreCursor", - "currentAnalysisDidNotCreateNewWindow:", - "becameVisible", - "updateSelectionListFromSelectionFrame", - "stringsFromSelection", - "addCropLayer:", - "_updateDragInsertion:", - "_deselectsWhenMouseLeavesDuringDrag", - "_setArguments:", - "prefersSizeToFit", - NULL, - "sharedScriptSuiteRegistry", - "_pauseLayerTreeRenderer", - "setRenderingMode:", - "_indexOfDividerForLocation:andReturnFrame:", - "setPreviewNode:", - "DTDKind", - "_setPrefix:", - "createSnapshotImageOfType:withColorSpace:", - "terminate", - "shouldProvideSortDescriptor:optionsAdvertisingOnly:", - "arrayWithIndexes:", - "_clearTexture", - "_continuousScroll", - "initWithPartCode:parent:", - "_fillInValuesInExtension:isCACertBeingCreated:extensionIsPresent:", - "_addPlaceholderOptionValue:isDefault:toArray:withKey:binder:binding:", - NULL, - "setEditable:", - NULL, - "lockToken", - "addClient:selector:frequency:", - NULL, - "completedSpoolToFile", - "redNoiseReduction:pattern:radius:slope:", - "performChanges", - "_dispatchCallBackWithError:", - "addGRLsInGRLIndex:", - "textDidChange:", - NULL, - "intValueOfProperty:", - "keypathExpressionIsSafeLHSForIn:", - "_inputAtIndex:", - "doCrop:", - "_updateOptimizedDefaultValues", - "excludedKeys", - "_windowBorderThickness:", - "_invalidateGStatesForTree", - "binaryCollator", - "initWithSize:forSpaceItem:", - "setCurrentSearchCol:", - "sqlCore", - "createRotatedImageByDegrees:", - "synchronizeTitleAndSelectedItem", - "decodeIntForKey:", - "formattingStringsFilename", - "pixelsWide", - "setEndWhitespace:", - NULL, - "_userCommonName", - NULL, - "openGLEnabled", - "hostNameResolved:", - "initWithComposition:", - "parseBERLength:lenlen:", - NULL, - "useHighlightEffectForState:", - "_hideSheet:", - "_representedOjectsForString:andAttributedString:range:", - NULL, - "setPreloadHint:", - NULL, - "isScreenFont", - "setPixelFormat:", - "_availableFontSetNames", - "backing", - "initWithMembers:forKeys:count:", - "credentials", - "_setInverseManyToMany:", - "_importGroups:", - "directoriesController", - "_charRangeIsHighlightOptimizable:fromOldCharRange:", - "markWithTag:", - "_propertyContainerClassDescriptionFromDictionaryType:inSuite:", - "frameNeedsDisplay", - "_drawResizeIndicators:", - "alphaRange", - "X", - "componentViewerROI:destRect:", - "nts_RestoreFromMetaData", - "_old_encodeWithCoder_NSTableHeaderView:", - "typesetter", - "predicateFormat", - "captureOutput:didOutputSampleBuffer:fromConnection:", - "_autoreopenDocuments", - "_setupAnimationInfo", - "outlineView:didExpandItem:", - "_inputMethodInfoDictionary", - "copyBestResource:", - "setProtocolForProxy:", - NULL, - "stopObservingNode", - NULL, - "orderingIndex", - "loadSoundWithName:", - "entityForEntityDescription:", - "onAnimationTimer", - "incrSize:", - "XMLFormatData", - "locale", - "labelForSegment:", - "isDirect", - "dataRepresentationWithOptions:", - "_classForPersistentStoreAtURL:", - "getLineFragmentRect:usedRect:remainingRect:forStartingGlyphAtIndex:proposedRect:lineSpacing:paragraphSpacingBefore:paragraphSpacingAfter:", - "_okayToHitTest", - "clearAssociationTables", - "resetBytesInRange:", - "downloadDidBegin:", - "stopProfiling", - "_loadDataFromCGImage:useImageSource:imageNumber:", - "toolTipLabel", - "initWithFlowView:", - "acceptableDragTypes", - "isValidTitleString:forIndex:", - "_createInlinePreviewIfNeeded", - "initWithCell:atIndex:inBrowser:", - "_setAllowsMultipleRows:", - "recursive", - "_selectedNodesWithDirectories:", - "menuKeyEquivalentTarget:forEvent:", - "sharedFilterListProvider", - "drawInCGLContext:pixelFormat:forLayerTime:displayTime:", - "_incrementPage:", - NULL, - "descriptionsWithDeclarations:", - "isCoalescing", - "selectionChanged:", - "setToolMode:", - NULL, - "proceedWithImport:", - "setEmbedded:", - "addMarker:", - NULL, - "_encodeByte:", - "enableCustomAttributeFixing", - NULL, - "_NSNavFilePropertyCompareCaseInsenstive:", - "setGrammarCheckingEnabled:", - "printer", - "_notifyDelegate_WillAddItem:", - NULL, - "_drawMiniWindow:", - "commentURL", - "fieldDescriptionForKey:", - "setModificationDate:", - NULL, - "stringByReplacingPercentEscapesUsingEncoding:", - "application:printFiles:", - "wantsScrollWheelEvent:", - "_handleCancelledOperations:", - "_convertPersistentItem:", - "handleCloseScriptCommand:", - "startExecution:", - "setIsAButtonWhenNotProgressing:", - "_automateLiveResize", - "bezierMaskWithPath:", - "initFileURLWithPath:", - "currentChecksumForDirectory:", - "zoomValueRelativeToZoomRange:", - "clientView", - "setItem:forKnownAbsentKey:", - "_initWithfeKernel:", - "_activateWindows", - "_selectableItems", - "sharedPreviewView:didStartSharingWithPreviewPanel:", - "_iconView", - "_pageCount", - "isCaseInsensitiveLike:", - "_finalize_QCInterpolation", - "_enclosingMenuItem", - "_unlockRequestPostHandler:", - "editServerAction:", - NULL, - "managedObjectIDFromURIRepresentation:", - "resetSubrows", - NULL, - "_commonDealloc", - "_resetCurrentSearchRow", - "_save", - "setMetadata:forPersistentStoreOfType:URL:error:", - "commandClassName", - "_constructTreeForTemplate:", - "_setBaselineRenderingMode:", - "moveToBeginningOfLineAndModifySelection:", - NULL, - "networkNode", - "insertCustomLabel:", - "subresources", - "_pickUpMissingStuffFromNode:forEntity:", - "isTitle", - NULL, - "_addString:toEventRef:", - "_setInspectorController:", - "setParagraphSpacing:", - "_resizeFromEdge", - "whiteBackground", - "newDistantObjectWithCoder:", - "_isAutoPlay", - NULL, - "_queryString", - NULL, - "usePageLabelsChanged:", - "netServiceBrowser:didFindService:moreComing:", - "setVerticalRulerView:", - "initWithDescriptorType:data:", - "raiseCountUnderflowException", - "iconsForAnimationFilenames", - "isMembersPaneVisible", - "initWithRefCountedRunArray:", - "performZoom:", - "templateChanged", - "_imageNumber", - "frameOfOutlineCellAtRow:", - "_applicationWillLaunch:", - "populateCacheFromStream:data:", - "_abComparePrefixMatch:options:", - "setExecutionMode:", - "mutableBytes", - "accessibilityTopLevelUIElementAttributeValueHelper", - "setFontColor:", - "_explicitlyCannotInsert", - "timersForMode:", - "accessibilityChildForColumn:", - "preflightAndReturnError:", - "_delegateRespondsToWriteIndexes", - "setAutoresize:", - "pageScroll", - "insertObject:inSubNodesAtIndex:", - "_drawContentsAtRow:column:withCellFrame:", - "_web_createFileAtPathWithIntermediateDirectories:contents:attributes:directoryAttributes:", - "_hasJavaOverrideForInitializerSelector:", - "_resetGrid", - "setInternalState:", - "open:", - "parsePrivateKeyUsagePeriod:", - "_canGoIntoSelectedDirectoryAndTry:", - "outlineView:shouldTypeSelectForEvent:withCurrentSearchString:", - "_didImportMipmap:throughCopy:forDisplayedCell:index:mipmapItemIndex:firstTimeImported:flatten:", - "_layoutForData", - "decodeIntegerForKey:", - "outlineView:sortDescriptorsDidChange:", - "_outputAtIndex:", - NULL, - "type:conformsToType:", - "gizmoBoundingBoxForRadius:", - "saveImageNamed:andShowWarnings:", - "_orderOutHelpWindowAfterEventMask:", - "setFog:", - "setGraphNode:", - "setEventProc:", - "disableDeselect:", - "_accessibilityPressAction:", - "_syncTime", - "drawBackground:", - "cacheUsedByProxyJpegData", - "analyzeNextGRL:", - "_setTabState:", - "close:", - "_accessibilitySizeOfChild:", - "_setInsertionPointDisabled:", - NULL, - "newCountStatementWithFetchRequest:", - "initWithFunction:withArgument:andIsDetached:", - "colorWithPatternImage:", - "refreshDisplayedCardAndReloadImage:", - NULL, - "_usesSplitCursor", - "_knownPrimaryKeyForObject:", - NULL, - "initWithModelObserver:availableModelAndProxyKeys:", - "reconcileSelfToSuiteRegistry:", - "_ql_allowsNetworkAccessForPreview:", - "setAttributeMappings:", - "addToCurrentState:", - "flipHorizontal:", - "encryptWithDelegate:", - "_minimizeOnDoubleClickChanged", - "CA_pathExtension:", - "_setInScaledWindow:", - "fireWillStopAnimating", - "setToolTipWithOwner:forView:cell:", - "notPredicateOperator", - "_minSizeForDrawers", - "_setNeedsViewerLayout:itemViewers:", - "setStandalone:", - NULL, - "removeAllColumnFilters", - "inverted", - "_keyAlgorithm", - "releaseWireID:count:", - "setPlugInsEnabled:", - "_unregisterToolbarInstance:", - "setTransparentBackground:", - "_initWithAddressInfo:", - "makeCurrentContext", - "windowDidEndSheet:", - "performCustomValidationForEntityMapping:manager:error:", - NULL, - "isResizable", - "_handleGotoFinishedWithResult:", - "imageablePageBounds", - "_authenticationChallengeForCFAuthChallenge:sender:", - "minusHashTable:", - "_nextTypeSelectMatchFromIndex:toIndex:forString:", - "_updateObject:", - "lastFileListMode", - "imageByCroppingToRegion:", - "textView:completions:forPartialWordRange:", - "_generateSQLType1InContext:", - "removeObserver:forKeyPath:", - "sharedToolTipStringDrawingLayoutManager", - "updateFavoritesUI", - "enqueueToggleWritingOperationWithOutputFileURL:bufferDestination:scheduledForTime:cancelAllOperations:", - "_usesUserKeyEquivalent", - "overwriteAlertDidEnd:returnCode:contextInfo:", - "reinsertRecord:inSortedList:", - "_createImageBufferFromImageBuffer:withFormat:target:transformation:bounds:colorSpace:options:", - "performSelectorOnMainThread:withObject:waitUntilDone:", - "unmarkText", - "parseSource:callback:userInfo:", - "invalidateInputImage", - "_initWithRequest:delegate:usesCache:maxContentLength:startImmediately:", - "setStringForIndexing:", - "customPropertyDefinitionsWithAddressBook:", - NULL, - "analyzeGRLsAndNotify:selector:", - "decodeQTTimeForKey:", - "bezierPathWithOvalInRect:", - "_countOfRowsStartingAtObject:", - "openGLLock", - "_computeCustomItemViewers", - NULL, - "findSelection:", - "initWithAudioStreamBasicDescription:channelLayout:magicCookie:", - "_buildSupportUnitsForGenericInputConnection:error:", - "setUnits:", - "previewWindowDidResizeFrame:", - "_iconFrameForCellFrameSize:", - "darkGrayColor", - "_downloadTextureWithBounds:usingPixelFormat:toAddress:bytesPerRow:", - "keyUp:inRect:ofView:", - "convertRectFromViewToDocument:", - "_imageToTitleHorizontalOffset", - "setIconSize:", - "draggedImageLocation", - "_loadAdvSearchController", - NULL, - "imageWithCGImage:", - "applicationWillBecomeActive:", - "menuForNode:view:", - "imagingModeForcedToVisualContext", - "sortUsingSelector:", - "initWithCGImage:options:", - "substringWithRange:", - "parameters", - "mainArgument", - "_entitiesByVersionHash", - "_copyPBufferToCGSurface", - "_isOrdered", - "_delegateWillDisplayCell:forColumn:row:", - NULL, - "addCell", - "_scriptingCountNonrecursively", - "accessibilitySetSelectedTextRangeAttribute:", - "_createNonNilMutableArrayValueWithSelector:", - "setShowsControlCharacters:", - "previewPanel:frameForDocumentURL:", - "_identities", - "foreignKeyColumns", - "_lightPortList", - "resolveFromContainer:", - "addJoinForToManyRelationship:sourcePath:destinationPath:", - "widthValueTypeForLayer:edge:", - "_resumeLayerTreeRenderingForUserSwitchIn:", - "columnAtPoint:", - "initWithEntryNames:dataProvider:options:", - "ISS_xmlStringWithBag:", - "noteDirectoryResultsSelectionChanged", - "_adjustObject:mode:observedController:observedKeyPath:context:editableState:adjustState:", - "autoscrollCallBack", - "initWithProperty:label:key:value:searchPeople:comparison:", - NULL, - "_writeCallback:", - NULL, - "itemIdentifierForColorPicker:", - "_convertColor:toRed:green:blue:alpha:", - "_clientContextInfo", - "_lockFirstResponder", - "_downloadStarted", - "setAllowsLayoutAnimations:", - "_local:", - "_closeLoading:", - "tightBilateralAddROI:destRect:userInfo:", - "insertChild:", - "detach", - "_renewDAVLock", - "initWithUniqueID:deviceName:", - "setData:length:", - "_findWindowUsingCache:", - "initWithCStringNoCopy:length:freeWhenDone:", - "_keyboardFocusNeedsDisplayForColumn:row:", - NULL, - "_contentToFrameMinYHeight", - "cachedDateForEmail:", - "appendTemporaryField:andLabel:font:", - "interpretEventAsCommand:forClient:", - "addMappedKeysToDictionary:mappedEntities:mappedEntitiesMainKeys:entityWithValueConverter:valueWithEntityConverter:", - "_toggleSelectAnyValidResponderOverride", - "loadFiltersFromLibrary:filterArray:", - "boundsRectForTextBlock:glyphRange:", - "_doRunLoop", - "_infoFilePath", - "initLockWithURL:", - "stopAllTimersForSpeaking", - "_doPopupSearchString", - "_visibleAndCanBecomeKey", - "initWithSQLCore:", - "_initWithIconRef:includeThumbnail:", - "accessibilityFocusedAttribute", - "_saveQuerySheetDidEnd:returnCode:contextInfo:", - "_createStatusItemWindow", - "_titleForThumbnailLayer:", - "_removeTrackingRects:count:", - "authorizationViewCreatedAuthorization:", - "writeToFile:withAttributes:", - "_opString", - "mouseEnteredDelegate:", - NULL, - "convertPoint:toPage:", - "initWithWindowNibName:owner:", - "_resizeImage", - "setProperty:", - "isFileListOrderedAscending", - "parseNetscapeCertType:", - "toggleContinuousSpellChecking:", - "secondLineParagraphStyle", - "openglSupportsRenderingInBounds:", - "setVoice:", - "PDFDocumentPrintJobTitle:", - "initWithMutableAttributedString:", - "cellOrControlForObject:", - NULL, - NULL, - "initWithGlyph:forFont:baseString:", - "inputClientResignActive:", - NULL, - "shapeWindow", - "_hoverAreaIsSameAsLast:", - "initWithDocFormat:documentAttributes:", - "setSelectedResult:", - "qt_errorByAddingUserInfoEntriesFromDictionary:", - "initWithContentsOfFile:byReference:", - "editingBinderForControl:", - "prepareRenderer", - "setLocale:", - "_getKeys:forPropertyDescriptionKind:", - "stateVersionWithIdentifier:", - "volatileDomainNames", - "nextFreeIndex", - "_getServer", - "initWithDelegate:thumbnail:", - "abEntityKnowsKey:inManagedObjectContext:", - "_configureAsMainMenu", - "fieldDescriptionForAppleEventCode:", - "removeCacheNodeWithUID:withResolution:", - "setAppleUseCoreUI:", - "_isHighlightedIgnoringState", - "_postWindowNeedsDisplay", - "setNewPasswordField:", - "paragraphAttributesAtIndex:effectiveRange:inRange:", - "selectedThumbnail", - "clHandle", - "_updateSliceIndentationAtIndex:toIndentation:withIndexSet:", - "decodePortObject", - "buildAlertStyle:title:formattedMsg:first:second:third:oldStyle:", - "addLineToDictionaryRef:", - "vCardForGUIDs:", - "_installTrackingRects:insideList:userDataList:trackingNumList:count:", - "performActionForItem:", - "setupForNoMenuBar", - "setSelectionHighlightStyle:", - "setDoSelectGroup:", - NULL, - "specifier", - "coerceTextStorage:toData:", - "_computeFirstVisibleColumnRequireCompletelyVisible:", - "initWithRoundingMode:scale:raiseOnExactness:raiseOnOverflow:raiseOnUnderflow:raiseOnDivideByZero:", - "data:", - "_newItemFromDelegateWithItemIdentifier:willBeInsertedIntoToolbar:", - "syncMetaData:", - "configureForCanChooseDirectories:", - "_insertRecord:inSortedList:", - "removeThumbnailsAtIndex:count:", - "handleObservingRefresh:", - "blue", - "_inlinePreviewDidChangePage:", - "frame:resizedFromEdge:withDelta:", - "stealContentsFromPreviewView:", - "_compositionThread:", - "_cocoaErrorStringWithKind:variant:", - "_setKey:forPort:", - "_downloadDir:toPath:", - "_postNotificationName:", - "loadDataRepresentation:ofType:", - "addAdditionalActionsToDictionaryRef:", - "indexOfObject:", - "_clearValues", - "_extendedGlyphRangeForRange:maxGlyphIndex:drawingToScreen:", - "_flushCachedObjects", - "patternImage", - "setInformationalAttributedString:", - "handleKeyUp:", - "clearTemporaryCache", - "_topMargin", - "_delayedClearShadow", - NULL, - "permutedPath:matchesUnder:at:", - "maxRecents", - "scanCharactersFromSet:intoString:", - "_stopAnimationWithoutChangingFrames", - "doneSendingPopUpAction:", - "initWithFileDescriptor:", - "windowDidDeminiaturize:", - "filterPredicate", - NULL, - "initWithTextTable:charIndex:text:layoutManager:containerWidth:collapseBorders:", - "observationInfo", - "_surfaceDidComeBack", - "matchesPresentableName:", - "scaleByX:Y:", - "portList", - "_releaseTrackingTag:", - "setPlaying:", - "_prepareForDefaultKeyLoopComputation", - "_setCAAdminEmailAddress:", - "setRelationshipMappings:", - "resetMeasurements:forInterpolatedResolutionData:", - "nodeForUID:forResolution:createIfNeeded:", - "_changedItem:toItem:inRow:", - "setShadow:", - "drawScroller:", - "trackKnob:withEvent:", - "kind", - "__oldnf_numberStringForValueObject:withBuffer:andNegativeFlag:", - "selectionForAll", - NULL, - "nextResponder", - "movePath:", - NULL, - "cancelCurrentCoachMark", - "_getBucketForSeekingToRow:", - "_allowAnimated_addSubview:positioned:relativeTo:", - "canRead", - NULL, - "_changeQNamePrefix:toPrefix:forURI:", - "tracksOfMediaType:", - "createSharedGWorldContext", - "_centerPoint", - "dispatch", - "importToPerson:", - "_setDefaultRedColor:", - "selectionFromPage:atCharacterIndex:toPage:atCharacterIndex:", - "isDeferred", - "initialize", - "_isJobActive:", - "dataReferenceWithReferenceToData:", - "_canSave", - "textDidCancelEditing", - "parseX509Name:setTitle:indent:", - "_plugIns", - "setAsMainCarbonMenuBar", - "outputImageProviderFromBufferWithPixelFormat:pixelsWide:pixelsHigh:baseAddress:bytesPerRow:releaseCallback:releaseContext:colorSpace:shouldColorMatch:", - "drawRect:", - "needsTimeControls", - "genericView", - "initWithPage:range:", - "_isNilExpression:", - "setPreferredEdge:", - "_NSNavDisplayNameCompare:caseSensitive:", - "_setNeedsDisplayForSortingChangeInColumn:", - "definition", - NULL, - "exitFullscreenWithEffect:frame:toPanel:", - "fillRoundedRect:radius:cacheIt:", - "fileExtensionsFromType:", - "_lineFragmentDescriptionForGlyphRange:includeGlyphLocations:", - "_setMultipleValue:forKey:atIndex:", - "_focusOnCache:creatingWithSizeInPixels:", - "getLineFragmentInsertionPointsForCharacterAtIndex:alternatePositions:inDisplayOrder:positions:characterIndexes:", - "prepareContent", - "drawWithBox:", - "getAttributesInNode:fromBuffer:listReference:count:", - "noFeedback", - "download:didFailWithError:", - "searchLabel", - "setValueTransformer:", - "setOpenGLTextureIsPremultiplied:", - "doFinishShow", - "attributedSubstringFromRange:replacingCharactersInRanges:numberOfRanges:withString:", - "_setKeyEquivalentMapIsDirty:", - "textMatchingPopUpFrame", - "allocateBatch:forEntity:count:", - NULL, - "removeLayer:", - "modelUniqueID", - "enqueuePauseOperationScheduledForTime:", - NULL, - "relatedNames", - "serialNumber", - NULL, - "isLessThan:", - "needsDisplayOnBoundsChange", - "renderingPixelFormat", - "_adjustSplitView", - NULL, - "validateFxAtIndex:", - "addEnumeration:", - "cancelButton:", - "newWithContentsOf:immutable:", - "newWithDictionary:", - "_isDrawingForDragImage", - "_addResult:", - NULL, - "setInputBackgroundImage:", - "daysInMonth:year:forDatePickerCell:", - "filterWithType:", - "initWithQTMovie:", - "_computeParams", - "affineROI:forRect:userInfo:", - "_keyWindow", - "__selectKeyFrame:timeLine:context:", - "initToData:error:", - NULL, - "initSyncList:", - NULL, - "abIsCompatibleWithRecord:", - "_crayons", - "md5WithTime:arguments:", - "addUniqueObjectsFromArray:", - "windowNibPath", - "updateCIFilter:slider:key:value:label:", - "setPixelsWide:", - "dataSourceItemForSlideshowThumbnail:", - "editDisplayedCard:", - "moveRecord:toAddressBook:", - "initWithName:object:userInfo:", - "unregisterDragTypesForWindow:", - NULL, - "_deactivateTrackingRectsForApplicationDeactivation", - "shadowDirtyRect", - "contentObjectKey", - "setDocumentRef:", - "_specifiedObjectTreeDepth", - "changeFileAttributes:atPath:", - NULL, - "_drawIBPreviewInRect:", - "doVerticalBoxPass:yOffset:count:factor:sums:", - NULL, - "_createAndRegisterUniqueContextForCGLContext:contextOwner:pixelFormat:formatOwner:colorSpace:options:", - "accessibilityColumnForChild:", - NULL, - NULL, - "storeKeyForDatabaseDataType:", - "_reactToDisplayChanged:resetScreens:", - "part:boundsWithFrame:", - "offset:by:", - "supportedRepresentationTypes", - NULL, - "_dateFromComponents:", - "performFileOperation:source:destination:files:tag:", - "appearance:", - "findSubscriptionWithRemoteLocation:", - "drawPreviewInteriorWithFrame:inView:", - "setHorizontal:", - "getGlyphsInRange:glyphs:characterIndexes:glyphInscriptions:elasticBits:", - "initWithCapacity:", - "_sizeHeightBucket:withSize:toFitSize:", - "_draggingMarkerView", - "_clearAllTargetAnimations", - "createTextureBufferWithFormat:target:pixelsWide:pixelsHigh:options:", - "_minXWindowBorderWidth:", - "nts_SaveWithFileLock:", - "extendPowerOffBy:", - "createThumbnailFromNSImage:", - "selectedResolvedNodes", - "setDisabledWhenInactive:", - "_setStartPath:", - "_mergeChangesObjectUpdatesTrumpForObject:withRecord:", - "autosavedContentsFileURL", - "flushCachedData", - "scaleTo::", - "searchScope", - "patch", - "_changeAllDrawersKeyState", - "shadowBlurRadius", - "_contentToFrameMinXWidth", - "imageRepWithCGLayer:", - NULL, - "setDoubleAction:", - "readFromURL:options:documentAttributes:", - "highlight:withFrame:inView:", - "_coreUIImageWithBaseName:state:backgroundStyle:", - "resourceLoaderRunLoop", - "resizeSublayersWithOldSize:", - "_addMembersFrom:toUniqueArray:", - "createElementContent:", - "rangeContainerObject", - "includedKeys", - "_newAdapterForModel:", - "_coreUIDrawBackgroundForGroupRow:inRect:", - "_preEvaluate", - "applyCredentialsToRequest:", - "setHeaderCell:", - "setExtraLineFragmentRect:usedRect:textContainer:", - "userData", - "_setErrorExpectedTypeDescriptor:", - "hitTest:", - "testSelector", - "_hideQueryProgress", - "graphEditor", - NULL, - NULL, - "server", - "decodeData:", - "_defaultWritingDirection", - "updateProfileInfo", - "_convertersList", - "fileWrapperRepresentationOfType:", - NULL, - "setJoinSemantic:", - "accessibilityMainWindowAttribute", - "derotateContext", - "numberOfTickMarks", - "_abAddress:isSimilarToAddress:", - "tokenStyle", - "_releaseDelayShowNodeInfo", - "_saveMode", - "effectsIcon", - "loadRecipeOverrides:recalcPointers:", - "loadAndRegisterAllPlugIns", - "intersectsRegion:", - "allSizes", - "dstDraggingDepositedAtPoint:draggingInfo:", - "_updateMouseInside:", - "accessibilityPositionOfChild:", - "_setModified:", - "_filterResources:reset:", - "_selectObjectsAtIndexes:avoidsEmptySelection:sendObserverNotifications:forceUpdate:", - "mouseOnIcon", - "propagateFrameDirtyRects:", - "allowsNonSquareZooming", - "greenSpeed", - "_setMap:", - "initWithName:data:", - "_windowUpdate:", - "_createValuePrimitiveSetterWithContainerClassID:key:", - "border", - "boundsForConnection:", - "hasNoResults", - NULL, - "drawFromCenter:radius:toCenter:radius:options:", - "mouse:inRect:", - "setShowsPreviews:", - "_initWithTexture:size:params:", - "titleOfSelectedItem", - "removeSelectedTimeLine:", - NULL, - "sheetDidEnd:returnCode:contextInfo:", - "_readFontIntoRange:fromPasteboard:", - "equalsContentsOf:", - "_newShowColorsItem", - "_sendShouldTrackCell:forTableColumn:row:", - "fadeDuration", - "sourceConfiguration", - "_setContainerObservesTextViewFrameChanges:", - "scrollLineUp:", - "_setInteriorNextKeyView:", - "convertFont:toSize:", - "_invalidateCursorRectsForView:force:", - "addIndexesInRange:", - "mappedAndDecompressedIntoRAM", - "sharedSurfaceMode", - "saveNumVisibleRows", - "colorWithCalibratedRed:green:blue:alpha:", - "_filterAddedNotificationHandler:", - "persistentDomainForName:", - "_addRootColumnToFetch:", - "_compositionsWithIdentity:", - "_resumeInformation", - "initWithGLContext:glID:radius:strokeColor:fillColor:mode:lineWidth:", - "_activateHelpModeBasedOnEvent:", - "goToRect:onPage:", - "postsBoundsChangedNotifications", - "pk64", - "localObjects", - "_isDoingUnhide", - "_classDescriptionForName:suiteName:isValid:", - "initWithWindow:rect:", - "renderToBuffer:withBytesPerRow:pixelFormat:forBounds:", - "setFilterByName:", - NULL, - "shouldClearSearchWhenSwitchingTo:", - "observeKeyPathForBindingInfo:registerOrUnregister:object:", - NULL, - "stringValueForObject:", - "updateAppleMenu:", - "_setSigningIdentity:", - "emptyImage", - "findPixelFormat:withColorSpace:closestToFormats:", - NULL, - "drawKeyIcon:inContext:", - "_setPendingDeletion:", - "glyphInfoWithGlyphName:forFont:baseString:", - "_pointForPort:inNode:bounds:", - "initialValues", - "runModalForWindow:", - "_discardTrackingRects:count:", - "selectNone:", - "filepath", - "go", - "_loadNibFile:nameTable:withZone:ownerBundle:", - "coreUIDrawWithFrame:inView:", - NULL, - "setBordered:", - "addPropertiesAndTypes:withAddressBook:acquireLock:", - "mouseDragged:", - "_clockAndCalendarStopTracking:at:inView:mouseIsUp:", - "setSearchList:", - "colorSpace", - "_chooseSize:", - "fireNextCameraSequence", - "DOMDocument", - "observer", - "bindingsForObject:", - "externalNameForEntityName:", - NULL, - "enableDragNDrop", - "removeContextHelpForObject:", - "_setAutoscrollResponseMultiplier:", - "initWithCharactersNoCopy:length:freeWhenDone:", - "_createAuxData", - "_recurWithContext:chars:glyphs:stringBuffer:font:", - "connectionWithOwner:mediaType:formatDescription:attributes:", - "initCount:", - "_colorListNamed:forDeviceType:", - NULL, - "_scriptingAddObjectsFromArray:toValueForKey:", - "_shouldDrawSelectionIndicator", - "_resourceCount", - "decimalNumberWithMantissa:exponent:isNegative:", - "_restartEditingWithTextView:", - "_hasShadow", - "accessibilityIsMinimizedAttributeSettable", - NULL, - "zoomValueRelativeToZoomRange", - "reformatValueAtLocationInNumber:", - "initWithObjects:count:andFlags:", - "insertThumbnailsAtIndex:count:", - "heightOfInfoSpaceAtRow:", - "_disableToolTipCreationAndDisplay", - "setFormat:", - "countOfPublicRecordsForClass:withPredicate:addressBook:", - "_migrationContext", - "initWithContainerClassID:key:containerIsa:ivar:proxyClass:", - "_selectObjectsAtIndexPathsNoCopy:avoidsEmptySelection:sendObserverNotifications:", - "_attachmentFileWrapperDescription:", - "_mutatingNodes", - "setNext:", - "_setWantsToDestroyRealWindow:", - "setServicesProvider:", - NULL, - "_crayonWithColor:", - "_deselectRow:subrow:members:", - "sharedDVGrabber", - "parsePrintableBERSequence:label:indent:", - "videoPreviewConnection", - "retainedXmlInfoForRelationship:", - "_writeCharacterData", - "_validateTextColor:", - "lockMipmapAtIndex:", - "windowBackingLocation", - "removeObjectIdenticalTo:inRange:", - "_spellServers", - "fileOwnerAccountName", - "optLockKey", - NULL, - "setMixedStateImage:", - "roundedImageRectWithoutRotations", - "shouldBreakLineByHyphenatingBeforeCharacterAtIndex:", - "_clearAudioAttributePropertyListeners", - "_findPreviousNextTab:loop:startingAtTabItem:", - "fileHandleForReadingAtPath:", - "_hasGradientBackground", - "_URLHasScheme:", - "windowDidResignMain:", - "_sslServerAuthUsage", - "orderFrontFontOptionsPanel:", - "_web_isFileURL", - "_updateSliceIndentations", - "setUsePrimarySourceListStyle:", - "stopCoalescing", - "doCommandBySelector:client:", - "maxTimeForControlType:keyFrame:", - "_removeEntities:fromConfiguration:", - "objectAtIndex:forDatabaseKey:", - NULL, - "_hasEditableCell", - "elementsForLocalName:URI:", - "getResolutionData:chopMetricsHoriz:vert:horizRight:vertBottom:chopType:", - "nts_SyncCount", - "restoreExpandedLayout", - "setShowsRollover:", - "_maintainCell", - "IBeamCursor", - "initWithRTF:documentAttributes:", - "isHomeNode", - "colorProfile", - "initImportAnimationWithIndexes:", - "unsignedIntegerValue", - "accessibilityActionDescription:", - "preferredLocalizations", - "serverExists:inServerList:", - NULL, - "_setCellFrame:", - "_dragConstraintsOfDividerAtIndex:", - "_setStoreInfo1:", - "_setTitle:ofColumn:", - "stopScrollingAnimation", - "blueSpeed", - "destinationContext", - "setPrimitivePhoneticLastName:", - "_setSharedIdentifier:", - "deltaX", - "setItem:forKey:", - "applicationInfo:", - "setView:", - "removeObjectWithUID:withResolution:withKey:", - "session:proxyAuthenticateForRequest:withRealm:attemptNumber:proxyConfig:username:password:", - "inputKeys", - "isYearLessComparison:forProperty:", - "getInputTopLine", - "scaleRange", - "controlContentFontOfSize:", - "_isKindOfEntity:", - NULL, - "openGLContextForCurrentThread", - "textAttributes", - "_attributeDescriptionForKeyPath:inEntity:", - "_usingAlternateHighlightColorForCell:withFrame:", - "_updateFromSnapshot:", - "_userCanSelectAndEditColumn:row:", - "deleteImageTexture:name:userInfo:", - "applicationWillFinishLaunching:", - NULL, - "_deactivateWindows", - "_selectableColumnIndexes:", - "redisplayPopup", - "vramManagerDidUnbindMipmapWithUID:withSize:", - "filestreamBlockLength", - "windowOrderedOut", - "mapPDFRangeToPageRange:", - "positionKnobs", - "_mergeEntriesFromDictionary:maxDepth:", - NULL, - "_postObjectsDidChangeNotificationWithUserInfo:", - "_resetAllDrawersPostingCounts", - "_specialControlView", - "_cacheRepresentation:", - "_drawKeyboardFocusRingWithFrame:forCell:", - "setCleanAperture:", - "setValue:forInputKey:composition:", - "_imageRepsWithData:hfsFileType:extension:expandImageContentNow:", - "valueWithSMPTETime:", - "_setInitCallback:", - "cocoaVersion", - "initialize_MailRecents", - "_fileChangeAlertSheet:wasPresentedWithResult:inContext:", - "initWithEventClass:eventID:targetDescriptor:returnID:transactionID:", - "performDroppedFile:atPosition:", - NULL, - "setNode:displayState:", - "_bodyStreamOpen:openComplete:", - "removeAllIndexes", - "authorizationState", - NULL, - "_getMatchingRow:forString:inMatrix:startingAtRow:prefixMatch:caseSensitive:", - "pageForPoint:nearest:", - "pointerArrayWithOptions:", - "_parseHashTable", - "imagingModeForcedToSharedBuffer", - "setContents:", - "filterWithImageData:options:", - NULL, - "_uncachedSize", - "speechSynthesizer:didFinishSpeaking:", - "_items", - "prefersColorMatch", - "setBrightness:", - "_imageForDrawingInRectOfSize:fromImage:", - "labelForIdentifier:", - NULL, - NULL, - NULL, - "presentableNameForSpecifier:", - "initWithGrammar:", - "setLockOwner:", - "detachFromAudioMixerNode", - "_isAcceptableDragSource:types:dragInfo:", - "beginLayoutChange", - "_cachingView", - "_setAudioDeviceUID:channels:error:", - NULL, - "newFileButton", - "cancelEditing", - "setViewKind:", - "_setSerialNumber:", - "sharedFocusState", - "_setCurrentItemsToItemIdentifiers:notifyDelegate:notifyView:notifyFamilyAndUpdateDefaults:", - "entityMappings", - "bookListNeedsUpdate", - "_setSelectedMembers:withHistory:", - "pageHeader", - "_accessibilityParentAdjustedFocusedUIElement:", - "tokenFieldCell:representedObjectForEditingString:", - "unregisterForHardwareNotification", - "_documentPreviewDidUpdateDisplay:", - NULL, - "writeDefaultValue", - "_coreUISortIndicatorDrawOptionsWithView:ascending:", - "autofillColor", - NULL, - NULL, - "processAllPerforms", - "appleEventForSuspensionID:", - "keepAtLeastOnePixelZoomRange", - "allValues", - "_keyWindowForHeartBeat", - NULL, - "namespaceWithName:stringValue:", - "deleteConfirmSheetDidEnd:returnCode:contextInfo:", - "importVCardData:intoGroup:", - "zoomImageToFit:", - "setPoliciesDisclosed:", - "serviceListener", - "fileURLWithPath:", - "isSyncScheduled", - "errorStringForFTPStatusCode:fromURL:", - "_getPropertyForKey:", - "_minParentWindowContentSize", - "frame", - "setGoverningEntity:", - "delegateClassForMode:", - "_hideMenu:", - "_drawerTakeFocus", - "_scriptingSetValue:forSpecifier:", - "pages", - "_bezelBottomPadding", - "years:months:days:hours:minutes:seconds:sinceDate:", - "pause:", - "destinationURL", - NULL, - "_destroyTSMDocument:", - "_actionCellInitWithCoder:", - "adjustSubviews", - "initWithProxyHost:port:type:realm:authenticationMethod:", - "importContinued:", - "clearAuthChallengeForSession:", - "_ensureBitmapDataAvailable", - "_insertionIsAtEnd", - "mouseDownDelegate:", - "mainFrame", - "_prefixIndex", - "accessibilityDocumentAttribute", - NULL, - NULL, - "sourceEntity", - "isWritableFileAtPath:", - NULL, - NULL, - "_generateSQLForConstantCollection:inContext:", - "_compareToCell:", - "_freeServicesMenu:", - "addAdapterOperation:", - "addFavorite", - "postQueryHasFinishedNotification", - "markerFormat", - "timerWithTimeInterval:target:selector:userInfo:repeats:", - "paragraphSpacingAfterCharactersInRange:withProposedLineFragmentRect:", - "_removeAllRevealovers", - "noteGroupsSelectionChanged", - "initWithCacheSize:", - "initWithMarkerFormat:options:", - "attributeValue", - "_rulerAccView", - "rangeAtIndex:onPage:", - "_notifyFamily_DidRemoveItemAtIndex:", - "filterPanel", - "_setLang:", - NULL, - "validateMipmapDBIndex", - "initWithDocument:url:type:overwriteRetryingInfo:", - "_topEditor", - "layoutControlGlyphForLineFragment:", - "getBytes:maxLength:filledLength:encoding:allowLossyConversion:range:remainingRange:", - NULL, - "capHeight", - "tearOffMenuRepresentation", - "setPreviewRange:", - "setEnableDragNDrop:", - "primitiveSortingLastName", - "_reconcileDisplayNameAndTrackingInfoToFileURL", - "_recursivelyRemoveItemsInMenu:fromTable:", - NULL, - "writeColors", - "_restartMovementTracking", - NULL, - "crayonToLeft", - "_insertNodeIntoMainCache:", - "didReceiveResponse:", - "_invalidateCompositedBackground", - "setPreferredRate:", - "_iconViewAction:", - "observeValueForKeyPath:ofObject:change:context:", - "setMaximizedMode:", - "loadClass:", - "terminate:", - "_logMessage:", - "removeBinder:", - "newConversation", - "mergedModelFromBundles:forStoreMetadata:", - "childrenEnumerator", - "isCRLStatusCode:", - "_coreUIBezelDrawOptionsWithView:highlighted:", - "_loadWebKit", - "sessionWillUseOutputPixelBufferAttributes:forConnection:", - "_lockTokenForURI:orForParent:", - "_installTrackingAreas:", - "originalPageCount", - "scanInt:", - "highlightROI:forRect:", - "_modifierString", - "lastPage", - NULL, - "_escapeCharacters:amount:inString:appendingToString:", - "_graphicsFont", - "subentityMaxID", - "dayOfWeek", - "setFillsPicker:", - "_validateAsCustomItem:", - "endUndoGrouping", - "_QTMovieClass", - "_layoutDirtyItemViewersAndTileToolbar", - "browserType", - "_updateSliceRows", - "retainedDecompressionSessionOptions", - "setFrameCenterRotation:", - "_scheduleInDefaultRunLoopForMode:", - "recomputeToolTipsForView:remove:add:", - "_maxLabelSizeForAxis:gridStep:digits:inRect:", - "getTIFFCompressionTypes:count:", - "setScrollable:", - "_diskURL", - "setWidth:forSegment:", - "_updateOverlayControls", - "_moveGapToBlockIndex:", - "_setExportSpecialFonts:", - NULL, - NULL, - NULL, - "glyphRangeForTextContainer:", - "_appendKey:option:value:inKeyNode:", - "isLocking", - "_topLeftDuringLiveResize", - "_glyphIndexForCharacterIndex:startOfRange:okToFillHoles:considerNulls:", - "_cfBundle", - "depthChanged:", - "phoneLabel", - "_selectDocumentAtIndex:", - "setValue:forKeyPath:", - "_publicKey", - NULL, - "tilt", - NULL, - "_startDrawingThread:", - NULL, - "topUndoObject", - NULL, - "_cellFinishedImportAnimation:", - "messageBoundsInVisibleRect:", - "addView:frame:toView:characterIndex:layoutManager:", - NULL, - "_postColumnDidResizeNotificationWithOldWidth:", - "_web_pathWithUniqueFilenameForPath:", - "_destinationEntityVersionHashesByName", - "_isScrolling", - "isEntryAcceptable:", - "defaultManager", - "fetchObjectsForClass:withPredicate:prefetchingKeyPaths:managedObjectContext:", - "getBytes:range:", - "_populateOpenRecentMenu:includingIcons:", - "isTemplate", - "_retrieveNodesSatisfyingRequest:", - "_currentItemFrame", - NULL, - "countOfInputTopLine", - "_accessibilityChildrenWithIndexes:", - "setAnchorRight", - "removeLastObject", - "startSubelementIdentifier", - "_propertyDescriptionForAppleEventCode:checkSubclasses:superclasses:", - "sharedExchangeSetup", - "scheduleSearch:", - "resetCellInfo:", - "tracks", - "_doOpenFiles:", - "setAlignment:range:", - "registerImageProviderClass:", - "cellBoundingBoxPositionAtIndex:", - "controlPointBounds", - "initWithDictionaryRepresentation:addressBook:", - "_setHorizontalScrollerHidden:", - "validateRowsTranslationsToRowIndex:", - "components", - "resetPasswordCache", - "setActive:", - "attemptToBind", - "appendAttributedString:", - "_adjustMinAndMaxSizeForSheet:", - "prepareLike:", - "_liveResizeLOptimizationEnabled", - "resetView", - "changeSpelling:", - NULL, - "nts_ChangedProperties", - NULL, - "_memoryCacheRemoveNodeFromLRUList:", - "setMappingModel:", - "drawCellInside:", - "typefaceInfoForKnownFontDescriptor:", - "getInputExtent", - "intersectsIndexesInRange:", - "tokenFieldCell:setUpTokenAttachmentCell:forRepresentedObject:", - "_functionExpressionIsSubqueryFollowedByKeypath:", - "newWithUpperItem:attribute:", - "setRichText:", - "_performPostHandler", - "_computeLayoutInfoForIconViewSize:frameSize:iconFrame:labelFrame:", - "_closeFileAsync", - "initWithTableView:", - "_validateValue:forProperty:andKey:withIndex:error:", - "_cacheZoomState", - "_ensureObjectsAreMutable", - "addTooltipsForPage:", - "virtualScreenCount", - "usesWeakReadAndWriteBarriers", - "_maybeSubstitutePopUpButton", - NULL, - "drawWithBox:inContext:", - "_leading", - "_indexOfRangeAfterOrContainingIndex:", - "_inlineSlideshowItemChangedPlaying:", - "accessibilitySupportsOverriddenAttributes", - "processComment:", - "backingType", - "strokeRect:color:context:", - "appleEventClassCode", - "_initWithName:propertyList:", - "updateOrientationTag:animate:reCenter:", - "stepBackward", - "disableMakeHistory", - "removeObjectForResolution:", - "timerWithFireDate:target:selector:userInfo:", - NULL, - "_addHiddenWindow:", - "_doAutoscrolling", - "activate:", - "savedCriteriaSlices", - "setFetchPredicate:", - NULL, - "pauseRendering", - "ab_URLWithStringByEscapingStringIfNecessary:", - NULL, - "classCode", - "performStreamRead", - "cameraDZ", - "_minContentRectSize", - "focusedSwatchRect", - "fetchRequestTemplateForName:", - "stopError", - NULL, - "editInAddressBook:", - "bindInVRamMipmapItem:withUID:", - "setParagraphs:", - NULL, - "__preLiveResizeWidthOfColumn:", - "setNeedsDisplayOnBoundsChange:", - "_addVirtualToOneForToMany:withInheritedProperty:", - "updateTimeValue", - "lastResponseMessage", - "_scheduleDelayedShowOpenHandCursorIfNecessary", - NULL, - "appendSelectListToSQLForRequest:", - "SCTConvertBaseToScreenRect:", - "popLast", - "analyzeAndIndexApp:", - "initWithPNGFile:", - "_standardCustomMenuFormRepresentationClicked:", - "setOriginalDontResolveDataRefsFlag:", - "_oldUserCanSelectRow:", - "postColorSwatchesChangedDistributedNotification", - "cellAtRow:column:", - "_cornerViewFrame", - NULL, - NULL, - "busyButClickableCursor", - "targetAndArgumentsAcceptable", - "initWithLocal", - "addImagePasteLayer:", - "_updateDefaults", - "_allowAnimated_setFrameSize:", - "pathControl:willDisplayOpenPanel:", - "prefix", - "indexOfKey:", - NULL, - "nts_managedObjectContextWithModel:databasePath:dataType:version:loadFailure:", - "setTableColumn:", - "cut:", - "_givenPropertiesBeingInitialized:getAffectingProperties:", - "shadow", - "setAudioDevice:error:", - "showGreyScaleView:", - "_fillCache", - "applicationName", - "_commitEditing:", - "_removeParent:", - "_setUpLayerTreeRendererAndSurface", - "_accessibilityChildrenInRange:", - NULL, - "initWithYear:month:day:hour:minute:second:timeZone:", - "minimumRangeForEdit", - "_updateFilterPredicate:", - "_calculateSizeToFitWidthOfColumn:testLoadedOnly:", - "setMultipleCharacterSeparators:", - "destNode", - "_adjustClipIndicatorPosition", - "_replaceSubview:with:rememberAndResetEditingFirstResponder:abortEditingIfNecessary:", - "setIdentifier:", - NULL, - "newWithURL:quartzFilter:", - "initWithRole:subrole:index:parent:", - "proxyWithLocal:connection:", - "__computeOrder:context:", - "_textViewOwnsTextStorage", - NULL, - "addPageReferenceToDictionaryRef:", - "currentFrameAsCIImage", - "_rl", - "clientWrapperWithRealClient:", - "setCountryCode:", - "_resetDrawerFirstResponder", - "valueTypeDescriptionFromName:declaration:", - "setLinkTextAttributes:", - "flushDerivables", - "suppressAllNotifications", - "_commonInitNavNodePopUpButton", - "sharedInfoPanel", - "_switchToPicker:", - "setGregorianStartDate:", - "computeInsideShadow", - "_concludeTracking", - "_shapeMenuPanel", - "control:textShouldEndEditing:", - "allowedFileTypes", -}; diff --git a/runtime/objc-sel-table.s b/runtime/objc-sel-table.s new file mode 100644 index 0000000..997745d --- /dev/null +++ b/runtime/objc-sel-table.s @@ -0,0 +1,21 @@ +/* This file is automatically generated. Do not edit. */ +.section __TEXT,__objc_selopt +.private_extern __objc_selopt_data +__objc_selopt_data: +.long 3 /* table.version */ +.long 4 /* table.capacity */ +.long 4 /* table.occupied */ +.long 63 /* table.shift */ +.long 3 /* table.mask */ +.long 0 /* table.zero */ +.quad 0 /* table.salt */ +.quad 0 /* table.base */ +.space 256*4 /* table.scramble */ +.long 0 /* table.tab */ +.long 20 /* table.offsets */ +.long 20 +.long 20 +.long 20 +/* space for smax/capacity=131072, blen/mask=65535+1 */ +.space 65536 +.space 131072*4 diff --git a/runtime/objc-sel.m b/runtime/objc-sel.m deleted file mode 100644 index c3f15dd..0000000 --- a/runtime/objc-sel.m +++ /dev/null @@ -1,172 +0,0 @@ -/* - * Copyright (c) 1999-2007 Apple Inc. All Rights Reserved. - * - * @APPLE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_LICENSE_HEADER_END@ - */ - -/* - * Utilities for registering and looking up selectors. The sole - * purpose of the selector tables is a registry whereby there is - * exactly one address (selector) associated with a given string - * (method name). - */ - -#include -#import "objc-private.h" -#import "objc-auto.h" -#import "objc-rtp.h" -#import "objc-sel-set.h" - -// _objc_builtin_selectors[] -#include "objc-sel-table.h" - -// from phash.c -extern uint32_t phash(const char *key, int len); - -#define NUM_NONBUILTIN_SELS 3500 -// objc_sel_set grows at 3571, 5778, 9349. -// Most apps use 2000..7000 extra sels. Most apps will grow zero to two times. - -static const char *_objc_empty_selector = ""; -static OBJC_DECLARE_LOCK(_objc_selector_lock); -static struct __objc_sel_set *_objc_selectors = NULL; - - -static inline int ignore_selector(const char *sel) -{ - // force retain/release/autorelease to be a constant value when GC is on - // note that the selectors for "Protocol" are registered before we can - // see the executable image header that sets _WantsGC, so we can't cache - // this result (sigh). - return (UseGC && - ( (sel[0] == 'r' && sel[1] == 'e' && - (_objc_strcmp(&sel[2], "lease") == 0 || - _objc_strcmp(&sel[2], "tain") == 0 || - _objc_strcmp(&sel[2], "tainCount") == 0 )) - || - (_objc_strcmp(sel, "dealloc") == 0) - || - (sel[0] == 'a' && sel[1] == 'u' && - _objc_strcmp(&sel[2], "torelease") == 0))); -} - - -static SEL _objc_search_builtins(const char *key) { - const char *sel; - uint32_t hash; - -#if defined(DUMP_SELECTORS) - if (NULL != key) printf("\t\"%s\",\n", key); -#endif - - /* The builtin table contains only sels starting with '[.A-z]', including '_' */ - if (!key) return (SEL)0; - if ((intptr_t)key == kIgnore) return (SEL)kIgnore; - if ('\0' == *key) return (SEL)_objc_empty_selector; - if ((*key < 'A' || 'z' < *key) && *key != '.') return (SEL)0; - if (ignore_selector(key)) return (SEL)kIgnore; - - hash = phash(key, (int)__builtin_strlen(key)); - sel = _objc_builtin_selectors[hash]; - if (sel && 0 == __builtin_strcmp(key, sel)) return (SEL)sel; - else return (SEL)0; -} - - -const char *sel_getName(SEL sel) { - if ((intptr_t)sel == kIgnore) return ""; - return sel ? (const char *)sel : ""; -} - - -BOOL sel_isMapped(SEL name) { - SEL result; - - if (NULL == name) return NO; - result = _objc_search_builtins((const char *)name); - if ((SEL)0 != result) return YES; - OBJC_LOCK(&_objc_selector_lock); - if (_objc_selectors) { - result = __objc_sel_set_get(_objc_selectors, name); - } - OBJC_UNLOCK(&_objc_selector_lock); - return ((SEL)0 != (SEL)result) ? YES : NO; -} - -static SEL __sel_registerName(const char *name, int lock, int copy) { - SEL result = 0; - - if (NULL == name) return (SEL)0; - result = _objc_search_builtins(name); - if (result != NULL) return result; - - if (lock) OBJC_LOCK(&_objc_selector_lock); - - if (_objc_selectors) { - result = __objc_sel_set_get(_objc_selectors, (SEL)name); - } - if (result == NULL) { - if (!_objc_selectors) { - _objc_selectors = __objc_sel_set_create(NUM_NONBUILTIN_SELS); - } - result = (SEL)(copy ? _strdup_internal(name) : name); - __objc_sel_set_add(_objc_selectors, result); -#if defined(DUMP_UNKNOWN_SELECTORS) - printf("\t\"%s\",\n", name); -#endif - } - - if (lock) OBJC_UNLOCK(&_objc_selector_lock); - return result; -} - - -SEL sel_registerName(const char *name) { - return __sel_registerName(name, 1, 1); // YES lock, YES copy -} - -__private_extern__ SEL sel_registerNameNoLock(const char *name, BOOL copy) { - return __sel_registerName(name, 0, copy); // NO lock, maybe copy -} - -__private_extern__ void sel_lock(void) -{ - OBJC_LOCK(&_objc_selector_lock); -} - -__private_extern__ void sel_unlock(void) -{ - OBJC_UNLOCK(&_objc_selector_lock); -} - - -// 2001/1/24 -// the majority of uses of this function (which used to return NULL if not found) -// did not check for NULL, so, in fact, never return NULL -// -SEL sel_getUid(const char *name) { - return __sel_registerName(name, 2, 1); // YES lock, YES copy -} - - -BOOL sel_isEqual(SEL lhs, SEL rhs) -{ - return (lhs == rhs) ? YES : NO; -} diff --git a/runtime/objc-sel.mm b/runtime/objc-sel.mm new file mode 100644 index 0000000..4b5e207 --- /dev/null +++ b/runtime/objc-sel.mm @@ -0,0 +1,362 @@ +/* + * Copyright (c) 1999-2007 Apple Inc. All Rights Reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +/* + * Utilities for registering and looking up selectors. The sole + * purpose of the selector tables is a registry whereby there is + * exactly one address (selector) associated with a given string + * (method name). + */ + +#include "objc.h" +#include "objc-private.h" +#include "objc-auto.h" +#include "objc-sel-set.h" + +#ifndef NO_BUILTINS +#include "objc-selopt.h" +#endif + +__BEGIN_DECLS + +#ifndef NO_BUILTINS +// builtins: the actual table used at runtime +// _objc_selopt_data: the usual builtin table, possibly rewritten by dyld +// empty_selopt_data: an empty table to use if DisablePreopt is set +using namespace objc_selopt; +static const objc_selopt_t *builtins = NULL; +extern const objc_selopt_t _objc_selopt_data; // in __TEXT, __objc_selopt +static const uint32_t empty_selopt_data[] = SELOPT_INITIALIZER; +#endif + + +#define NUM_NONBUILTIN_SELS 3500 +// objc_sel_set grows at 3571, 5778, 9349. +// Most apps use 2000..7000 extra sels. Most apps will grow zero to two times. + +static const char *_objc_empty_selector = ""; +static struct __objc_sel_set *_objc_selectors = NULL; + + +#ifndef NO_GC +static inline int ignore_selector(const char *sel) +{ + // force retain/release/autorelease to be a constant value when GC is on + // note that the selectors for "Protocol" are registered before we can + // see the executable image header that sets _WantsGC, so we can't cache + // this result (sigh). + return (UseGC && + ( (sel[0] == 'r' && sel[1] == 'e' && + (_objc_strcmp(&sel[2], "lease") == 0 || + _objc_strcmp(&sel[2], "tain") == 0 || + _objc_strcmp(&sel[2], "tainCount") == 0 )) + || + (_objc_strcmp(sel, "dealloc") == 0) + || + (sel[0] == 'a' && sel[1] == 'u' && + _objc_strcmp(&sel[2], "torelease") == 0))); +} +#endif + + +#ifndef NO_BUILTINS +__private_extern__ void dump_builtins(void) +{ + if (builtins->version != VERSION) { + _objc_inform("BUILTIN SELECTORS: unknown version %d (want %d)", + builtins->version, VERSION); + return; + } + + uint32_t occupied = builtins->occupied; + uint32_t capacity = builtins->capacity; + + const int32_t *offsets = builtins->offsets(); + uint32_t i; + for (i = 0; i < capacity; i++) { + if (offsets[i] != offsetof(objc_selopt_t, zero)) { + const char *str = (const char *)builtins + offsets[i]; + _objc_inform("BUILTIN SELECTORS: %6d: %+8d %s", + i, offsets[i], str); + } else { + _objc_inform("BUILTIN SELECTORS: %6d: ", i); + } + } + + _objc_inform("BUILTIN SELECTORS: %d selectors", occupied); + _objc_inform("BUILTIN SELECTORS: %d/%d (%d%%) hash table occupancy", + occupied, capacity, (int)(occupied/(double)capacity * 100)); + _objc_inform("BUILTIN SELECTORS: using __TEXT,__objc_selopt at %p", + builtins); + _objc_inform("BUILTIN SELECTORS: version: %u", builtins->version); + _objc_inform("BUILTIN SELECTORS: capacity: %u", builtins->capacity); + _objc_inform("BUILTIN SELECTORS: occupied: %u", builtins->occupied); + _objc_inform("BUILTIN SELECTORS: shift: %u", builtins->shift); + _objc_inform("BUILTIN SELECTORS: mask: 0x%x", builtins->mask); + _objc_inform("BUILTIN SELECTORS: zero: %u", builtins->zero); + _objc_inform("BUILTIN SELECTORS: salt: 0x%llx", builtins->salt); + _objc_inform("BUILTIN SELECTORS: base: 0x%llx", builtins->base); +} +#endif + + +static SEL _objc_search_builtins(const char *key) +{ +#if defined(DUMP_SELECTORS) + if (NULL != key) printf("\t\"%s\",\n", key); +#endif + + if (!key) return (SEL)0; +#ifndef NO_GC + if ((uintptr_t)key == kIgnore) return (SEL)kIgnore; + if (ignore_selector(key)) return (SEL)kIgnore; +#endif + if ('\0' == *key) return (SEL)_objc_empty_selector; + +#ifndef NO_BUILTINS + return (SEL)builtins->get(key); +#endif + + return (SEL)0; +} + + +const char *sel_getName(SEL sel) { +#ifndef NO_GC + if ((uintptr_t)sel == kIgnore) return ""; +#endif + return sel ? (const char *)sel : ""; +} + + +BOOL sel_isMapped(SEL name) +{ + SEL result; + + if (!name) return NO; + if ((uintptr_t)name == kIgnore) return YES; + + result = _objc_search_builtins((const char *)name); + if (result) return YES; + + rwlock_read(&selLock); + if (_objc_selectors) { + result = __objc_sel_set_get(_objc_selectors, name); + } + rwlock_unlock_read(&selLock); + return result ? YES : NO; +} + +static SEL __sel_registerName(const char *name, int lock, int copy) +{ + SEL result = 0; + + if (lock) rwlock_assert_unlocked(&selLock); + else rwlock_assert_writing(&selLock); + + if (!name) return (SEL)0; + result = _objc_search_builtins(name); + if (result) return result; + + if (lock) rwlock_read(&selLock); + if (_objc_selectors) { + result = __objc_sel_set_get(_objc_selectors, (SEL)name); + } + if (lock) rwlock_unlock_read(&selLock); + if (result) return result; + + // No match. Insert. + + if (lock) rwlock_write(&selLock); + + if (!_objc_selectors) { + _objc_selectors = __objc_sel_set_create(NUM_NONBUILTIN_SELS); + } + if (lock) { + // Rescan in case it was added while we dropped the lock + result = __objc_sel_set_get(_objc_selectors, (SEL)name); + } + if (!result) { + result = (SEL)(copy ? _strdup_internal(name) : name); + __objc_sel_set_add(_objc_selectors, result); +#if defined(DUMP_UNKNOWN_SELECTORS) + printf("\t\"%s\",\n", name); +#endif + } + + if (lock) rwlock_unlock_write(&selLock); + return result; +} + + +SEL sel_registerName(const char *name) { + return __sel_registerName(name, 1, 1); // YES lock, YES copy +} + +__private_extern__ SEL sel_registerNameNoLock(const char *name, BOOL copy) { + return __sel_registerName(name, 0, copy); // NO lock, maybe copy +} + +__private_extern__ void sel_lock(void) +{ + rwlock_write(&selLock); +} + +__private_extern__ void sel_unlock(void) +{ + rwlock_unlock_write(&selLock); +} + + +// 2001/1/24 +// the majority of uses of this function (which used to return NULL if not found) +// did not check for NULL, so, in fact, never return NULL +// +SEL sel_getUid(const char *name) { + return __sel_registerName(name, 2, 1); // YES lock, YES copy +} + + +BOOL sel_isEqual(SEL lhs, SEL rhs) +{ + return (lhs == rhs) ? YES : NO; +} + + +/*********************************************************************** +* sel_preoptimizationValid +* Return YES if this image's selector fixups are valid courtesy +* of the dyld shared cache. +**********************************************************************/ +__private_extern__ BOOL sel_preoptimizationValid(const header_info *hi) +{ +#ifdef NO_BUILTINS + + return NO; + +#else + +# ifndef NO_GC + // shared cache can't fix ignored selectors + if (UseGC) return NO; +# endif + + // image not from shared cache, or not fixed inside shared cache + if (!_objcHeaderOptimizedByDyld(hi)) return NO; + + // libobjc not from shared cache, or from shared cache but slid + if (builtins->base != (uintptr_t)builtins) return NO; + + return YES; + +#endif +} + + +/*********************************************************************** +* sel_init +* Initialize selector tables and register selectors used internally. +**********************************************************************/ +__private_extern__ void sel_init(BOOL wantsGC) +{ +#ifdef NO_BUILTINS + + disableSelectorPreoptimization(); + +#else + // not set at compile time in order to detect too-early selector operations + builtins = &_objc_selopt_data; + + // Check selector table (possibly built by dyld shared cache) + if (builtins->base == (uintptr_t)builtins && !UseGC && !DisablePreopt) { + // Valid selector table written by dyld shared cache + if (PrintPreopt) { + _objc_inform("PREOPTIMIZATION: selector preoptimization ENABLED " + "(version %d)", builtins->version); + } + } + else { + // Selector table written by dyld shared cache, but slid + // OR selector table not written by dyld shared cache + // OR gc is on which renames ignored selectors + // OR disabled by environment variable + // All preoptimized selector references are invalid. + + // But keep the builtins table itself unless disabled by environment + if (DisablePreopt) builtins = (objc_selopt_t *)empty_selopt_data; + + disableSelectorPreoptimization(); + + if (PrintPreopt) { + const char *why; + if (DisablePreopt) why = "(by OBJC_DISABLE_PREOPTIMIZATION)"; + else if (UseGC) why = "(GC is on)"; + else why = "(dyld shared cache is absent or out of date)"; + _objc_inform("PREOPTIMIZATION: selector preoptimization DISABLED %s", why); + } + } + + // Die if the table looks bad. + // We should always end up with a good dyld table, + // or the compiled-in table, or the compiled-in empty table. + // Failure probably means you forgot to update the compiled-in table data. + // Don't do this before checking DisablePreopt. + if (builtins->version != VERSION) { + _objc_fatal("bad objc selector table (want %d, got %d)", + VERSION, builtins->version); + } + +#endif + + // Register selectors used by libobjc + + if (wantsGC) { + // Registering retain/release/autorelease requires GC decision first. + // sel_init doesn't actually need the wantsGC parameter, it just + // helps enforce the initialization order. + } + +#define s(x) SEL_##x = sel_registerNameNoLock(#x, NO) +#define t(x,y) SEL_##y = sel_registerNameNoLock(#x, NO) + + sel_lock(); + + s(load); + s(initialize); + t(resolveInstanceMethod:, resolveInstanceMethod); + t(resolveClassMethod:, resolveClassMethod); + t(.cxx_construct, cxx_construct); + t(.cxx_destruct, cxx_destruct); + s(retain); + s(release); + s(autorelease); + s(copy); + s(finalize); + + sel_unlock(); + +#undef s +#undef t +} + +__END_DECLS diff --git a/runtime/objc-selopt.h b/runtime/objc-selopt.h new file mode 100644 index 0000000..ca8ad34 --- /dev/null +++ b/runtime/objc-selopt.h @@ -0,0 +1,1041 @@ +/* + * Copyright (c) 2008 Apple Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +/* +Portions derived from: + +-------------------------------------------------------------------- +lookup8.c, by Bob Jenkins, January 4 1997, Public Domain. +hash(), hash2(), hash3, and mix() are externally useful functions. +Routines to test the hash are included if SELF_TEST is defined. +You can use this free for any purpose. It has no warranty. +-------------------------------------------------------------------- + +------------------------------------------------------------------------------ +perfect.c: code to generate code for a hash for perfect hashing. +(c) Bob Jenkins, September 1996, December 1999 +You may use this code in any way you wish, and it is free. No warranty. +I hereby place this in the public domain. +Source is http://burtleburtle.net/bob/c/perfect.c +------------------------------------------------------------------------------ +*/ + +/* + * objc-selopt.h + * Interface between libobjc and dyld + * for selector uniquing in the dyld shared cache. + * + * When building the shared cache, dyld locates all selectors and selector + * references in the cached images. It builds a perfect hash table out of + * them and writes the table into the shared cache copy of libobjc. + * libobjc then uses that table as the builtin selector list. + * + * Versioning + * The table has a version number. dyld and objc can both ignore the table + * if the other used the wrong version number. + * + * Completeness + * Not all libraries are in the shared cache. Libraries that are in the + * shared cache and were optimized are specially marked. Libraries on + * disk never include those marks. + * + * Coherency + * Libraries optimized in the shared cache can be replaced by unoptimized + * copies from disk when loaded. The copy from disk is not marked and will + * be fixed up by libobjc. The shared cache copy is still mapped into the + * process, so the table can point to cstring data in that library's part + * of the shared cache without trouble. + * + * Atomicity + * dyld writes the table itself last. If dyld marks some metadata as + * updated but then fails to write a table for some reason, libobjc + * fixes up all metadata as if it were not marked. + */ + +#ifndef _OBJC_SELOPT_H +#define _OBJC_SELOPT_H + +/* + DO NOT INCLUDE ANY objc HEADERS HERE + dyld USES THIS FILE AND CANNOT SEE THEM +*/ +#include +#include +#include +/* + DO NOT INCLUDE ANY objc HEADERS HERE + dyld USES THIS FILE AND CANNOT SEE THEM +*/ + +// #define SELOPT_DEBUG + +namespace objc_selopt { + + typedef int32_t objc_selopt_offset_t; + +#ifdef SELOPT_WRITE + +// Perfect hash code is at the end of this file. + +struct perfect_hash { + uint32_t capacity; + uint32_t occupied; + uint32_t shift; + uint32_t mask; + uint64_t salt; + + uint32_t scramble[256]; + uint8_t *tab; // count == mask+1; free with delete[] + + perfect_hash() : tab(0) { } + + ~perfect_hash() { if (tab) delete[] tab; } +}; + +struct eqstr { + bool operator()(const char* s1, const char* s2) const { + return strcmp(s1, s2) == 0; + } +}; + +typedef __gnu_cxx::hash_map, eqstr> string_map; + +static perfect_hash make_perfect(const string_map& strings); + +#endif + +static uint64_t lookup8( uint8_t *k, size_t length, uint64_t level); + +enum { VERSION = 3 }; + +struct objc_selopt_t { + + uint32_t version; /* this is version 3: external cstrings */ + uint32_t capacity; + uint32_t occupied; + uint32_t shift; + uint32_t mask; + uint32_t zero; + uint64_t salt; + uint64_t base; + + uint32_t scramble[256]; + uint8_t tab[0]; /* tab[mask+1] (always power-of-2) */ + // int32_t offsets[capacity]; /* offsets from &version to cstrings */ + + objc_selopt_offset_t *offsets() { return (objc_selopt_offset_t *)&tab[mask+1]; } + const objc_selopt_offset_t *offsets() const { return (const objc_selopt_offset_t *)&tab[mask+1]; } + + uint32_t hash(const char *key) const + { + uint64_t val = lookup8((uint8_t*)key, strlen(key), salt); + uint32_t index = (uint32_t)(val>>shift) ^ scramble[tab[val&mask]]; + return index; + } + + const char *get(const char *key) const + { + const char *result = (const char *)this + offsets()[hash(key)]; + if (0 == strcmp(key, result)) return result; + else return NULL; + } + +#ifdef SELOPT_WRITE + void set(const char *key, objc_selopt_offset_t value) + { + offsets()[hash(key)] = value; + } +#endif +}; + +// Initializer for empty table of type uint32_t[]. +#define X8(x) x, x, x, x, x, x, x, x +#define X64(x) X8(x), X8(x), X8(x), X8(x), X8(x), X8(x), X8(x), X8(x) +#define X256(x) X64(x), X64(x), X64(x), X64(x) +#define SELOPT_INITIALIZER \ + { objc_selopt::VERSION, 4, 4, 63, 3, 0, 0,0, 0,0, X256(0), 0, 20, 20, 20, 20 }; + + +/* +-------------------------------------------------------------------- +mix -- mix 3 64-bit values reversibly. +mix() takes 48 machine instructions, but only 24 cycles on a superscalar + machine (like Intel's new MMX architecture). It requires 4 64-bit + registers for 4::2 parallelism. +All 1-bit deltas, all 2-bit deltas, all deltas composed of top bits of + (a,b,c), and all deltas of bottom bits were tested. All deltas were + tested both on random keys and on keys that were nearly all zero. + These deltas all cause every bit of c to change between 1/3 and 2/3 + of the time (well, only 113/400 to 287/400 of the time for some + 2-bit delta). These deltas all cause at least 80 bits to change + among (a,b,c) when the mix is run either forward or backward (yes it + is reversible). +This implies that a hash using mix64 has no funnels. There may be + characteristics with 3-bit deltas or bigger, I didn't test for + those. +-------------------------------------------------------------------- +*/ +#define mix64(a,b,c) \ +{ \ + a -= b; a -= c; a ^= (c>>43); \ + b -= c; b -= a; b ^= (a<<9); \ + c -= a; c -= b; c ^= (b>>8); \ + a -= b; a -= c; a ^= (c>>38); \ + b -= c; b -= a; b ^= (a<<23); \ + c -= a; c -= b; c ^= (b>>5); \ + a -= b; a -= c; a ^= (c>>35); \ + b -= c; b -= a; b ^= (a<<49); \ + c -= a; c -= b; c ^= (b>>11); \ + a -= b; a -= c; a ^= (c>>12); \ + b -= c; b -= a; b ^= (a<<18); \ + c -= a; c -= b; c ^= (b>>22); \ +} + +/* +-------------------------------------------------------------------- +hash() -- hash a variable-length key into a 64-bit value + k : the key (the unaligned variable-length array of bytes) + len : the length of the key, counting by bytes + level : can be any 8-byte value +Returns a 64-bit value. Every bit of the key affects every bit of +the return value. No funnels. Every 1-bit and 2-bit delta achieves +avalanche. About 41+5len instructions. + +The best hash table sizes are powers of 2. There is no need to do +mod a prime (mod is sooo slow!). If you need less than 64 bits, +use a bitmask. For example, if you need only 10 bits, do + h = (h & hashmask(10)); +In which case, the hash table should have hashsize(10) elements. + +If you are hashing n strings (uint8_t **)k, do it like this: + for (i=0, h=0; i= 24) + { + a += (k[0] +((uint64_t)k[ 1]<< 8)+((uint64_t)k[ 2]<<16)+((uint64_t)k[ 3]<<24) + +((uint64_t)k[4 ]<<32)+((uint64_t)k[ 5]<<40)+((uint64_t)k[ 6]<<48)+((uint64_t)k[ 7]<<56)); + b += (k[8] +((uint64_t)k[ 9]<< 8)+((uint64_t)k[10]<<16)+((uint64_t)k[11]<<24) + +((uint64_t)k[12]<<32)+((uint64_t)k[13]<<40)+((uint64_t)k[14]<<48)+((uint64_t)k[15]<<56)); + c += (k[16] +((uint64_t)k[17]<< 8)+((uint64_t)k[18]<<16)+((uint64_t)k[19]<<24) + +((uint64_t)k[20]<<32)+((uint64_t)k[21]<<40)+((uint64_t)k[22]<<48)+((uint64_t)k[23]<<56)); + mix64(a,b,c); + k += 24; len -= 24; + } + + /*------------------------------------- handle the last 23 bytes */ + c += length; + switch(len) /* all the case statements fall through */ + { + case 23: c+=((uint64_t)k[22]<<56); + case 22: c+=((uint64_t)k[21]<<48); + case 21: c+=((uint64_t)k[20]<<40); + case 20: c+=((uint64_t)k[19]<<32); + case 19: c+=((uint64_t)k[18]<<24); + case 18: c+=((uint64_t)k[17]<<16); + case 17: c+=((uint64_t)k[16]<<8); + /* the first byte of c is reserved for the length */ + case 16: b+=((uint64_t)k[15]<<56); + case 15: b+=((uint64_t)k[14]<<48); + case 14: b+=((uint64_t)k[13]<<40); + case 13: b+=((uint64_t)k[12]<<32); + case 12: b+=((uint64_t)k[11]<<24); + case 11: b+=((uint64_t)k[10]<<16); + case 10: b+=((uint64_t)k[ 9]<<8); + case 9: b+=((uint64_t)k[ 8]); + case 8: a+=((uint64_t)k[ 7]<<56); + case 7: a+=((uint64_t)k[ 6]<<48); + case 6: a+=((uint64_t)k[ 5]<<40); + case 5: a+=((uint64_t)k[ 4]<<32); + case 4: a+=((uint64_t)k[ 3]<<24); + case 3: a+=((uint64_t)k[ 2]<<16); + case 2: a+=((uint64_t)k[ 1]<<8); + case 1: a+=((uint64_t)k[ 0]); + /* case 0: nothing left to add */ + } + mix64(a,b,c); + /*-------------------------------------------- report the result */ + return c; +} + + +#ifdef SELOPT_WRITE + +static const char * +write_selopt(void *dst, uint64_t base, size_t dstSize, + string_map& strings, bool little_endian, + size_t *outSize) +{ + if (strings.size() == 0) return false; + + perfect_hash phash = make_perfect(strings); + if (phash.capacity == 0) { + return "perfect hash failed (selectors not optimized)"; + } + + size_t size = sizeof(objc_selopt_t) + (phash.mask+1) + phash.capacity * sizeof(objc_selopt_offset_t); + if (size > dstSize) { + return "selector section too small (selectors not optimized)"; + } + + uint8_t *buf = new uint8_t[size]; + objc_selopt_t *selopt = (objc_selopt_t *)buf; + + // Set header + selopt->version = VERSION; + selopt->capacity = phash.capacity; + selopt->occupied = phash.occupied; + selopt->shift = phash.shift; + selopt->mask = phash.mask; + selopt->zero = 0; + selopt->salt = phash.salt; + selopt->base = base; + + // Set hash data + for (uint32_t i = 0; i < 256; i++) { + selopt->scramble[i] = phash.scramble[i]; + } + for (uint32_t i = 0; i < phash.mask+1; i++) { + selopt->tab[i] = phash.tab[i]; + } + + // Set offsets to "" + for (uint32_t i = 0; i < phash.capacity; i++) { + selopt->offsets()[i] = + (objc_selopt_offset_t)offsetof(objc_selopt_t, zero); + } + + // Set real string offsets +# define SHIFT (64 - 8*sizeof(objc_selopt_offset_t)) + string_map::const_iterator s; + for (s = strings.begin(); s != strings.end(); ++s) { + int64_t offset = s->second - base; + if ((offset<>SHIFT != offset) { + delete[] buf; + return "selector offset too big (selectors not optimized)"; + } + selopt->set(s->first, (objc_selopt_offset_t)offset); + } +# undef SHIFT; + + // Byte-swap everything +#define S32(x) x = little_endian ? OSSwapHostToLittleInt32(x) : OSSwapHostToBigInt32(x) +#define S64(x) x = little_endian ? OSSwapHostToLittleInt64(x) : OSSwapHostToBigInt64(x) + for (uint32_t i = 0; i < 256; i++) { + S32(selopt->scramble[i]); + } + // tab is array of bytes, no swap needed + for (uint32_t i = 0; i < phash.capacity; i++) { + S32(selopt->offsets()[i]); + } + + S32(selopt->version); + S32(selopt->capacity); + S32(selopt->occupied); + S32(selopt->shift); + S32(selopt->mask); + S32(selopt->zero); + S64(selopt->salt); + S64(selopt->base); +#undef S32 +#undef S64 + + memcpy(dst, selopt, size); + if (outSize) *outSize = size; + + delete[] buf; + return NULL; +} + + +/* +------------------------------------------------------------------------------ +This generates a minimal perfect hash function. That means, given a +set of n keys, this determines a hash function that maps each of +those keys into a value in 0..n-1 with no collisions. + +The perfect hash function first uses a normal hash function on the key +to determine (a,b) such that the pair (a,b) is distinct for all +keys, then it computes a^scramble[tab[b]] to get the final perfect hash. +tab[] is an array of 1-byte values and scramble[] is a 256-term array of +2-byte or 4-byte values. If there are n keys, the length of tab[] is a +power of two between n/3 and n. + +I found the idea of computing distinct (a,b) values in "Practical minimal +perfect hash functions for large databases", Fox, Heath, Chen, and Daoud, +Communications of the ACM, January 1992. They found the idea in Chichelli +(CACM Jan 1980). Beyond that, our methods differ. + +The key is hashed to a pair (a,b) where a in 0..*alen*-1 and b in +0..*blen*-1. A fast hash function determines both a and b +simultaneously. Any decent hash function is likely to produce +hashes so that (a,b) is distinct for all pairs. I try the hash +using different values of *salt* until all pairs are distinct. + +The final hash is (a XOR scramble[tab[b]]). *scramble* is a +predetermined mapping of 0..255 into 0..smax-1. *tab* is an +array that we fill in in such a way as to make the hash perfect. + +First we fill in all values of *tab* that are used by more than one +key. We try all possible values for each position until one works. + +This leaves m unmapped keys and m values that something could hash to. +If you treat unmapped keys as lefthand nodes and unused hash values +as righthand nodes, and draw a line connecting each key to each hash +value it could map to, you get a bipartite graph. We attempt to +find a perfect matching in this graph. If we succeed, we have +determined a perfect hash for the whole set of keys. + +*scramble* is used because (a^tab[i]) clusters keys around *a*. +------------------------------------------------------------------------------ +*/ + +typedef uint64_t ub8; +#define UB8MAXVAL 0xffffffffffffffffLL +#define UB8BITS 64 +typedef uint32_t ub4; +#define UB4MAXVAL 0xffffffff +#define UB4BITS 32 +typedef uint16_t ub2; +#define UB2MAXVAL 0xffff +#define UB2BITS 16 +typedef uint8_t ub1; +#define UB1MAXVAL 0xff +#define UB1BITS 8 + +#define TRUE 1 +#define FALSE 0 + +#define SCRAMBLE_LEN 256 // ((ub4)1<<16) /* length of *scramble* */ +#define RETRY_INITKEY 2048 /* number of times to try to find distinct (a,b) */ +#define RETRY_PERFECT 4 /* number of times to try to make a perfect hash */ + + +/* representation of a key */ +struct key +{ + ub1 *name_k; /* the actual key */ + ub4 len_k; /* the length of the actual key */ + ub4 hash_k; /* the initial hash value for this key */ +/* beyond this point is mapping-dependent */ + ub4 a_k; /* a, of the key maps to (a,b) */ + ub4 b_k; /* b, of the key maps to (a,b) */ + struct key *nextb_k; /* next key with this b */ +}; +typedef struct key key; + +/* things indexed by b of original (a,b) pair */ +struct bstuff +{ + ub2 val_b; /* hash=a^tabb[b].val_b */ + key *list_b; /* tabb[i].list_b is list of keys with b==i */ + ub4 listlen_b; /* length of list_b */ + ub4 water_b; /* high watermark of who has visited this map node */ +}; +typedef struct bstuff bstuff; + +/* things indexed by final hash value */ +struct hstuff +{ + key *key_h; /* tabh[i].key_h is the key with a hash of i */ +}; +typedef struct hstuff hstuff; + +/* things indexed by queue position */ +struct qstuff +{ + bstuff *b_q; /* b that currently occupies this hash */ + ub4 parent_q; /* queue position of parent that could use this hash */ + ub2 newval_q; /* what to change parent tab[b] to to use this hash */ + ub2 oldval_q; /* original value of tab[b] */ +}; +typedef struct qstuff qstuff; + + +/* +------------------------------------------------------------------------------ +Find the mapping that will produce a perfect hash +------------------------------------------------------------------------------ +*/ + +/* return the ceiling of the log (base 2) of val */ +static ub4 log2u(ub4 val) +{ + ub4 i; + for (i=0; ((ub4)1<>const3)); + x = (x+(x<>const5)); + } + return x; +} + +/* initialize scramble[] with distinct random values in 0..smax-1 */ +static void scrambleinit(ub4 *scramble, ub4 smax) +// ub4 *scramble; /* hash is a^scramble[tab[b]] */ +// ub4 smax; /* scramble values should be in 0..smax-1 */ +{ + ub4 i; + + /* fill scramble[] with distinct random integers in 0..smax-1 */ + for (i=0; ib_k + * check if the initial hash might work + */ +static int inittab(bstuff *tabb, ub4 blen, key *keys, ub4 nkeys, int complete) +// bstuff *tabb; /* output, list of keys with b for (a,b) */ +// ub4 blen; /* length of tabb */ +// key *keys; /* list of keys already hashed */ +// int complete; /* TRUE means to complete init despite collisions */ +{ + int nocollision = TRUE; + ub4 i; + + memset((void *)tabb, 0, (size_t)(sizeof(bstuff)*blen)); + + /* Two keys with the same (a,b) guarantees a collision */ + for (i = 0; i < nkeys; i++) { + key *mykey = keys+i; + key *otherkey; + + for (otherkey=tabb[mykey->b_k].list_b; + otherkey; + otherkey=otherkey->nextb_k) + { + if (mykey->a_k == otherkey->a_k) + { + nocollision = FALSE; + if (!complete) + return FALSE; + } + } + ++tabb[mykey->b_k].listlen_b; + mykey->nextb_k = tabb[mykey->b_k].list_b; + tabb[mykey->b_k].list_b = mykey; + } + + /* no two keys have the same (a,b) pair */ + return nocollision; +} + + +/* Do the initial hash for normal mode (use lookup and checksum) */ +static void initnorm(key *keys, ub4 nkeys, ub4 alen, ub4 blen, ub4 smax, ub8 salt) +// key *keys; /* list of all keys */ +// ub4 alen; /* (a,b) has a in 0..alen-1, a power of 2 */ +// ub4 blen; /* (a,b) has b in 0..blen-1, a power of 2 */ +// ub4 smax; /* maximum range of computable hash values */ +// ub4 salt; /* used to initialize the hash function */ +// gencode *final; /* output, code for the final hash */ +{ + ub4 loga = log2u(alen); /* log based 2 of blen */ + ub4 i; + for (i = 0; i < nkeys; i++) { + key *mykey = keys+i; + ub8 hash = lookup8(mykey->name_k, mykey->len_k, salt); + mykey->a_k = (loga > 0) ? hash>>(UB8BITS-loga) : 0; + mykey->b_k = (blen > 1) ? hash&(blen-1) : 0; + } +} + + +/* Try to apply an augmenting list */ +static int apply(bstuff *tabb, hstuff *tabh, qstuff *tabq, ub4 blen, ub4 *scramble, ub4 tail, int rollback) +// bstuff *tabb; +// hstuff *tabh; +// qstuff *tabq; +// ub4 blen; +// ub4 *scramble; +// ub4 tail; +// int rollback; /* FALSE applies augmenting path, TRUE rolls back */ +{ + ub4 hash; + key *mykey; + bstuff *pb; + ub4 child; + ub4 parent; + ub4 stabb; /* scramble[tab[b]] */ + + /* walk from child to parent */ + for (child=tail-1; child; child=parent) + { + parent = tabq[child].parent_q; /* find child's parent */ + pb = tabq[parent].b_q; /* find parent's list of siblings */ + + /* erase old hash values */ + stabb = scramble[pb->val_b]; + for (mykey=pb->list_b; mykey; mykey=mykey->nextb_k) + { + hash = mykey->a_k^stabb; + if (mykey == tabh[hash].key_h) + { /* erase hash for all of child's siblings */ + tabh[hash].key_h = (key *)0; + } + } + + /* change pb->val_b, which will change the hashes of all parent siblings */ + pb->val_b = (rollback ? tabq[child].oldval_q : tabq[child].newval_q); + + /* set new hash values */ + stabb = scramble[pb->val_b]; + for (mykey=pb->list_b; mykey; mykey=mykey->nextb_k) + { + hash = mykey->a_k^stabb; + if (rollback) + { + if (parent == 0) continue; /* root never had a hash */ + } + else if (tabh[hash].key_h) + { + /* very rare: roll back any changes */ + apply(tabb, tabh, tabq, blen, scramble, tail, TRUE); + return FALSE; /* failure, collision */ + } + tabh[hash].key_h = mykey; + } + } + return TRUE; +} + + +/* +------------------------------------------------------------------------------- +augment(): Add item to the mapping. + +Construct a spanning tree of *b*s with *item* as root, where each +parent can have all its hashes changed (by some new val_b) with +at most one collision, and each child is the b of that collision. + +I got this from Tarjan's "Data Structures and Network Algorithms". The +path from *item* to a *b* that can be remapped with no collision is +an "augmenting path". Change values of tab[b] along the path so that +the unmapped key gets mapped and the unused hash value gets used. + +Assuming 1 key per b, if m out of n hash values are still unused, +you should expect the transitive closure to cover n/m nodes before +an unused node is found. Sum(i=1..n)(n/i) is about nlogn, so expect +this approach to take about nlogn time to map all single-key b's. +------------------------------------------------------------------------------- +*/ +static int augment(bstuff *tabb, hstuff *tabh, qstuff *tabq, ub4 blen, ub4 *scramble, ub4 smax, bstuff *item, ub4 nkeys, + ub4 highwater) +// bstuff *tabb; /* stuff indexed by b */ +// hstuff *tabh; /* which key is associated with which hash, indexed by hash */ +// qstuff *tabq; /* queue of *b* values, this is the spanning tree */ +// ub4 blen; /* length of tabb */ +// ub4 *scramble; /* final hash is a^scramble[tab[b]] */ +// ub4 smax; /* highest value in scramble */ +// bstuff *item; /* &tabb[b] for the b to be mapped */ +// ub4 nkeys; /* final hash must be in 0..nkeys-1 */ +// ub4 highwater; /* a value higher than any now in tabb[].water_b */ +{ + ub4 q; /* current position walking through the queue */ + ub4 tail; /* tail of the queue. 0 is the head of the queue. */ + ub4 limit=UB1MAXVAL+1; + ub4 highhash = smax; + + /* initialize the root of the spanning tree */ + tabq[0].b_q = item; + tail = 1; + + /* construct the spanning tree by walking the queue, add children to tail */ + for (q=0; qval_b */ + + if (q == 1) + break; /* don't do transitive closure */ + + for (i=0; ilist_b; mykey; mykey=mykey->nextb_k) + { + key *childkey; + ub4 hash = mykey->a_k^scramble[i]; + + if (hash >= highhash) break; /* out of bounds */ + childkey = tabh[hash].key_h; + + if (childkey) + { + bstuff *hitb = &tabb[childkey->b_k]; + + if (childb) + { + if (childb != hitb) break; /* hit at most one child b */ + } + else + { + childb = hitb; /* remember this as childb */ + if (childb->water_b == highwater) break; /* already explored */ + } + } + } + if (mykey) continue; /* myb with i has multiple collisions */ + + /* add childb to the queue of reachable things */ + if (childb) childb->water_b = highwater; + tabq[tail].b_q = childb; + tabq[tail].newval_q = i; /* how to make parent (myb) use this hash */ + tabq[tail].oldval_q = myb->val_b; /* need this for rollback */ + tabq[tail].parent_q = q; + ++tail; + + if (!childb) + { /* found an *i* with no collisions? */ + /* try to apply the augmenting path */ + if (apply(tabb, tabh, tabq, blen, scramble, tail, FALSE)) + return TRUE; /* success, item was added to the perfect hash */ + + --tail; /* don't know how to handle such a child! */ + } + } + } + return FALSE; +} + + +/* find a mapping that makes this a perfect hash */ +static int perfect(bstuff *tabb, hstuff *tabh, qstuff *tabq, ub4 blen, ub4 smax, ub4 *scramble, ub4 nkeys) +{ + ub4 maxkeys; /* maximum number of keys for any b */ + ub4 i, j; + +#ifdef SELOPT_DEBUG + fprintf(stderr, " blen %d smax %d nkeys %d\n", blen, smax, nkeys); +#endif + + /* clear any state from previous attempts */ + memset((void *)tabh, 0, sizeof(hstuff)*smax); + memset((void *)tabq, 0, sizeof(qstuff)*(blen+1)); + + for (maxkeys=0,i=0; i maxkeys) + maxkeys = tabb[i].listlen_b; + + /* In descending order by number of keys, map all *b*s */ + for (j=maxkeys; j>0; --j) + for (i=0; i= RETRY_INITKEY) + { + /* Try to put more bits in (A,B) to make distinct (A,B) more likely */ + if (*alen < maxalen) + { + *alen *= 2; + } + else if (*blen < smax) + { + *blen *= 2; + delete[] tabq; + delete[] *tabb; + *tabb = new bstuff[*blen]; + tabq = new qstuff[*blen+1]; + } + bad_initkey = 0; + bad_perfect = 0; + } + continue; /* two keys have same (a,b) pair */ + } + + /* Given distinct (A,B) for all keys, build a perfect hash */ + if (!perfect(*tabb, tabh, tabq, *blen, smax, scramble, nkeys)) + { + if (++bad_perfect >= RETRY_PERFECT) + { + if (*blen < smax) + { + *blen *= 2; + delete[] *tabb; + delete[] tabq; + *tabb = new bstuff[*blen]; + tabq = new qstuff[*blen+1]; + --si; /* we know this salt got distinct (A,B) */ + } + else + { + return 0; + } + bad_perfect = 0; + } + continue; + } + + break; + } + + /* free working memory */ + delete[] tabh; + delete[] tabq; + + return 1; +} + +/* +------------------------------------------------------------------------------ +Input/output type routines +------------------------------------------------------------------------------ +*/ + +/* get the list of keys */ +static void getkeys(key **keys, ub4 *nkeys, const string_map& strings) +{ + key *buf = new key[strings.size()]; + size_t i; + string_map::const_iterator s; + for (i = 0, s = strings.begin(); s != strings.end(); ++s, ++i) { + key *mykey = buf+i; + mykey->name_k = (ub1 *)s->first; + mykey->len_k = (ub4)strlen(s->first); + } + *keys = buf; + *nkeys = strings.size(); +} + + +static perfect_hash +make_perfect(const string_map& strings) +{ + ub4 nkeys; /* number of keys */ + key *keys; /* head of list of keys */ + bstuff *tab; /* table indexed by b */ + ub4 smax; /* scramble[] values in 0..smax-1, a power of 2 */ + ub4 alen; /* a in 0..alen-1, a power of 2 */ + ub4 blen; /* b in 0..blen-1, a power of 2 */ + ub8 salt; /* a parameter to the hash function */ + ub4 scramble[SCRAMBLE_LEN]; /* used in final hash function */ + int ok; + int i; + perfect_hash result; + + /* read in the list of keywords */ + getkeys(&keys, &nkeys, strings); + + /* find the hash */ + smax = ((ub4)1< -#include -#include -#include -#include -#include -#include - -#include "objc-sync.h" #include "objc-private.h" +#include "objc-sync.h" // // Allocate a lock only when needed. Since few locks are needed at any point // in time, keep them on a single list. // -static pthread_mutexattr_t sRecursiveLockAttr; -static bool sRecursiveLockAttrIntialized = false; - -static pthread_mutexattr_t* recursiveAttributes() -{ - if ( !sRecursiveLockAttrIntialized ) { - int err = pthread_mutexattr_init(&sRecursiveLockAttr); - require_noerr_string(err, done, "pthread_mutexattr_init failed"); - - err = pthread_mutexattr_settype(&sRecursiveLockAttr, PTHREAD_MUTEX_RECURSIVE); - require_noerr_string(err, done, "pthread_mutexattr_settype failed"); - - sRecursiveLockAttrIntialized = true; - } - -done: - return &sRecursiveLockAttr; -} - - -typedef uintptr_t spin_lock_t; -extern void _spin_lock(spin_lock_t *lockp); -extern int _spin_lock_try(spin_lock_t *lockp); -extern void _spin_unlock(spin_lock_t *lockp); typedef struct SyncData { struct SyncData* nextData; id object; int threadCount; // number of THREADS using this block - pthread_mutex_t mutex; - pthread_cond_t conditionVariable; + recursive_mutex_t mutex; } SyncData; typedef struct { @@ -81,9 +48,19 @@ typedef struct SyncCache { SyncCacheItem list[0]; } SyncCache; +/* + Fast cache: two fixed pthread keys store a single SyncCacheItem. + This avoids malloc of the SyncCache for threads that only synchronize + a single object at a time. + SYNC_DATA_DIRECT_KEY == SyncCacheItem.data + SYNC_COUNT_DIRECT_KEY == SyncCacheItem.lockCount + */ + typedef struct { - spin_lock_t lock; SyncData *data; + OSSpinLock lock; + + char align[64 - sizeof (OSSpinLock) - sizeof (SyncData *)]; } SyncList __attribute__((aligned(64))); // aligned to put locks on separate cache lines @@ -135,15 +112,59 @@ __private_extern__ void _destroySyncCache(struct SyncCache *cache) static SyncData* id2data(id object, enum usage why) { - spin_lock_t *lockp = &LOCK_FOR_OBJ(object); + OSSpinLock *lockp = &LOCK_FOR_OBJ(object); SyncData **listp = &LIST_FOR_OBJ(object); SyncData* result = NULL; - int err; + +#ifndef NO_DIRECT_THREAD_KEYS + // Check per-thread single-entry fast cache for matching object + BOOL fastCacheOccupied = NO; + SyncData *data = tls_get_direct(SYNC_DATA_DIRECT_KEY); + if (data) { + fastCacheOccupied = YES; + + if (data->object == object) { + // Found a match in fast cache. + uintptr_t lockCount; + + result = data; + lockCount = (uintptr_t)tls_get_direct(SYNC_COUNT_DIRECT_KEY); + require_action_string(result->threadCount > 0, fastcache_done, + result = NULL, "id2data fastcache is buggy"); + require_action_string(lockCount > 0, fastcache_done, + result = NULL, "id2data fastcache is buggy"); + + switch(why) { + case ACQUIRE: { + lockCount++; + tls_set_direct(SYNC_COUNT_DIRECT_KEY, (void*)lockCount); + break; + } + case RELEASE: + lockCount--; + tls_set_direct(SYNC_COUNT_DIRECT_KEY, (void*)lockCount); + if (lockCount == 0) { + // remove from fast cache + tls_set_direct(SYNC_DATA_DIRECT_KEY, NULL); + // atomic because may collide with concurrent ACQUIRE + OSAtomicDecrement32Barrier(&result->threadCount); + } + break; + case CHECK: + // do nothing + break; + } + + fastcache_done: + return result; + } + } +#endif // Check per-thread cache of already-owned locks for matching object SyncCache *cache = fetch_cache(NO); if (cache) { - int i; + unsigned int i; for (i = 0; i < cache->used; i++) { SyncCacheItem *item = &cache->list[i]; if (item->data->object != object) continue; @@ -173,7 +194,7 @@ static SyncData* id2data(id object, enum usage why) break; } - cache_done: + cache_done: return result; } } @@ -185,62 +206,73 @@ static SyncData* id2data(id object, enum usage why) // We could keep the nodes in some hash table if we find that there are // more than 20 or so distinct locks active, but we don't do that now. - _spin_lock(lockp); - - SyncData* p; - SyncData* firstUnused = NULL; - for (p = *listp; p != NULL; p = p->nextData) { - if ( p->object == object ) { - result = p; - // atomic because may collide with concurrent RELEASE - OSAtomicIncrement32Barrier(&result->threadCount); - goto done; + OSSpinLockLock(lockp); + + { + SyncData* p; + SyncData* firstUnused = NULL; + for (p = *listp; p != NULL; p = p->nextData) { + if ( p->object == object ) { + result = p; + // atomic because may collide with concurrent RELEASE + OSAtomicIncrement32Barrier(&result->threadCount); + goto done; + } + if ( (firstUnused == NULL) && (p->threadCount == 0) ) + firstUnused = p; } - if ( (firstUnused == NULL) && (p->threadCount == 0) ) - firstUnused = p; - } - // no SyncData currently associated with object - if ( (why == RELEASE) || (why == CHECK) ) - goto done; + // no SyncData currently associated with object + if ( (why == RELEASE) || (why == CHECK) ) + goto done; - // an unused one was found, use it - if ( firstUnused != NULL ) { - result = firstUnused; - result->object = object; - result->threadCount = 1; - goto done; + // an unused one was found, use it + if ( firstUnused != NULL ) { + result = firstUnused; + result->object = object; + result->threadCount = 1; + goto done; + } } // malloc a new SyncData and add to list. // XXX calling malloc with a global lock held is bad practice, // might be worth releasing the lock, mallocing, and searching again. // But since we never free these guys we won't be stuck in malloc very often. - result = (SyncData*)malloc(sizeof(SyncData)); + result = (SyncData*)calloc(sizeof(SyncData), 1); result->object = object; result->threadCount = 1; - err = pthread_mutex_init(&result->mutex, recursiveAttributes()); - require_noerr_string(err, done, "pthread_mutex_init failed"); - err = pthread_cond_init(&result->conditionVariable, NULL); - require_noerr_string(err, done, "pthread_cond_init failed"); + recursive_mutex_init(&result->mutex); result->nextData = *listp; *listp = result; done: - _spin_unlock(lockp); + OSSpinLockUnlock(lockp); if (result) { // Only new ACQUIRE should get here. // All RELEASE and CHECK and recursive ACQUIRE are - // handled by the per-thread cache above. + // handled by the per-thread caches above. require_string(result != NULL, really_done, "id2data is buggy"); require_action_string(why == ACQUIRE, really_done, result = NULL, "id2data is buggy"); require_action_string(result->object == object, really_done, result = NULL, "id2data is buggy"); - - if (!cache) cache = fetch_cache(YES); - cache->list[cache->used++] = (SyncCacheItem){result, 1}; + +#ifndef NO_DIRECT_THREAD_KEYS + if (!fastCacheOccupied) { + // Save in fast thread cache + tls_set_direct(SYNC_DATA_DIRECT_KEY, result); + tls_set_direct(SYNC_COUNT_DIRECT_KEY, (void*)1); + } else +#endif + { + // Save in thread cache + if (!cache) cache = fetch_cache(YES); + cache->list[cache->used].data = result; + cache->list[cache->used].lockCount = 1; + cache->used++; + } } really_done: @@ -255,8 +287,8 @@ int objc_sync_nil(void) } -// Begin synchronizing on 'obj'. -// Allocates recursive pthread_mutex associated with 'obj' if needed. +// Begin synchronizing on 'obj'. +// Allocates recursive mutex associated with 'obj' if needed. // Returns OBJC_SYNC_SUCCESS once lock is acquired. int objc_sync_enter(id obj) { @@ -266,8 +298,8 @@ int objc_sync_enter(id obj) SyncData* data = id2data(obj, ACQUIRE); require_action_string(data != NULL, done, result = OBJC_SYNC_NOT_INITIALIZED, "id2data failed"); - result = pthread_mutex_lock(&data->mutex); - require_noerr_string(result, done, "pthread_mutex_lock failed"); + result = recursive_mutex_lock(&data->mutex); + require_noerr_string(result, done, "mutex_lock failed"); } else { // @synchronized(nil) does nothing if (DebugNilSync) { @@ -291,96 +323,35 @@ int objc_sync_exit(id obj) SyncData* data = id2data(obj, RELEASE); require_action_string(data != NULL, done, result = OBJC_SYNC_NOT_OWNING_THREAD_ERROR, "id2data failed"); - result = pthread_mutex_unlock(&data->mutex); - require_noerr_string(result, done, "pthread_mutex_unlock failed"); + result = recursive_mutex_unlock(&data->mutex); + require_noerr_string(result, done, "mutex_unlock failed"); } else { // @synchronized(nil) does nothing } done: - if ( result == EPERM ) - result = OBJC_SYNC_NOT_OWNING_THREAD_ERROR; + if ( result == RECURSIVE_MUTEX_NOT_LOCKED ) + result = OBJC_SYNC_NOT_OWNING_THREAD_ERROR; return result; } -// Temporarily release lock on 'obj' and wait for another thread to notify on 'obj' -// Return OBJC_SYNC_SUCCESS, OBJC_SYNC_NOT_OWNING_THREAD_ERROR, OBJC_SYNC_TIMED_OUT, OBJC_SYNC_INTERRUPTED -int objc_sync_wait(id obj, long long milliSecondsMaxWait) -{ - int result = OBJC_SYNC_SUCCESS; - - SyncData* data = id2data(obj, CHECK); - require_action_string(data != NULL, done, result = OBJC_SYNC_NOT_OWNING_THREAD_ERROR, "id2data failed"); - - - // XXX need to retry cond_wait under out-of-our-control failures - if ( milliSecondsMaxWait == 0 ) { - result = pthread_cond_wait(&data->conditionVariable, &data->mutex); - require_noerr_string(result, done, "pthread_cond_wait failed"); - } - else { - struct timespec maxWait; - maxWait.tv_sec = (time_t)(milliSecondsMaxWait / 1000); - maxWait.tv_nsec = (long)((milliSecondsMaxWait - (maxWait.tv_sec * 1000)) * 1000000); - result = pthread_cond_timedwait_relative_np(&data->conditionVariable, &data->mutex, &maxWait); - require_noerr_string(result, done, "pthread_cond_timedwait_relative_np failed"); - } - // no-op to keep compiler from complaining about branch to next instruction - data = NULL; +#if TARGET_OS_MAC && !TARGET_OS_EMBEDDED -done: - if ( result == EPERM ) - result = OBJC_SYNC_NOT_OWNING_THREAD_ERROR; - else if ( result == ETIMEDOUT ) - result = OBJC_SYNC_TIMED_OUT; - - return result; +int objc_sync_wait(id obj, long long max) +{ + _objc_fatal("Do not call objc_sync_wait."); } - -// Wake up another thread waiting on 'obj' -// Return OBJC_SYNC_SUCCESS, OBJC_SYNC_NOT_OWNING_THREAD_ERROR int objc_sync_notify(id obj) { - int result = OBJC_SYNC_SUCCESS; - - SyncData* data = id2data(obj, CHECK); - require_action_string(data != NULL, done, result = OBJC_SYNC_NOT_OWNING_THREAD_ERROR, "id2data failed"); - - result = pthread_cond_signal(&data->conditionVariable); - require_noerr_string(result, done, "pthread_cond_signal failed"); - -done: - if ( result == EPERM ) - result = OBJC_SYNC_NOT_OWNING_THREAD_ERROR; - - return result; + _objc_fatal("Do not call objc_sync_notify."); } - -// Wake up all threads waiting on 'obj' -// Return OBJC_SYNC_SUCCESS, OBJC_SYNC_NOT_OWNING_THREAD_ERROR int objc_sync_notifyAll(id obj) { - int result = OBJC_SYNC_SUCCESS; - - SyncData* data = id2data(obj, CHECK); - require_action_string(data != NULL, done, result = OBJC_SYNC_NOT_OWNING_THREAD_ERROR, "id2data failed"); - - result = pthread_cond_broadcast(&data->conditionVariable); - require_noerr_string(result, done, "pthread_cond_broadcast failed"); - -done: - if ( result == EPERM ) - result = OBJC_SYNC_NOT_OWNING_THREAD_ERROR; - - return result; + _objc_fatal("Do not call objc_sync_notifyAll."); } - - - - - +#endif diff --git a/runtime/objc-typeencoding.m b/runtime/objc-typeencoding.m index d3b720e..fdd1bd6 100644 --- a/runtime/objc-typeencoding.m +++ b/runtime/objc-typeencoding.m @@ -27,7 +27,6 @@ **********************************************************************/ #include "objc-private.h" -#include /*********************************************************************** * SubtypeUntil. @@ -209,7 +208,7 @@ encoding_getArgumentInfo(const char *typedesc, int arg, const char **type, int *offset) { unsigned nargs = 0; - unsigned self_offset = 0; + int self_offset = 0; BOOL offset_is_negative = NO; // First, skip the return type @@ -264,7 +263,7 @@ encoding_getArgumentInfo(const char *typedesc, int arg, if (*typedesc) { - unsigned arg_offset = 0; + int arg_offset = 0; *type = typedesc; typedesc = SkipFirstType (typedesc); diff --git a/runtime/objc.h b/runtime/objc.h index aa2f962..b48f5e3 100644 --- a/runtime/objc.h +++ b/runtime/objc.h @@ -28,8 +28,8 @@ #ifndef _OBJC_OBJC_H_ #define _OBJC_OBJC_H_ -#import // for OBJC_EXPORT -#import +#include // for __DARWIN_NULL +#include typedef struct objc_class *Class; diff --git a/runtime/objcrt.c b/runtime/objcrt.c new file mode 100644 index 0000000..af28301 --- /dev/null +++ b/runtime/objcrt.c @@ -0,0 +1,97 @@ +#define WIN32_LEAN_AND_MEAN +#include +#include +#include +#include "objcrt.h" + +// Boundary symbols for metadata sections + +#pragma section(".objc_module_info$A",long,read,write) +#pragma data_seg(".objc_module_info$A") +static uintptr_t __objc_modStart = 0; +#pragma section(".objc_module_info$C",long,read,write) +#pragma data_seg(".objc_module_info$C") +static uintptr_t __objc_modEnd = 0; + +#pragma section(".objc_protocol$A",long,read,write) +#pragma data_seg(".objc_protocol$A") +static uintptr_t __objc_protoStart = 0; +#pragma section(".objc_protocol$C",long,read,write) +#pragma data_seg(".objc_protocol$C") +static uintptr_t __objc_protoEnd = 0; + +#pragma section(".objc_image_info$A",long,read,write) +#pragma data_seg(".objc_image_info$A") +static uintptr_t __objc_iiStart = 0; +#pragma section(".objc_image_info$C",long,read,write) +#pragma data_seg(".objc_image_info$C") +static uintptr_t __objc_iiEnd = 0; + +#pragma section(".objc_message_refs$A",long,read,write) +#pragma data_seg(".objc_message_refs$A") +static uintptr_t __objc_selrefsStart = 0; +#pragma section(".objc_message_refs$C",long,read,write) +#pragma data_seg(".objc_message_refs$C") +static uintptr_t __objc_selrefsEnd = 0; + +#pragma section(".objc_class_refs$A",long,read,write) +#pragma data_seg(".objc_class_refs$A") +static uintptr_t __objc_clsrefsStart = 0; +#pragma section(".objc_class_refs$C",long,read,write) +#pragma data_seg(".objc_class_refs$C") +static uintptr_t __objc_clsrefsEnd = 0; + +#pragma data_seg() + +// Merge all metadata into .data +// fixme order these by usage? +#pragma comment(linker, "/MERGE:.objc_module_info=.data") +#pragma comment(linker, "/MERGE:.objc_protocol=.data") +#pragma comment(linker, "/MERGE:.objc_image_info=.data") +#pragma comment(linker, "/MERGE:.objc_message_refs=.data") +#pragma comment(linker, "/MERGE:.objc_class_refs=.data") + + +// Image initializers + +static void *__hinfo = NULL; // cookie from runtime +extern IMAGE_DOS_HEADER __ImageBase; // this image's header + +static int __objc_init(void) +{ + objc_sections sections = { + 5, + &__objc_modStart, &__objc_modEnd, + &__objc_protoStart, &__objc_protoEnd, + &__objc_iiStart, &__objc_iiEnd, + &__objc_selrefsStart, &__objc_selrefsEnd, + &__objc_clsrefsStart, &__objc_clsrefsEnd, + }; + __hinfo = _objc_init_image((HMODULE)&__ImageBase, §ions); + return 0; +} + +static void __objc_unload(void) +{ + _objc_unload_image((HMODULE)&__ImageBase, __hinfo); +} + +static int __objc_load(void) +{ + _objc_load_image((HMODULE)&__ImageBase, __hinfo); + return 0; +} + +// run _objc_init_image ASAP +#pragma section(".CRT$XIAA",long,read,write) +#pragma data_seg(".CRT$XIAA") +static void *__objc_init_fn = &__objc_init; + +// run _objc_load_image (+load methods) after init_seg(compiler) but before init_seg(library) or init_seg(user) +#pragma section(".CRT$XCI",long,read,write) +#pragma data_seg(".CRT$XCI") +static void *__objc_load_fn = &__objc_load; + +// _objc_unload_image is called by atexit(), not by an image terminator + +#pragma data_seg() diff --git a/runtime/objcrt.h b/runtime/objcrt.h new file mode 100644 index 0000000..b399545 --- /dev/null +++ b/runtime/objcrt.h @@ -0,0 +1,20 @@ +#include + + +typedef struct { + int count; // number of pointer pairs that follow + void *modStart; + void *modEnd; + void *protoStart; + void *protoEnd; + void *iiStart; + void *iiEnd; + void *selrefsStart; + void *selrefsEnd; + void *clsrefsStart; + void *clsrefsEnd; +} objc_sections; + +OBJC_EXPORT void *_objc_init_image(HMODULE image, const objc_sections *sects); +OBJC_EXPORT void _objc_load_image(HMODULE image, void *hinfo); +OBJC_EXPORT void _objc_unload_image(HMODULE image, void *hinfo); diff --git a/runtime/phash.h b/runtime/phash.h deleted file mode 100644 index 0b538a9..0000000 --- a/runtime/phash.h +++ /dev/null @@ -1,17 +0,0 @@ -/* Perfect hash definitions */ -#ifndef STANDARD -#include "standard.h" -#endif /* STANDARD */ -#ifndef PHASH -#define PHASH - -extern const ub1 tab[]; -#define PHASHLEN 0x2000 /* length of hash mapping table */ -#define PHASHNKEYS 29798 /* How many keys were hashed */ -#define PHASHRANGE 32768 /* Range any input might map to */ -#define PHASHSALT 0x5384540f /* internal, initialize normal hash */ - -ub4 phash(); - -#endif /* PHASH */ - diff --git a/runtime/phash.m b/runtime/phash.m deleted file mode 100644 index c958679..0000000 --- a/runtime/phash.m +++ /dev/null @@ -1,573 +0,0 @@ -/* table for the mapping for the perfect hash */ -#ifndef STANDARD -#include "standard.h" -#endif /* STANDARD */ -#ifndef PHASH -#include "phash.h" -#endif /* PHASH */ -#ifndef LOOKUPA -#include "lookupa.h" -#endif /* LOOKUPA */ - -/* A way to make the 1-byte values in tab bigger */ -__private_extern__ const ub2 scramble[] = { -0x0000, 0x6b0f, 0x4c7d, 0x01b0, 0x1c38, 0x6c2c, 0x3596, 0x43b7, -0x754c, 0x0ad4, 0x18a7, 0x5131, 0x0a50, 0x291c, 0x6366, 0x7e81, -0x32bf, 0x19b3, 0x033b, 0x6346, 0x0df6, 0x58bd, 0x6c8d, 0x5de5, -0x26d1, 0x74a5, 0x35f8, 0x1bd7, 0x42e4, 0x0196, 0x4d64, 0x6e42, -0x1809, 0x007f, 0x2f2d, 0x0615, 0x73ac, 0x4dcd, 0x4cd9, 0x5767, -0x551b, 0x6aa5, 0x3587, 0x42c5, 0x329b, 0x3373, 0x5a4d, 0x5e6b, -0x0250, 0x40bf, 0x61fb, 0x5577, 0x344a, 0x54cc, 0x0533, 0x7055, -0x0be0, 0x65e9, 0x1963, 0x2549, 0x51a2, 0x77e2, 0x0498, 0x03f4, -0x2a77, 0x4d08, 0x2c45, 0x2978, 0x27a3, 0x73b0, 0x0ec5, 0x02e9, -0x4df7, 0x0858, 0x3124, 0x38dc, 0x3556, 0x34c5, 0x3fc5, 0x5b57, -0x1c13, 0x50d8, 0x3162, 0x5797, 0x16da, 0x5492, 0x7515, 0x3c25, -0x7d74, 0x2bbb, 0x490e, 0x068f, 0x751b, 0x4ccb, 0x7e7e, 0x6857, -0x6cdd, 0x2093, 0x726b, 0x0150, 0x472b, 0x5e5b, 0x5b20, 0x1b01, -0x5c2e, 0x63f5, 0x3cd6, 0x0ed0, 0x6a41, 0x16fe, 0x0069, 0x13fa, -0x1dcb, 0x44f0, 0x6f3a, 0x0cec, 0x0c4d, 0x7b40, 0x24f7, 0x5dff, -0x7929, 0x762f, 0x73bf, 0x396a, 0x155c, 0x2614, 0x7165, 0x5906, -0x7bcb, 0x51ba, 0x60e0, 0x2f88, 0x328d, 0x042b, 0x1175, 0x634b, -0x4cd1, 0x0893, 0x5e07, 0x708c, 0x5bb2, 0x00a5, 0x5ee3, 0x6f47, -0x34b9, 0x12a4, 0x0558, 0x0e61, 0x6744, 0x2f9f, 0x6b85, 0x36f9, -0x1a1e, 0x562d, 0x742e, 0x1655, 0x686d, 0x0bb6, 0x16fb, 0x2b8f, -0x5b7a, 0x0699, 0x5f40, 0x0130, 0x46d8, 0x0e8b, 0x7383, 0x0186, -0x7dc9, 0x05c4, 0x18f9, 0x6e8d, 0x7537, 0x05dc, 0x2076, 0x2b1e, -0x1a74, 0x6fcb, 0x6163, 0x645c, 0x14b9, 0x5995, 0x1387, 0x5bff, -0x1ad6, 0x3538, 0x6ad1, 0x3f04, 0x2ad8, 0x073c, 0x44d4, 0x3cee, -0x4d79, 0x0f50, 0x64a2, 0x52d7, 0x6930, 0x75a6, 0x24da, 0x58fe, -0x01ed, 0x7d35, 0x7afa, 0x662e, 0x3a3d, 0x4156, 0x1ba2, 0x6b0c, -0x0ca0, 0x4269, 0x2d22, 0x0a6e, 0x683e, 0x68aa, 0x5cb2, 0x18c3, -0x72c6, 0x6d37, 0x134d, 0x4801, 0x6a3a, 0x4904, 0x1cdd, 0x4565, -0x2e0f, 0x7534, 0x6c44, 0x537e, 0x6b70, 0x38eb, 0x16c4, 0x2e9c, -0x759d, 0x48ae, 0x6244, 0x12b2, 0x357d, 0x7a73, 0x6bd7, 0x604e, -0x6ca1, 0x3677, 0x7157, 0x3e55, 0x7d6e, 0x53d6, 0x36b3, 0x523b, -0x2991, 0x597e, 0x49c6, 0x5d92, 0x5076, 0x5857, 0x3c8c, 0x3e59, -}; - -/* small adjustments to _a_ to make values distinct */ -__private_extern__ const ub1 tab[] = { -4,2,0,52,1,7,1,15,7,15,0,9,1,44,0,39, -34,4,1,3,13,8,37,3,5,2,56,0,0,1,6,3, -31,7,105,4,3,8,6,10,2,11,1,19,10,39,24,5, -7,11,7,38,0,4,3,0,0,38,12,2,7,12,19,0, -36,78,5,67,9,4,15,0,0,57,1,1,2,6,7,0, -6,0,1,2,8,5,3,17,3,23,8,35,0,0,29,13, -50,0,23,4,0,28,5,20,36,2,12,10,23,55,9,2, -2,3,1,1,27,63,12,4,6,9,18,5,9,9,35,0, -16,71,0,0,2,1,0,6,4,6,0,20,4,1,6,14, -1,18,14,0,16,88,1,5,14,3,0,0,4,49,65,7, -0,6,0,1,1,1,11,234,5,17,5,0,0,5,0,9, -0,15,7,21,5,4,11,8,1,2,2,17,0,5,32,6, -1,0,5,29,5,18,7,0,19,97,0,1,6,3,50,0, -0,0,6,0,0,2,4,0,8,10,1,5,3,1,18,2, -3,0,0,14,1,2,4,29,0,0,0,6,16,34,2,10, -8,11,11,1,17,43,12,12,7,22,1,0,25,205,1,4, -20,31,6,70,0,0,16,9,0,13,1,11,1,4,57,5, -12,0,2,0,1,2,4,2,0,7,20,89,3,0,0,0, -2,37,1,33,6,14,11,6,2,2,2,11,4,24,5,0, -30,10,6,6,1,49,0,6,4,5,14,2,10,17,12,0, -0,2,13,66,76,11,0,17,1,3,26,0,0,5,19,5, -0,129,1,1,36,6,5,0,7,0,9,44,0,0,72,30, -0,9,0,1,18,4,27,63,1,1,10,15,10,35,0,25, -9,21,1,6,28,0,12,15,4,50,0,12,3,25,3,12, -35,77,6,22,14,6,0,0,31,0,2,0,0,61,9,0, -0,0,13,8,6,6,41,14,18,1,8,8,20,3,0,6, -11,2,141,31,1,6,17,10,16,3,30,20,2,14,3,4, -16,15,18,6,72,5,1,12,41,16,11,0,33,6,8,26, -3,6,2,26,8,27,0,4,2,37,0,98,3,14,1,5, -0,20,2,2,3,1,65,1,0,5,6,0,0,4,3,26, -5,45,4,1,0,3,0,6,0,4,4,3,10,26,5,68, -11,7,0,3,17,44,1,37,4,15,9,1,4,9,40,0, -0,1,0,43,3,1,3,20,1,3,2,6,8,13,34,0, -16,2,13,25,7,1,5,16,0,9,6,26,1,46,76,2, -15,19,0,3,3,1,6,40,2,0,6,1,62,18,14,2, -9,19,6,8,5,0,60,41,22,216,16,46,26,6,1,46, -30,0,0,24,3,0,2,3,21,23,48,27,5,0,1,17, -6,8,3,0,5,0,6,12,0,0,0,3,2,2,0,13, -5,3,2,23,18,33,1,27,1,0,0,18,39,26,0,19, -13,0,2,0,23,6,68,0,16,1,0,1,36,16,15,28, -1,10,0,10,4,6,5,4,0,26,0,5,6,14,5,2, -1,4,0,14,12,46,5,0,8,64,51,36,36,33,1,0, -29,8,0,4,4,0,0,11,13,50,1,22,2,4,1,24, -1,4,0,20,43,76,0,0,16,36,50,14,1,2,0,13, -3,0,1,27,1,87,11,0,6,26,8,2,6,2,4,33, -0,0,4,4,72,3,0,6,0,42,11,1,8,4,0,0, -0,11,0,28,2,15,2,2,33,13,1,5,3,3,19,2, -0,12,46,0,6,9,0,0,3,1,4,226,1,17,6,8, -1,1,37,4,5,2,12,38,12,0,9,4,1,20,1,0, -22,18,0,11,3,6,16,37,3,5,18,4,0,44,5,6, -32,3,1,57,3,7,2,3,4,29,10,2,17,6,0,1, -25,44,1,2,7,29,83,9,15,6,1,10,0,8,1,5, -32,4,0,4,68,0,3,0,7,11,3,0,0,1,2,9, -4,6,4,53,20,6,0,5,2,3,0,24,9,2,0,0, -22,13,8,8,16,16,15,22,0,51,80,6,0,3,12,0, -1,3,14,1,4,2,0,6,2,4,28,3,1,16,26,20, -3,76,3,3,109,12,53,40,8,19,1,35,4,3,14,21, -5,103,2,8,5,0,3,7,4,8,20,1,31,69,0,0, -39,68,3,9,15,12,4,7,16,12,23,1,13,9,7,1, -29,80,10,8,3,0,24,0,15,29,8,0,4,30,30,0, -38,3,0,9,12,2,2,0,7,11,18,5,3,25,3,0, -2,1,0,9,3,0,35,0,17,1,15,4,0,0,52,24, -0,2,0,63,7,46,3,1,7,9,29,3,1,2,7,16, -0,9,6,101,6,1,21,18,0,6,21,9,11,0,4,0, -3,0,19,1,0,0,38,3,4,66,0,9,2,32,5,4, -11,3,9,8,24,23,1,2,3,2,2,6,3,4,1,4, -26,0,0,0,12,0,2,8,0,1,49,25,0,0,0,0, -10,5,0,0,44,54,11,5,53,8,26,0,54,1,8,14, -68,6,7,13,2,7,0,9,2,38,0,31,1,2,0,2, -48,38,5,0,11,16,0,13,0,61,0,8,12,0,1,11, -2,20,1,3,42,3,0,3,9,0,2,1,4,14,32,0, -3,0,5,25,7,26,2,117,15,18,2,6,33,9,3,0, -29,5,9,9,12,5,4,8,3,4,0,0,41,4,1,2, -38,2,5,15,12,1,2,0,0,2,15,2,3,39,11,3, -89,22,0,36,24,4,50,5,8,5,20,3,50,14,0,0, -0,17,11,41,16,5,3,48,7,27,47,1,2,1,3,1, -4,0,18,2,2,8,0,0,7,60,2,62,21,0,1,8, -55,55,23,2,13,3,3,29,10,4,19,16,4,5,0,3, -35,15,1,4,3,3,0,8,0,15,4,0,4,69,16,3, -10,1,18,4,18,9,6,48,2,2,31,15,80,21,47,1, -0,2,59,15,3,14,2,30,7,1,3,5,0,24,1,0, -5,23,14,0,30,4,0,1,0,1,18,5,8,19,13,78, -3,5,0,26,34,5,5,12,0,1,7,5,10,2,1,14, -7,0,10,2,10,0,2,0,7,1,1,46,4,3,23,0, -21,4,59,0,0,27,56,11,9,27,1,3,0,13,3,11, -10,13,4,1,7,8,6,1,78,0,31,10,3,9,40,80, -69,14,3,77,21,0,0,3,1,2,0,3,2,5,7,5, -21,50,96,3,3,0,20,9,0,6,1,1,2,4,0,14, -0,0,0,5,0,32,12,45,6,32,3,20,12,0,0,28, -24,3,1,4,0,41,2,0,12,2,4,10,4,10,11,0, -30,11,44,10,68,20,2,121,0,5,1,10,21,14,22,35, -2,6,2,1,45,10,12,4,1,26,3,9,8,10,1,0, -26,23,11,1,19,39,0,0,0,84,13,4,7,38,30,9, -8,12,5,12,18,10,60,2,8,41,1,1,174,10,1,63, -0,37,0,50,73,13,0,4,2,0,6,1,42,55,13,4, -1,1,3,0,4,4,21,3,2,24,30,12,40,0,11,8, -4,6,45,2,6,1,15,18,31,8,0,57,1,73,34,19, -14,27,3,20,19,0,9,15,8,3,5,3,1,0,7,38, -10,20,40,62,25,12,1,1,0,5,4,4,22,1,18,6, -74,3,2,72,6,8,6,25,2,14,13,2,94,63,39,50, -0,26,41,0,55,2,22,89,8,1,0,3,7,1,1,0, -7,2,19,2,17,3,7,5,2,34,1,20,2,7,3,17, -2,7,24,2,54,3,1,0,7,0,0,0,4,3,7,2, -10,1,0,22,6,0,7,1,14,53,84,11,7,19,1,6, -31,3,10,20,121,1,1,1,5,6,0,21,2,0,10,0, -35,23,72,8,64,5,1,46,8,29,4,13,0,33,75,7, -2,48,55,17,0,23,84,0,1,5,0,2,3,15,11,5, -41,16,21,0,5,1,14,12,16,8,34,36,13,1,0,0, -8,19,0,0,14,6,14,0,7,10,2,23,0,31,4,0, -55,6,15,13,13,3,7,1,0,3,1,16,0,16,4,0, -41,0,5,1,0,1,0,1,4,16,2,1,0,0,3,7, -29,14,10,31,5,1,7,13,0,0,20,0,5,122,1,4, -20,1,25,14,0,0,7,45,6,0,8,3,24,0,0,3, -50,80,74,3,4,41,57,38,25,4,0,0,3,0,3,0, -2,8,31,72,11,9,7,15,12,0,0,5,2,15,2,3, -25,4,1,0,16,40,4,76,80,0,0,79,28,19,10,14, -0,2,106,8,27,1,3,21,2,49,27,0,2,27,0,21, -39,81,30,31,2,20,13,11,0,1,3,8,195,39,18,82, -7,47,0,5,88,1,126,1,1,0,0,6,4,77,6,1, -61,33,0,19,7,2,3,70,35,18,17,23,5,0,5,15, -0,11,0,19,22,0,45,0,0,45,13,5,2,55,11,8, -41,3,15,9,11,51,26,3,2,0,3,2,3,15,12,11, -2,4,79,1,6,26,151,1,5,11,4,6,1,15,7,3, -2,3,0,1,29,5,9,20,0,45,0,2,23,0,0,102, -14,19,0,1,6,14,14,1,1,0,18,0,8,36,0,0, -103,0,54,10,13,19,19,9,30,7,0,0,6,18,32,0, -40,4,5,24,0,10,5,10,54,6,13,0,11,21,28,7, -25,34,0,0,1,6,2,0,6,27,22,10,23,15,29,0, -16,0,2,48,18,95,16,3,1,22,21,12,6,12,0,50, -8,2,3,18,16,0,60,1,2,6,28,9,3,1,3,31, -77,42,8,24,36,13,21,7,10,27,18,1,14,9,29,22, -107,13,0,0,50,23,19,10,1,0,13,63,1,0,0,14, -13,7,0,19,0,27,14,1,3,4,5,1,7,9,35,10, -2,26,50,22,19,6,53,1,1,4,3,34,4,97,18,12, -30,1,4,29,14,22,27,0,0,3,6,0,33,1,20,3, -21,14,59,2,3,25,0,0,2,70,16,8,10,8,0,1, -0,4,9,16,4,20,3,5,1,61,10,22,86,7,0,0, -3,35,56,147,6,0,4,52,0,28,4,32,1,9,22,33, -3,33,0,29,0,3,11,0,7,2,2,20,2,3,57,49, -3,11,14,16,13,4,19,6,0,32,33,0,0,8,8,19, -6,9,69,45,15,4,2,3,74,11,8,3,3,28,27,9, -6,43,51,22,1,7,1,4,0,9,24,32,1,0,7,23, -22,53,25,0,57,0,56,0,10,1,65,0,0,6,53,21, -0,6,1,0,20,7,132,7,31,0,10,19,41,41,6,3, -1,7,22,2,0,12,10,19,65,0,5,40,7,5,171,9, -5,1,10,12,36,5,15,7,18,41,10,1,19,8,2,0, -62,23,1,11,7,4,54,3,7,11,179,56,0,21,18,2, -0,4,4,43,0,2,5,30,1,2,20,81,66,16,7,4, -6,10,3,0,26,0,20,0,7,11,0,18,5,0,2,9, -0,52,0,47,0,10,20,31,49,57,0,9,6,17,37,65, -13,1,26,2,100,1,7,1,16,33,29,5,8,51,15,0, -24,0,13,2,17,5,10,29,0,21,1,0,0,6,33,0, -2,20,0,0,3,0,10,12,0,3,16,9,14,2,0,0, -32,4,1,12,24,0,5,28,8,41,16,11,2,23,0,91, -0,18,5,15,16,0,3,88,3,11,0,2,38,0,15,55, -11,0,12,2,12,25,29,0,4,4,22,51,15,53,18,0, -0,2,10,29,0,37,5,14,3,0,7,13,0,34,71,7, -1,47,13,10,14,10,6,0,13,0,3,2,2,7,7,0, -8,22,39,0,35,29,17,15,54,18,33,2,14,24,102,4, -0,1,0,37,33,2,3,0,3,8,6,22,20,30,0,8, -12,2,27,7,4,1,2,17,2,1,79,19,1,5,36,26, -77,96,18,51,8,15,0,64,16,15,1,4,0,3,8,2, -6,4,12,1,5,33,1,5,0,13,2,83,71,41,1,7, -2,17,2,184,0,26,5,25,102,4,0,3,17,10,17,0, -5,1,16,47,4,2,105,0,4,5,3,12,14,0,4,37, -0,0,1,20,8,26,1,3,20,75,4,0,18,0,0,11, -2,0,0,0,1,0,50,4,31,3,0,0,32,1,0,22, -5,22,3,23,38,2,0,0,0,0,68,14,4,0,32,21, -7,91,8,7,0,40,13,8,19,14,1,47,6,62,3,36, -23,7,16,8,2,26,49,14,18,13,0,2,9,24,92,14, -37,18,28,30,1,1,0,36,2,7,3,15,11,55,0,6, -2,32,2,28,7,3,10,4,9,0,0,12,16,19,51,21, -1,1,7,10,8,3,11,2,8,21,2,3,33,23,10,97, -13,57,19,0,6,0,13,3,0,15,0,14,58,15,17,2, -5,2,0,38,11,0,0,15,5,0,2,21,6,0,3,0, -29,5,1,4,37,3,87,26,38,2,0,6,3,11,0,9, -0,10,6,6,4,20,7,27,18,23,25,9,19,6,5,5, -9,4,7,19,6,9,11,0,0,8,52,42,13,15,0,45, -2,105,13,7,18,17,46,0,1,7,14,10,44,23,17,28, -0,4,19,5,3,11,32,0,136,0,28,10,2,29,4,2, -41,4,9,19,0,11,3,3,0,40,13,4,0,3,3,49, -74,54,12,4,0,39,3,53,0,5,10,43,5,8,120,4, -4,13,2,5,83,13,28,2,25,5,6,66,3,1,4,52, -2,21,1,0,24,17,37,22,0,8,11,0,15,3,21,9, -0,29,5,69,22,87,4,12,3,27,5,30,3,7,3,25, -4,45,8,61,29,43,28,5,3,12,5,0,28,0,84,19, -0,100,28,53,8,56,8,4,2,62,0,30,16,8,5,8, -9,50,8,27,7,0,0,0,0,80,0,13,7,94,34,0, -42,6,79,0,0,11,11,25,2,3,10,2,23,30,1,12, -10,10,7,110,0,1,0,1,7,8,0,0,10,4,36,37, -1,32,9,34,2,26,5,11,32,7,0,8,4,0,37,1, -24,8,17,54,25,11,3,0,4,18,1,12,2,35,14,1, -11,28,3,5,0,13,32,5,0,14,2,11,7,5,51,4, -7,10,5,0,17,38,4,0,0,59,3,12,8,17,0,29, -24,148,0,34,39,15,48,25,29,16,33,0,22,4,8,38, -1,14,8,181,7,14,24,12,7,5,9,25,23,12,0,3, -0,9,0,2,2,25,0,37,52,61,5,6,44,15,4,4, -5,4,0,43,22,0,2,5,8,9,7,3,7,21,39,0, -109,4,22,88,17,29,92,70,5,25,10,38,28,21,52,14, -14,5,0,1,0,1,7,28,11,11,45,176,19,9,6,15, -65,1,65,5,97,109,1,19,0,1,52,157,4,39,16,0, -29,6,2,3,6,7,14,0,41,119,20,25,3,1,5,0, -41,36,6,47,0,81,5,3,42,79,7,6,0,7,16,3, -8,49,3,3,52,7,1,59,102,0,125,0,33,0,6,58, -20,22,12,30,99,19,63,2,2,42,3,26,0,4,3,36, -0,1,57,37,22,0,87,9,58,9,7,5,16,0,4,2, -61,4,4,3,9,0,3,21,2,93,88,0,0,2,1,7, -10,5,14,16,42,5,2,8,9,5,11,5,5,0,0,86, -0,0,14,0,2,3,44,70,2,60,80,1,32,61,13,5, -11,128,25,12,32,44,31,6,0,3,5,0,17,3,121,15, -45,20,2,4,62,27,18,4,8,58,98,14,0,28,60,43, -46,27,20,69,119,24,4,5,4,111,12,140,8,10,29,11, -0,50,23,18,53,1,13,0,1,0,1,2,30,10,17,3, -74,0,57,28,1,17,41,20,0,10,4,0,0,7,0,0, -25,86,18,12,80,62,27,0,72,4,74,0,2,5,42,0, -7,0,11,2,42,32,0,1,6,31,19,0,0,2,7,1, -6,16,17,29,15,4,53,0,12,30,12,14,7,4,59,16, -0,49,54,0,43,11,19,9,127,3,5,0,134,7,19,3, -3,0,0,25,5,6,3,38,10,2,97,0,11,4,1,24, -6,23,93,29,3,36,9,0,0,4,1,12,0,0,18,18, -0,1,89,3,2,3,2,37,0,5,28,5,1,21,9,22, -5,155,4,36,39,12,10,12,16,16,182,13,4,4,40,9, -3,0,28,44,5,2,58,15,13,7,26,12,48,0,30,8, -2,39,11,30,11,5,15,22,30,0,15,0,85,4,130,0, -14,25,15,3,3,10,2,2,17,0,19,0,4,0,156,51, -0,19,9,140,102,4,50,11,5,3,4,2,24,24,10,5, -33,4,0,29,0,37,6,5,22,0,25,31,102,22,11,6, -38,17,36,8,2,1,99,8,56,71,68,23,3,12,3,0, -0,0,22,123,83,5,28,25,3,20,0,8,16,4,1,18, -0,1,2,0,9,39,25,61,198,13,58,3,11,1,3,11, -7,5,6,7,19,102,1,14,16,24,68,35,13,6,7,97, -65,9,17,8,0,29,0,11,14,29,0,2,2,27,55,28, -9,15,8,1,10,15,4,3,17,1,0,6,67,0,14,4, -90,0,8,88,26,6,55,32,8,4,1,17,3,9,5,3, -17,211,59,13,20,60,37,0,0,5,10,39,44,6,12,47, -32,14,1,105,1,3,13,27,8,3,10,98,152,3,4,9, -45,17,9,4,3,18,65,0,82,73,1,10,4,8,9,0, -3,1,20,14,0,93,9,3,0,15,2,13,0,33,11,13, -2,30,39,47,8,1,32,100,39,17,3,10,61,19,0,2, -7,0,101,5,3,2,0,4,0,6,8,52,9,2,2,38, -17,0,0,97,108,32,0,1,28,38,18,10,18,10,26,178, -29,173,16,0,9,15,84,69,17,21,7,21,20,28,77,16, -3,0,1,14,77,49,1,1,2,9,9,7,16,39,7,1, -2,4,10,16,6,0,1,12,19,0,0,60,74,32,9,6, -56,6,1,6,10,1,10,1,1,27,52,0,28,46,25,164, -3,3,0,5,1,11,3,29,11,15,16,27,7,28,0,4, -4,27,7,3,19,2,2,2,3,1,51,11,14,5,20,125, -2,8,2,8,47,0,56,54,21,154,10,4,7,3,21,0, -65,1,6,35,1,16,12,45,32,60,7,3,16,109,1,0, -8,0,8,0,1,5,12,20,0,82,3,81,48,8,30,0, -8,3,1,12,0,45,3,22,2,1,4,0,85,2,11,7, -94,0,32,14,12,18,5,0,121,2,5,2,3,199,20,30, -51,42,23,8,35,13,1,15,0,6,2,5,17,9,1,49, -0,1,49,40,26,45,5,21,45,19,8,9,0,146,3,14, -1,4,2,52,6,10,0,0,0,16,0,0,12,6,2,3, -13,97,25,1,1,58,86,22,12,0,7,2,20,0,18,1, -3,1,22,6,45,3,72,77,44,4,1,6,2,24,2,1, -30,43,3,5,5,8,11,1,8,48,6,36,15,18,105,96, -59,12,2,2,5,1,12,1,19,0,70,0,17,0,24,1, -2,6,117,13,29,1,23,7,61,26,6,0,109,0,5,47, -13,92,61,22,0,30,4,9,2,4,172,41,0,3,50,5, -23,38,22,2,85,15,6,4,2,25,0,8,8,10,10,1, -26,0,1,21,18,86,21,15,9,46,84,4,43,29,24,16, -156,6,3,1,2,13,1,8,2,10,61,5,6,10,0,92, -12,25,48,27,13,51,30,54,57,0,10,11,7,51,2,119, -0,2,47,8,29,29,21,3,29,0,25,2,101,4,21,4, -30,14,14,36,2,6,1,1,0,29,0,31,0,12,4,26, -2,3,41,0,15,1,44,3,2,7,115,24,12,5,2,51, -7,1,4,2,7,104,29,21,6,5,14,5,0,42,0,37, -3,101,11,2,30,5,8,34,6,69,0,5,16,16,13,3, -34,0,1,55,2,46,10,18,32,3,2,3,0,5,7,1, -6,41,0,6,81,36,1,7,4,3,11,5,47,2,43,0, -0,1,9,4,14,34,16,12,27,2,107,0,4,60,154,14, -55,0,1,0,4,55,3,56,40,41,0,47,26,121,3,0, -67,33,5,2,1,44,91,29,5,69,5,4,61,2,10,3, -6,2,2,13,9,24,0,15,1,4,0,36,61,3,19,35, -34,4,0,1,91,0,80,6,3,0,7,3,6,4,16,1, -27,83,1,0,4,22,12,0,0,0,4,4,15,5,73,0, -6,8,5,1,3,25,71,97,37,9,13,110,13,70,10,8, -4,34,3,1,3,55,23,140,0,3,0,3,1,0,10,5, -17,3,42,15,9,0,27,8,59,13,11,15,75,13,2,25, -19,26,46,0,23,4,1,0,109,9,2,21,19,37,1,0, -58,28,75,12,32,15,0,97,0,1,17,3,1,28,12,7, -39,28,34,25,33,22,3,44,32,13,7,0,15,2,178,4, -6,13,0,44,1,0,22,0,0,52,15,3,94,12,12,34, -34,24,105,7,0,1,5,11,88,48,65,21,46,105,5,28, -0,34,22,36,2,82,0,7,117,1,29,27,17,24,2,0, -153,33,16,9,2,0,11,5,5,3,76,33,20,2,12,16, -2,30,109,6,6,11,84,49,5,2,23,0,18,174,18,22, -80,3,44,9,26,6,124,38,50,68,17,9,23,50,5,114, -1,0,0,0,19,14,41,26,13,2,2,1,44,2,9,76, -10,13,36,1,5,0,1,34,20,5,5,5,2,34,1,76, -7,48,3,4,6,1,197,0,33,12,0,1,10,61,92,13, -4,1,24,25,4,10,3,4,4,26,1,9,7,24,5,24, -1,46,7,10,65,16,31,1,6,66,6,9,9,14,0,28, -62,7,33,2,18,25,3,0,7,14,52,110,18,116,7,145, -4,15,17,69,1,5,0,22,131,6,57,20,39,3,5,0, -2,58,8,114,1,8,16,19,2,7,3,12,1,28,9,33, -5,29,1,30,8,2,19,21,78,103,17,2,99,71,36,16, -9,18,16,62,0,16,9,7,68,1,22,0,2,12,24,0, -19,15,110,0,20,12,16,110,60,4,147,1,5,56,17,7, -0,3,19,15,7,0,0,41,0,0,6,5,21,26,16,0, -5,11,44,38,0,1,6,40,23,93,4,63,2,9,56,5, -6,32,9,6,7,23,8,9,9,73,0,5,37,27,120,1, -57,41,176,0,1,6,57,36,9,93,89,0,1,5,6,78, -124,34,12,0,5,7,8,15,1,46,0,15,18,103,0,41, -5,24,4,29,4,55,1,155,8,38,53,17,2,52,0,236, -2,7,13,17,13,0,28,6,40,33,200,3,22,13,5,0, -0,15,13,1,71,82,1,111,24,34,28,0,25,15,6,33, -0,16,29,141,1,2,6,0,1,99,6,3,1,38,0,37, -0,31,66,42,0,0,47,0,3,1,115,26,8,22,19,2, -2,13,27,11,35,14,31,7,18,15,6,12,0,38,5,18, -195,15,12,0,7,42,26,10,38,30,33,13,63,48,10,8, -3,4,9,3,2,40,17,0,7,4,38,7,7,46,9,37, -41,2,4,5,6,0,5,5,17,2,78,7,4,36,36,0, -42,23,5,12,21,0,8,229,34,52,29,0,11,0,1,6, -23,165,11,9,0,20,6,3,24,14,15,21,48,95,24,39, -20,48,7,64,61,83,8,7,4,23,44,82,15,9,12,4, -7,16,7,15,0,2,7,49,10,18,2,24,58,0,79,166, -35,13,8,0,69,4,40,24,72,20,30,12,17,1,4,9, -9,75,7,21,8,86,7,0,0,138,0,54,13,44,151,42, -85,82,67,34,0,2,9,50,39,107,7,192,2,5,8,2, -52,1,10,7,6,69,12,34,15,0,11,6,45,11,8,29, -20,19,190,12,8,137,3,14,3,50,9,7,19,17,4,17, -26,34,0,7,7,21,1,4,85,185,5,62,2,0,62,63, -117,0,44,178,2,18,2,3,31,32,1,80,172,34,1,6, -1,4,12,1,42,5,40,5,8,2,4,47,4,0,0,38, -5,27,25,6,80,22,61,82,1,60,9,20,0,5,35,7, -1,0,6,9,3,0,41,21,21,0,24,20,45,0,1,0, -26,11,1,9,13,0,14,41,19,9,0,30,74,0,16,0, -16,47,5,2,97,38,5,0,46,18,2,6,10,51,0,2, -0,37,1,4,5,20,4,2,14,141,1,47,68,1,8,16, -4,27,7,38,8,0,20,0,5,45,53,1,1,4,15,1, -0,0,3,0,70,25,39,48,27,0,2,3,9,4,2,5, -3,0,10,10,8,2,6,89,4,1,87,3,99,41,33,34, -26,4,123,6,2,5,3,20,79,1,0,155,10,2,71,1, -15,9,20,33,6,2,18,0,88,0,2,3,38,21,5,36, -56,1,35,7,0,18,0,0,7,12,3,2,20,5,117,32, -11,6,33,17,49,112,9,67,147,24,31,14,2,0,184,56, -4,100,1,0,77,9,11,212,5,25,146,43,66,9,0,94, -1,5,16,16,14,11,66,7,85,1,4,5,47,11,84,0, -32,10,14,6,50,11,1,9,12,66,41,137,3,26,13,8, -28,31,7,9,59,5,13,2,116,8,19,18,4,21,6,14, -51,5,57,6,2,0,0,1,46,12,19,5,80,13,35,0, -18,156,38,33,18,1,146,11,0,10,12,1,3,1,63,6, -48,24,3,22,53,21,64,33,85,89,0,6,24,3,27,13, -9,1,32,35,30,15,1,2,47,13,4,63,33,0,1,0, -48,0,12,32,30,39,0,25,17,4,27,53,11,2,19,0, -3,7,45,43,4,16,37,37,62,59,5,1,0,83,7,37, -8,3,7,30,31,8,0,0,2,5,42,39,13,1,2,19, -15,11,0,18,20,4,1,0,0,45,5,3,0,4,1,11, -9,13,167,1,11,2,17,72,42,46,0,20,54,11,86,4, -21,5,2,4,3,0,142,4,7,81,0,55,19,61,19,158, -8,37,25,95,9,1,28,1,1,88,2,44,0,39,21,24, -31,4,37,17,121,107,2,7,11,2,13,52,127,2,12,51, -6,1,1,115,0,7,0,25,123,25,46,46,2,2,0,8, -0,18,12,34,1,3,19,1,11,33,82,15,99,0,9,77, -26,0,80,10,16,15,9,0,26,75,55,33,26,23,158,0, -37,74,50,61,10,0,17,81,4,6,19,2,23,16,2,30, -11,1,39,137,9,0,11,6,55,1,27,56,15,42,6,37, -9,35,17,68,20,0,1,2,31,93,24,38,64,1,4,11, -3,3,2,3,25,0,17,80,13,13,0,75,4,30,7,14, -2,0,0,5,85,34,6,26,25,46,38,3,0,6,7,128, -103,23,33,22,45,32,27,0,26,2,47,80,13,115,3,0, -2,0,70,181,1,227,0,31,4,19,234,3,0,76,7,9, -0,10,1,10,16,0,0,86,13,74,109,1,0,26,19,9, -1,46,0,89,1,143,57,37,7,0,43,127,55,89,13,5, -1,3,27,26,15,6,26,90,61,3,0,16,0,7,14,34, -22,0,19,2,111,80,44,52,2,10,127,6,44,15,24,11, -2,4,0,77,13,8,21,2,35,9,2,29,66,45,24,1, -0,7,10,2,2,2,16,46,174,14,101,3,1,6,88,0, -100,50,48,51,10,5,48,0,18,88,28,0,69,26,1,10, -10,20,10,1,2,36,13,142,91,3,21,186,0,12,11,3, -4,71,3,18,8,48,38,94,1,16,2,2,8,6,23,147, -0,157,2,52,3,156,0,68,34,0,2,20,83,29,42,4, -14,0,64,0,3,1,6,4,185,33,12,28,67,0,2,6, -45,10,0,2,20,86,40,10,61,9,5,48,3,18,0,1, -1,7,37,4,0,1,0,16,165,8,1,92,2,70,1,0, -74,7,2,12,75,31,0,3,3,27,0,1,40,0,10,4, -179,137,92,26,76,43,0,6,0,9,129,7,40,2,82,29, -8,31,146,3,44,90,3,12,1,73,10,6,35,95,16,10, -0,91,0,81,0,6,3,113,140,46,23,34,7,5,1,8, -3,31,20,139,64,9,2,50,50,16,0,0,11,5,37,31, -2,4,15,4,6,32,7,6,19,71,0,15,179,0,30,110, -8,2,0,33,7,29,35,1,0,37,3,3,102,1,1,37, -125,0,1,17,2,14,1,133,68,18,1,67,93,87,28,45, -23,9,20,58,16,31,59,4,17,71,0,18,2,1,58,81, -1,7,6,18,7,0,72,52,49,1,17,89,0,83,9,253, -92,1,2,66,5,100,8,73,3,3,0,22,24,34,19,24, -32,15,92,9,91,50,0,31,11,31,24,0,9,3,121,22, -22,24,44,124,14,35,73,5,0,66,72,8,14,42,28,8, -17,102,35,65,1,1,14,123,20,1,73,1,3,35,72,12, -15,2,7,138,1,62,79,20,3,26,0,3,5,1,185,3, -9,3,10,19,0,4,1,52,22,19,60,16,11,7,19,14, -29,101,16,80,159,1,0,65,1,6,112,108,4,11,171,33, -28,2,12,9,23,10,4,7,10,125,187,6,8,0,0,73, -42,6,77,91,5,64,113,3,0,12,31,6,50,27,23,131, -0,0,6,76,4,5,35,20,54,44,6,3,9,0,0,99, -0,20,38,106,88,16,4,0,8,12,4,18,234,1,113,0, -45,62,75,32,13,0,146,3,8,2,6,16,0,3,1,54, -99,97,3,18,35,7,18,101,1,31,16,210,22,150,9,27, -3,3,11,7,13,2,1,0,3,14,50,6,6,6,6,3, -0,13,0,0,8,1,36,11,12,187,15,7,17,3,18,63, -4,1,15,59,54,0,111,12,11,133,32,53,79,2,68,29, -0,0,86,0,41,3,24,4,12,35,206,11,18,2,0,7, -91,65,22,34,0,0,39,0,13,29,114,123,122,15,5,26, -0,0,42,68,7,15,1,0,3,0,0,8,45,17,1,89, -95,30,2,32,1,5,71,16,3,13,16,8,62,1,2,54, -42,14,150,39,8,39,18,64,88,0,106,98,71,13,19,13, -18,4,1,103,17,1,0,26,10,21,8,27,44,165,7,18, -0,0,85,0,211,19,0,11,0,13,0,1,0,85,16,6, -7,4,2,0,1,109,120,132,0,11,29,97,0,14,68,93, -3,11,2,16,117,22,3,145,10,18,50,33,37,10,1,19, -71,106,4,8,13,90,4,82,13,60,59,8,14,32,35,8, -4,61,0,70,14,9,21,6,200,7,75,36,20,48,1,18, -13,2,38,1,0,94,11,0,1,102,28,20,22,25,13,2, -44,69,219,56,4,5,4,8,52,49,29,37,9,36,43,56, -9,26,63,253,156,0,159,101,4,32,150,8,1,24,91,8, -13,0,62,0,0,0,209,99,36,31,24,71,119,71,0,16, -37,10,29,1,217,1,9,1,20,3,2,7,85,5,6,5, -4,4,85,49,126,2,100,7,5,229,10,58,99,54,14,33, -11,12,41,15,45,19,5,5,0,105,69,5,10,4,61,34, -0,8,3,182,9,0,61,41,0,9,0,5,13,38,46,0, -22,6,0,1,9,106,36,0,1,0,56,98,5,138,1,4, -70,0,5,17,34,25,42,14,58,0,0,0,7,14,0,19, -7,0,4,80,43,3,1,9,66,13,3,13,87,22,126,14, -1,217,9,2,91,2,54,58,3,0,34,29,1,6,31,24, -60,33,73,3,80,14,1,82,23,0,44,205,32,28,0,64, -50,154,16,18,69,0,8,2,2,37,53,70,6,7,19,25, -7,65,57,97,34,213,0,2,1,0,17,70,8,3,147,8, -2,35,7,122,0,81,32,0,0,13,28,253,171,50,51,110, -21,26,9,0,0,0,5,29,3,10,134,0,177,248,195,0, -3,75,8,85,0,12,66,110,0,37,12,0,157,46,4,3, -60,0,32,14,1,33,0,0,85,39,12,8,10,0,38,56, -3,7,27,35,2,15,42,49,11,26,0,113,6,9,0,23, -2,15,10,53,12,2,68,0,11,82,27,24,67,70,12,6, -127,21,3,0,0,0,54,2,27,66,1,137,0,2,9,54, -90,1,9,10,3,1,15,8,0,8,82,107,15,7,0,0, -0,3,131,2,6,24,34,70,41,12,8,62,138,5,39,114, -5,234,115,26,18,166,5,21,0,133,44,23,13,188,5,5, -0,17,1,7,13,13,2,17,30,84,26,46,155,26,0,37, -55,1,0,0,111,0,2,10,0,16,2,6,56,15,120,50, -187,0,16,1,131,72,0,29,21,179,34,15,3,2,11,20, -218,19,0,66,8,6,54,133,0,0,11,151,1,3,1,2, -9,12,41,64,5,241,7,73,10,20,11,6,58,2,28,237, -20,1,5,9,30,11,41,75,39,23,20,0,1,35,50,4, -4,13,44,23,4,5,63,9,22,14,3,0,99,7,0,31, -20,3,26,7,52,98,198,20,28,2,4,0,0,13,2,1, -2,16,9,10,6,0,21,12,174,3,81,24,171,9,42,0, -44,2,5,9,52,8,16,73,16,28,12,5,0,24,35,1, -48,172,6,0,43,121,79,31,43,51,1,10,58,63,29,6, -18,62,11,1,53,10,71,61,161,42,4,36,154,82,56,8, -5,2,32,35,100,13,10,159,8,104,10,0,7,12,11,77, -2,88,1,53,70,0,79,8,80,109,139,0,38,131,10,4, -7,2,23,61,1,0,18,51,9,5,18,172,5,110,4,10, -14,12,0,1,30,9,79,218,48,51,35,75,0,93,1,40, -79,72,124,6,0,0,11,19,43,1,5,94,1,26,191,3, -31,9,0,3,0,7,20,15,1,54,6,0,34,6,52,43, -27,5,147,1,0,30,162,50,14,35,0,39,2,37,139,25, -50,162,20,12,25,14,4,3,63,4,0,20,0,11,44,1, -1,20,5,4,0,68,49,0,145,6,36,0,29,3,42,115, -0,15,3,2,2,60,0,53,1,0,105,6,0,63,49,11, -7,5,10,56,1,11,8,5,4,9,92,1,31,197,51,2, -0,2,3,33,21,2,0,16,4,6,11,6,26,12,12,77, -16,5,24,10,114,3,10,70,4,19,17,0,3,0,4,81, -62,5,3,40,51,117,2,1,44,116,3,2,0,97,30,5, -4,0,13,1,3,12,21,20,102,1,54,1,5,126,15,12, -18,34,234,179,166,0,1,25,0,70,7,32,187,20,3,0, -57,9,65,1,78,10,82,31,0,3,96,2,15,13,19,0, -10,7,1,6,86,91,1,93,23,1,114,0,245,90,4,180, -14,39,16,3,68,1,5,74,1,7,136,20,5,14,4,31, -54,0,33,32,7,16,4,5,25,50,0,7,128,23,0,160, -29,46,112,0,5,19,104,41,70,6,7,237,0,9,18,13, -43,250,34,111,12,89,9,140,34,24,26,25,58,17,0,128, -20,36,83,44,34,250,0,61,0,0,110,13,107,177,14,0, -66,77,1,39,9,2,28,21,0,8,77,86,93,6,23,156, -34,15,11,18,7,37,4,14,96,10,23,0,95,80,3,61, -7,10,39,18,49,67,3,105,18,5,132,61,7,41,1,2, -38,40,3,92,4,0,90,9,0,87,34,22,2,5,130,248, -3,0,178,0,94,15,71,29,26,6,1,0,0,22,93,97, -86,63,6,13,20,10,1,52,5,93,3,57,40,2,0,1, -6,20,7,8,38,0,0,3,7,15,12,3,5,8,25,48, -14,89,76,77,72,0,71,20,20,3,0,0,42,42,11,18, -1,40,18,9,80,3,136,20,35,2,19,30,171,159,4,2, -94,18,0,1,33,91,44,5,0,10,0,3,37,9,115,15, -27,136,22,4,40,33,26,15,7,0,37,28,4,9,44,32, -17,35,5,1,25,21,10,1,20,31,0,5,11,1,26,183, -1,5,37,111,9,79,28,86,21,30,5,25,5,35,9,65, -6,0,97,45,2,117,8,44,7,11,225,5,70,99,157,0, -1,2,4,132,15,44,0,115,28,24,0,12,22,0,42,3, -25,89,40,244,33,82,26,156,49,58,52,0,47,2,117,24, -35,66,45,15,82,66,67,13,8,80,68,11,22,2,0,10, -1,47,30,1,203,68,19,76,157,34,110,33,21,135,6,51, -31,12,24,177,10,0,2,37,0,34,23,36,46,7,4,11, -5,5,17,21,226,7,33,7,22,149,52,0,78,59,5,52, -0,148,41,57,71,16,2,11,165,117,5,18,87,50,58,31, -2,1,12,49,2,0,1,42,2,94,0,7,72,94,4,130, -172,28,2,44,0,7,38,87,6,52,28,8,1,38,20,36, -0,13,184,40,0,59,147,0,20,80,7,165,16,1,18,36, -0,0,12,59,97,45,0,70,93,70,165,12,111,20,0,82, -36,0,202,23,35,49,149,4,1,1,128,15,1,49,100,11, -6,13,14,28,24,9,15,11,37,204,10,0,15,17,15,12, -39,0,17,16,80,97,84,4,16,70,58,121,75,148,67,5, -21,0,12,51,4,9,3,18,5,105,71,173,166,18,83,174, -5,11,208,19,123,0,29,0,4,0,88,23,109,61,66,97, -1,59,8,29,53,1,31,19,197,152,4,41,28,10,2,60, -112,2,5,58,9,193,45,80,10,57,9,36,104,131,1,212, -28,11,142,0,224,70,14,38,6,1,9,85,31,72,5,61, -8,77,9,8,7,38,0,21,0,63,53,0,8,4,9,3, -0,18,13,86,73,5,2,0,71,21,0,14,89,88,2,37, -41,19,25,1,69,28,18,132,2,4,3,29,0,82,26,8, -19,63,26,3,0,16,93,37,22,0,33,2,27,3,62,12, -}; - -/* The hash function */ -__private_extern__ ub4 phash(key, len) -char *key; -int len; -{ - ub4 rsl, val = lookup(key, len, 0x5384540f); - rsl = ((val>>17)^scramble[tab[val&0x1fff]]); - return rsl; -} - diff --git a/runtime/runtime.h b/runtime/runtime.h index fd98fc5..c6047bb 100644 --- a/runtime/runtime.h +++ b/runtime/runtime.h @@ -24,13 +24,16 @@ #ifndef _OBJC_RUNTIME_H #define _OBJC_RUNTIME_H -#import - -#import -#import -#import -#import -#import +#include +#include +#include +#include +#include +#include + +#if TARGET_OS_MAC +#include +#endif /* Types */ @@ -68,16 +71,6 @@ struct objc_method_description { SEL name; char *types; }; -struct objc_method_description_list { - int count; - struct objc_method_description list[1]; -}; - -struct objc_protocol_list { - struct objc_protocol_list *next; - long count; - Protocol *list[1]; -}; /* Functions */ @@ -123,7 +116,7 @@ OBJC_EXPORT BOOL class_isMetaClass(Class cls) OBJC_EXPORT Class class_getSuperclass(Class cls) AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER; OBJC_EXPORT Class class_setSuperclass(Class cls, Class newSuper) - AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER OBJC2_UNAVAILABLE; + AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER_BUT_DEPRECATED; OBJC_EXPORT int class_getVersion(Class cls); OBJC_EXPORT void class_setVersion(Class cls, int version); @@ -269,6 +262,27 @@ OBJC_EXPORT void objc_setEnumerationMutationHandler(void (*handler)(id)) OBJC_EXPORT void objc_setForwardHandler(void *fwd, void *fwd_stret) AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER; + +/* Associated Object support. */ + +/* objc_setAssociatedObject() options */ +enum { + OBJC_ASSOCIATION_ASSIGN = 0, + OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, + OBJC_ASSOCIATION_COPY_NONATOMIC = 3, + OBJC_ASSOCIATION_RETAIN = 01401, + OBJC_ASSOCIATION_COPY = 01403 +}; +typedef uintptr_t objc_AssociationPolicy; + +OBJC_EXPORT void objc_setAssociatedObject(id object, void *key, id value, objc_AssociationPolicy policy) + AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER; +OBJC_EXPORT id objc_getAssociatedObject(id object, void *key) + AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER; +OBJC_EXPORT void objc_removeAssociatedObjects(id object) + AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER; + + #define _C_ID '@' #define _C_CLASS '#' #define _C_SEL ':' @@ -345,6 +359,19 @@ OBJC_EXPORT void objc_setForwardHandler(void *fwd, void *fwd_stret) #define CLS_EXT 0x20000 +struct objc_method_description_list { + int count; + struct objc_method_description list[1]; +}; + + +struct objc_protocol_list { + struct objc_protocol_list *next; + long count; + Protocol *list[1]; +}; + + struct objc_category { char *category_name OBJC2_UNAVAILABLE; char *class_name OBJC2_UNAVAILABLE; @@ -439,7 +466,7 @@ struct objc_method_list; OBJC_EXPORT BOOL sel_isMapped(SEL sel) OBJC2_UNAVAILABLE; -OBJC_EXPORT id object_copyFromZone(id anObject, size_t nBytes, void *z) OBJC2_UNAVAILABLE; +OBJC_EXPORT id object_copyFromZone(id anObject, size_t nBytes, void *z) DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER; OBJC_EXPORT id object_realloc(id anObject, size_t nBytes) OBJC2_UNAVAILABLE; OBJC_EXPORT id object_reallocFromZone(id anObject, size_t nBytes, void *z) OBJC2_UNAVAILABLE; @@ -449,7 +476,7 @@ OBJC_EXPORT void objc_addClass(Class myClass) OBJC2_UNAVAILABLE; OBJC_EXPORT void objc_setClassHandler(int (*)(const char *)) OBJC2_UNAVAILABLE; OBJC_EXPORT void objc_setMultithreaded (BOOL flag) OBJC2_UNAVAILABLE; -OBJC_EXPORT id class_createInstanceFromZone(Class, size_t idxIvars, void *z) OBJC2_UNAVAILABLE; +OBJC_EXPORT id class_createInstanceFromZone(Class, size_t idxIvars, void *z) DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER; OBJC_EXPORT void class_addMethods(Class, struct objc_method_list *) OBJC2_UNAVAILABLE; OBJC_EXPORT void class_removeMethods(Class, struct objc_method_list *) OBJC2_UNAVAILABLE; diff --git a/runtime/standard.h b/runtime/standard.h deleted file mode 100644 index 7d471e2..0000000 --- a/runtime/standard.h +++ /dev/null @@ -1,54 +0,0 @@ -/* ------------------------------------------------------------------------------- -Standard definitions and types, Bob Jenkins ------------------------------------------------------------------------------- -*/ -#ifndef STANDARD -# define STANDARD - -#include -#include -#include -#include - -typedef uint64_t ub8; -#define UB8MAXVAL 0xffffffffffffffffLL -#define UB8BITS 64 -typedef int64_t sb8; -#define SB8MAXVAL 0x7fffffffffffffffLL -typedef uint32_t ub4; /* unsigned 4-byte quantities */ -#define UB4MAXVAL 0xffffffff -typedef int32_t sb4; -#define UB4BITS 32 -#define SB4MAXVAL 0x7fffffff -typedef uint16_t ub2; -#define UB2MAXVAL 0xffff -#define UB2BITS 16 -typedef int16_t sb2; -#define SB2MAXVAL 0x7fff -typedef uint8_t ub1; -#define UB1MAXVAL 0xff -#define UB1BITS 8 -typedef int8_t sb1; /* signed 1-byte quantities */ -#define SB1MAXVAL 0x7f -typedef int word; /* fastest type available */ - -#define bis(target,mask) ((target) |= (mask)) -#define bic(target,mask) ((target) &= ~(mask)) -#define bit(target,mask) ((target) & (mask)) -#ifndef min -# define min(a,b) (((a)<(b)) ? (a) : (b)) -#endif /* min */ -#ifndef max -# define max(a,b) (((a)<(b)) ? (b) : (a)) -#endif /* max */ -#ifndef align -# define align(a) (((ub4)a+(sizeof(void *)-1))&(~(sizeof(void *)-1))) -#endif /* align */ -#ifndef abs -# define abs(a) (((a)>0) ? (a) : -(a)) -#endif -#define TRUE 1 -#define FALSE 0 - -#endif /* STANDARD */ diff --git a/test/Makefile b/test/Makefile new file mode 100644 index 0000000..3c6e5fd --- /dev/null +++ b/test/Makefile @@ -0,0 +1,279 @@ +# a "simple test" contains a single .m file +# and optionally an expected-stderr file +SIMPLE_TESTS = category classname classpair classversion copyIvarList \ + copyMethodList copyPropertyList createInstance \ + definitions duplicateClass exc exchangeImp \ + forward gdb getMethod layout ignoredSelector initialize \ + instanceSize ismeta ivar load \ + msgSend property protocol protocol_copyMethodList addMethod \ + protocol_copyPropertyList protocol_cw sel super setSuper methodArgs \ + nilAPIArgs resolve runtime zone weakcopy + +# a "simple foundation test" is a simple test with -framework Foundation +SIMPLE_FOUNDATION_TESTS = nsobject foreach accessors \ + classgetclass gdb-lock unwind method_getName \ + synchronized synchronized-counter synchronized-grid + +# a "simple CF test" is a simple test with -framework CoreFoundation +SIMPLE_CF_TESTS = association-cf + +# a "complex build test" has a dedicated testname.out build rule below +COMPLEX_BUILD_TESTS = cacheflush future unload ivarSlide ivarSlidexx \ + gcenforcer imageorder nsexc concurrentcat load-parallel load-order \ + load-reentrant + +# a "complex test" has a dedicated testname run rule below +COMPLEX_RUN_TESTS = gcenforcer_noobjc gcenforcer_nogc gcenforcer_supportsgc \ + gcenforcer_requiresgc + +# `make fail` just fails +FAIL_TESTS = fail + +# Test-specific flags +CFLAGS_gdb = -Wno-deprecated-declarations -Wno-\#warnings +CFLAGS_setSuper = -Wno-deprecated-declarations +CFLAGS_duplicateClass = -Wno-deprecated-declarations +CFLAGS_protocol = -Wno-deprecated-declarations +CFLAGS_protocol_cw = -Wno-deprecated-declarations +CFLAGS_methodArgs = -Wno-deprecated-declarations +CFLAGS_ignoredSelector = -Wno-deprecated-declarations +CFLAGS_method_getName = -Wno-deprecated-declarations + +# `make OBJC_LIB=/path/to/libobjc.A.dylib` tests a specific objc build +ifndef OBJC_LIB +OBJC_LIB = -lobjc +endif +ifneq "$(OBJC_LIB)" "-lobjc" +ENV_PREFIX += DYLD_LIBRARY_PATH=$(dir $(OBJC_LIB)) +endif + +# `make ARCHS=cpu` tests with the specified architecture (only one allowed) +ifndef ARCHS +ARCHS=$(shell /usr/bin/arch) +endif + +# `make ARCH` is unsupported +ifdef ARCH +echo "*** use ARCHS not ARCH!" +exit 1 +endif + +# `make OTHER_CFLAGS=x` tests with specified flags +CFLAGS = -W -Wall -Wshorten-64-to-32 -g -O0 -fobjc-new-property +CFLAGS += $(OTHER_CFLAGS) -arch $(ARCHS) +LIBS = $(OBJC_LIB) -lauto + +# `make GC=YES` tests with GC on +GC_state = nogc +ifdef GC +ifneq "$(GC)" "no" +ifneq "$(GC)" "NO" +GC_state = gc +CFLAGS += -fobjc-gc +endif +endif +endif + +# `make LEAK_CHECK=NO` disables leak checking +# `make VALGRIND=YES` runs tests under Valgrind +ifdef VALGRIND +ifneq "$(VALGRIND)" "NO" +VALGRIND_PREFIX = ~public/bin/valgrind --db-listen=no --track-origins=yes +ifeq "$(LEAK_CHECK)" "NO" +VALGRIND_PREFIX += --leak-check=no +else +VALGRIND_PREFIX += --leak-check=full --leak-resolution=high +endif +endif +endif + +# `make GUARDMALLOC=YES` runs tests with libgmalloc +ifdef GUARDMALLOC +ifneq "$(GUARDMALLOC)" "NO" +ENV_PREFIX += DYLD_INSERT_LIBRARIES=/usr/lib/libgmalloc.dylib +endif +endif + + +RUN = $(ENV_PREFIX) $(VALGRIND_PREFIX) +ERR_CHECK = 2>&1 | perl errcheck.pl + +# `make HALT=YES` halts on the first test to fail, this is easier for automated harnesses to detect and report +ifneq "$(HALT)" "YES" +# if we are supposed to continue after error (the default), do something successful if errcheck.pl failed +EAT_ERR = || sh -c "" +endif + +FOUNDATION = -framework Foundation +CF = -framework CoreFoundation + +# Rebuild executables every time in case arch or cflags changed +.PHONY: $(wildcard *.out) $(wildcard *.dylib) + +CC=cc $(CFLAGS) +CXX=c++ $(CFLAGS) -fobjc-call-cxx-cdtors +CC_C=$(filter-out -fobjc-gc,$(CC)) + +all: print $(SIMPLE_TESTS) $(COMPLEX_BUILD_TESTS) $(COMPLEX_RUN_TESTS) $(SIMPLE_CF_TESTS) $(SIMPLE_FOUNDATION_TESTS) + +print: + @echo "Testing library $(OBJC_LIB) ..." + @echo "CFLAGS = $(CFLAGS)" + +debug: + @ make OBJC_LIB=`pwd`/../build/Debug/libobjc.A.dylib +release: + @ make OBJC_LIB=`pwd`/../build/Release/libobjc.A.dylib +buildit: + @ make OBJC_LIB=/tmp/objc.roots/objc~sym/libobjc.A.dylib +buildit-%: + @ make OBJC_LIB=/tmp/objc-$*.roots/objc-$*~sym/libobjc.A.dylib +clean: + rm -f *.out *.o *.dylib + rm -rf *.dSYM + +reallyclean: clean + rm -f *~ + +$(SIMPLE_TESTS) $(FAIL_TESTS) $(COMPLEX_BUILD_TESTS) $(SIMPLE_FOUNDATION_TESTS) $(SIMPLE_CF_TESTS) : % : %.out + @ $(RUN) ./$@.out $(ERR_CHECK) $@ $(EAT_ERR) + +$(addsuffix .out,$(SIMPLE_TESTS) $(FAIL_TESTS)) : %.out : %.m test.h Makefile + @ $(CC) $(CFLAGS_$*) $< -o $@ $(LIBS) + +$(addsuffix .out,$(SIMPLE_FOUNDATION_TESTS)) : %.out : %.m test.h Makefile + @ $(CC) $(CFLAGS_$*) $(FOUNDATION) $< -o $@ $(LIBS) + +$(addsuffix .out,$(SIMPLE_CF_TESTS)) : %.out : %.m test.h Makefile + @ $(CC) $(CFLAGS_$*) $(CF) $< -o $@ $(LIBS) + +nsexc.out: exc.m test.h Makefile + @ $(CC) $(FOUNDATION) exc.m -o nsexc.out $(LIBS) -DUSE_FOUNDATION=1 + +imageorder.out: imageorder.m imageorder.h imageorder3.out test.h Makefile + @ $(CC) imageorder.m imageorder3.out imageorder2.out imageorder1.out -o imageorder.out $(LIBS) +imageorder3.out: imageorder3.m imageorder.h imageorder2.out test.h Makefile + @ $(CC) -dynamiclib imageorder3.m imageorder2.out imageorder1.out -o imageorder3.out $(LIBS) +imageorder2.out: imageorder2.m imageorder.h imageorder1.out test.h Makefile + @ $(CC) -dynamiclib imageorder2.m imageorder1.out -o imageorder2.out $(LIBS) +imageorder1.out: imageorder1.m imageorder.h test.h Makefile + @ $(CC) -dynamiclib imageorder1.m -o imageorder1.out $(LIBS) + +ivarSlide.out: ivarSlide1.m ivarSlide2.m ivarSlide.h test.h Makefile + @ $(CC) ivarSlide1.m ivarSlide2.m -o ivarSlide.out $(LIBS) + +ivarSlidexx.out: ivarSlide1.m ivarSlide2.m ivarSlide.h test.h Makefile + @ $(CXX) -x objective-c++ ivarSlide1.m ivarSlide2.m -x none -o ivarSlidexx.out $(LIBS) + +future.out: future1.m future.h future0.out future2.out test.h Makefile + @ $(CC) future1.m future0.out -o future.out $(LIBS) +future0.out: future0.m future.h test.h Makefile + @ $(CC) -dynamiclib future0.m -o future0.out $(LIBS) +future2.out: future2.m future.h future0.out test.h Makefile + @ $(CC) -dynamiclib future2.m future0.out -o future2.out $(LIBS) + + +CONCURRENT_IN=cc1 cc2 cc3 cc4 cc5 cc6 cc7 cc8 cc9 cc10 cc11 cc12 cc13 cc14 cc15 +CONCURRENT_DYLIBS=$(addsuffix .out,$(CONCURRENT_IN)) + +$(CONCURRENT_DYLIBS) : %.out : concurrentcat_category.m test.h Makefile + @ $(CC) -undefined dynamic_lookup -dynamiclib -DTN=$* $< -o $@ $(LIBS) + +concurrentcat.out: concurrentcat.m $(CONCURRENT_DYLIBS) + @ $(CC) concurrentcat.m -o concurrentcat.out $(LIBS) $(FOUNDATION) + +cacheflush.out: cacheflush.m cacheflush.h cacheflush0.out cacheflush2.out cacheflush3.out test.h Makefile + @ $(CC) cacheflush.m cacheflush0.out -o cacheflush.out $(LIBS) +cacheflush0.out: cacheflush0.m cacheflush.h test.h Makefile + @ $(CC) -dynamiclib cacheflush0.m -o cacheflush0.out $(LIBS) +cacheflush2.out: cacheflush2.m cacheflush.h cacheflush0.out test.h Makefile + @ $(CC) -dynamiclib cacheflush2.m cacheflush0.out -o cacheflush2.out $(LIBS) +cacheflush3.out: cacheflush3.m cacheflush.h cacheflush0.out test.h Makefile + @ $(CC) -dynamiclib cacheflush3.m cacheflush0.out -o cacheflush3.out $(LIBS) + + +unload.out: unload.m unload.h unload2.out unload3.out unload4.out test.h Makefile + @ $(CC) unload.m -o unload.out $(LIBS) +unload2.out: unload2.m unload.h test.h Makefile + @ $(CC) -bundle unload2.m -o unload2.out $(LIBS) +unload3.out: unload3.m Makefile + @ $(CC) -dynamiclib unload3.m -o unload3.out $(LIBS) +unload4.out: unload4.m Makefile + @ $(CC) -dynamiclib unload4.m -o unload4.out $(LIBS) + +load-reentrant.out: load-reentrant.m load-reentrant2.m + @ $(CC) load-reentrant.m -o load-reentrant.out $(LIBS) + @ $(CC) -bundle load-reentrant2.m -o libload-reentrant2.dylib -bundle_loader load-reentrant.out $(LIBS) + +load-order.out: load-order.m libload-order1.dylib + @ $(CC) load-order.m -o load-order.out -L. -lload-order1 -lload-order2 -lload-order3 $(LIBS) +libload-order1.dylib: load-order1.m libload-order2.dylib + @ $(CC) -dynamiclib load-order1.m -o libload-order1.dylib -L. -lload-order2 -lload-order3 $(LIBS) +libload-order2.dylib: load-order2.m libload-order3.dylib + @ $(CC) -dynamiclib load-order2.m -o libload-order2.dylib -L. -lload-order3 $(LIBS) +libload-order3.dylib: load-order3.m + @ $(CC) -dynamiclib load-order3.m -o libload-order3.dylib $(LIBS) + +load-parallel.out: load-parallel.m libload-parallel00.dylib load-parallel0.out load-parallel1.out load-parallel2.out load-parallel3.out load-parallel4.out load-parallel5.out load-parallel6.out load-parallel7.out load-parallel8.out load-parallel9.out + @ $(CC) -DCOUNT=10 load-parallel.m -o load-parallel.out -L. -lload-parallel00 $(LIBS) +libload-parallel00.dylib: load-parallel00.m Makefile + @ $(CC) -dynamiclib load-parallel00.m -o libload-parallel00.dylib $(LIBS) +load-parallel0.out: load-parallel0.m Makefile libload-parallel00.dylib + @ $(CC) -dynamiclib load-parallel0.m -DN=0 -o load-parallel0.out -L. -lload-parallel00 $(LIBS) +load-parallel1.out: load-parallel0.m Makefile libload-parallel00.dylib + @ $(CC) -dynamiclib load-parallel0.m -DN=1 -o load-parallel1.out -L. -lload-parallel00 $(LIBS) +load-parallel2.out: load-parallel0.m Makefile libload-parallel00.dylib + @ $(CC) -dynamiclib load-parallel0.m -DN=2 -o load-parallel2.out -L. -lload-parallel00 $(LIBS) +load-parallel3.out: load-parallel0.m Makefile libload-parallel00.dylib + @ $(CC) -dynamiclib load-parallel0.m -DN=3 -o load-parallel3.out -L. -lload-parallel00 $(LIBS) +load-parallel4.out: load-parallel0.m Makefile libload-parallel00.dylib + @ $(CC) -dynamiclib load-parallel0.m -DN=4 -o load-parallel4.out -L. -lload-parallel00 $(LIBS) +load-parallel5.out: load-parallel0.m Makefile libload-parallel00.dylib + @ $(CC) -dynamiclib load-parallel0.m -DN=5 -o load-parallel5.out -L. -lload-parallel00 $(LIBS) +load-parallel6.out: load-parallel0.m Makefile libload-parallel00.dylib + @ $(CC) -dynamiclib load-parallel0.m -DN=6 -o load-parallel6.out -L. -lload-parallel00 $(LIBS) +load-parallel7.out: load-parallel0.m Makefile libload-parallel00.dylib + @ $(CC) -dynamiclib load-parallel0.m -DN=7 -o load-parallel7.out -L. -lload-parallel00 $(LIBS) +load-parallel8.out: load-parallel0.m Makefile libload-parallel00.dylib + @ $(CC) -dynamiclib load-parallel0.m -DN=8 -o load-parallel8.out -L. -lload-parallel00 $(LIBS) +load-parallel9.out: load-parallel0.m Makefile libload-parallel00.dylib + @ $(CC) -dynamiclib load-parallel0.m -DN=9 -o load-parallel9.out -L. -lload-parallel00 $(LIBS) + +libnoobjc.dylib: gc.c Makefile + @ $(CC_C) gc.c -dynamiclib -o libnoobjc.dylib +libnogc.dylib: gc.m Makefile + @ $(CC) gc.m -dynamiclib -o libnogc.dylib -fno-objc-gc $(LIBS) +libsupportsgc.dylib: gc.m Makefile + @ $(CC) gc.m -dynamiclib -o libsupportsgc.dylib -fobjc-gc $(LIBS) +librequiresgc.real.dylib: gc.m Makefile + @ $(CC) gc.m -dynamiclib -o librequiresgc.real.dylib -install_name librequiresgc.dylib -fobjc-gc-only $(LIBS) +librequiresgc.fake.dylib: gc.m Makefile + @ $(CC) gc.m -dynamiclib -o librequiresgc.fake.dylib -install_name librequiresgc.dylib -fobjc-gc $(LIBS) +librequiresgc.dylib: librequiresgc.real.dylib librequiresgc.fake.dylib + @ cp -f librequiresgc.real.dylib librequiresgc.dylib + +gcenforcer.out: gcenforcer.m libsupportsgc.dylib librequiresgc.dylib libnogc.dylib libnoobjc.dylib test.h Makefile + @ $(CC) gcenforcer.m -o gcenforcer.out $(LIBS) + +gcenforcer_noobjc.out: main.m libnoobjc.dylib test.h Makefile + @ $(CC) main.m libnoobjc.dylib -o gcenforcer_noobjc.out $(LIBS) +gcenforcer_noobjc: gcenforcer_noobjc.out Makefile + @ $(RUN) ./gcenforcer_noobjc.out $(ERR_CHECK) $@ $(EAT_ERR) + +gcenforcer_nogc.out: main.m libnogc.dylib test.h Makefile + @ $(CC) main.m libnogc.dylib -o gcenforcer_nogc.out $(LIBS) +gcenforcer_nogc: gcenforcer_nogc.out Makefile + @ $(RUN) ./gcenforcer_nogc.out $(ERR_CHECK) $@ gcenforcer_nogc.$(GC_state).expected-stderr $(EAT_ERR) + +gcenforcer_supportsgc.out: main.m libsupportsgc.dylib test.h Makefile + @ $(CC) main.m libsupportsgc.dylib -o gcenforcer_supportsgc.out $(LIBS) +gcenforcer_supportsgc: gcenforcer_supportsgc.out Makefile + @ $(RUN) ./gcenforcer_supportsgc.out $(ERR_CHECK) $@ $(EAT_ERR) + +# Linker sees librequiresgc.fake.dylib, runtime uses librequiresgc.real.dylib +gcenforcer_requiresgc.out: main.m librequiresgc.dylib libsupportsgc.dylib test.h Makefile + @ $(CC) main.m librequiresgc.fake.dylib -o gcenforcer_requiresgc.out $(LIBS) + +gcenforcer_requiresgc: gcenforcer_requiresgc.out Makefile + @ $(RUN) ./gcenforcer_requiresgc.out $(ERR_CHECK) $@ gcenforcer_requiresgc.$(GC_state).expected-stderr $(EAT_ERR) + diff --git a/test/README b/test/README new file mode 100644 index 0000000..6d19edc --- /dev/null +++ b/test/README @@ -0,0 +1,22 @@ +objc4 test suite README + +To run the tests: + `make` in this directory, or `make test` in the top-level directory + +Correct test output consists of 'PASS: testname' for each test. +No other output should be seen. + +Other options: + `make` tests the installed libobjc + `make buildit` tests the libobjc in /tmp/objc4-roots/objc4~sym/ + `make local` tests the libobjc in .. + + `make GC=YES` runs with garbage collection on + `make ARCHS=cpu` tests with the specified architecture (only one allowed) + `make VALGRIND=YES` runs with valgrind on (memcheck and leak detection) + `make GUARDMALLOC=YES` runs with GuardMalloc on + + `make OBJC_LIB=/path/to/libobjc.A.dylib` tests a specific objc4 build + `make OTHER_CFLAGS=x` tests with specified flags + + `make VERBOSE=` logs progress of some tests diff --git a/test/accessors.m b/test/accessors.m new file mode 100644 index 0000000..4d935ee --- /dev/null +++ b/test/accessors.m @@ -0,0 +1,77 @@ +#import +#import +#include "test.h" + +extern id objc_getProperty(id self, SEL _cmd, ptrdiff_t offset, BOOL atomic); +extern void objc_setProperty(id self, SEL _cmd, ptrdiff_t offset, id newValue, BOOL atomic, BOOL shouldCopy); + +@interface Test : NSObject { + NSString *_value; + // _object is at the last optimized property offset + id _object __attribute__((aligned(64))); +} +@property(readonly) Class class; +@property(copy) NSString *value; +@property(assign) id object; +@end + +typedef struct { + id isa; + NSString *_value; + // _object is at the last optimized property offset + id _object __attribute__((aligned(64))); +} TestDefs; + +@implementation Test + +// Question: why can't this code be automatically generated? + +- (void)dealloc { + self.value = nil; + self.object = nil; + [super dealloc]; +} + +- (Class)class { return objc_getProperty(self, _cmd, 0, YES); } + +- (NSString*)value { return (NSString*) objc_getProperty(self, _cmd, offsetof(TestDefs, _value), YES); } +- (void)setValue:(NSString*)inValue { objc_setProperty(self, _cmd, offsetof(TestDefs, _value), inValue, YES, YES); } + +- (id)object { return objc_getProperty(self, _cmd, offsetof(TestDefs, _object), YES); } +- (void)setObject:(id)inObject { objc_setProperty(self, _cmd, offsetof(TestDefs, _object), inObject, YES, NO); } + +- (NSString *)description { + return [NSString stringWithFormat:@"value = %@, object = %@", self.value, self.object]; +} + +@end + +int main() { + NSAutoreleasePool *pool = [NSAutoreleasePool new]; + + NSMutableString *value = [NSMutableString stringWithUTF8String:"test"]; + id object = [NSNumber numberWithInt:11]; + Test *t = [[Test new] autorelease]; + t.value = value; + [value setString:@"yuck"]; // mutate the string. + testassert(t.value != value); // must copy, since it was mutable. + testassert([t.value isEqualToString:@"test"]); + + Class testClass = [Test class]; + Class cls = t.class; + testassert(testClass == cls); + cls = t.class; + testassert(testClass == cls); + + t.object = object; + t.object = object; + + // NSLog(@"t.object = %@, t.value = %@", t.object, t.value); + // NSLog(@"t.object = %@, t.value = %@", t.object, t.value); // second call will optimized getters. + + [pool drain]; + + succeed(__FILE__); + + return 0; +} diff --git a/test/addMethod.m b/test/addMethod.m new file mode 100644 index 0000000..2608b51 --- /dev/null +++ b/test/addMethod.m @@ -0,0 +1,105 @@ +#include "test.h" +#include + +@interface Super { @public id isa; } @end +@implementation Super ++(void)initialize { } ++class { return self; } ++(id) new { return class_createInstance(self, 0); } + +-(int)superMethod { return 0; } +-(int)bothMethod { return 0; } +@end + +@interface Sub : Super @end +@implementation Sub +-(int)subMethod { return 0; } +-(int)bothMethod { return 0; } +@end + +@interface Sub2 : Super @end +@implementation Sub2 +-(int)subMethod { return 0; } +-(int)bothMethod { return 0; } +@end + + +id fn(id self __attribute__((unused)), SEL cmd __attribute__((unused)), ...) { return nil; } + +int main() +{ + IMP superMethodFromSuper = class_getMethodImplementation([Super class], @selector(superMethod)); + IMP bothMethodFromSuper = class_getMethodImplementation([Super class], @selector(bothMethod)); + IMP subMethodFromSub = class_getMethodImplementation([Sub class], @selector(subMethod)); + IMP bothMethodFromSub = class_getMethodImplementation([Sub class], @selector(bothMethod)); + IMP subMethodFromSub2 = class_getMethodImplementation([Sub2 class], @selector(subMethod)); + IMP bothMethodFromSub2 = class_getMethodImplementation([Sub2 class], @selector(bothMethod)); + + testassert(superMethodFromSuper); + testassert(bothMethodFromSuper); + testassert(subMethodFromSub); + testassert(bothMethodFromSub); + testassert(subMethodFromSub2); + testassert(bothMethodFromSub2); + + BOOL ok; + IMP imp; + + // class_addMethod doesn't replace existing implementations + ok = class_addMethod([Super class], @selector(superMethod), &fn, NULL); + testassert(!ok); + testassert(class_getMethodImplementation([Super class], @selector(superMethod)) == superMethodFromSuper); + + // class_addMethod does override superclass implementations + ok = class_addMethod([Sub class], @selector(superMethod), &fn, NULL); + testassert(ok); + testassert(class_getMethodImplementation([Sub class], @selector(superMethod)) == &fn); + + // class_addMethod does add root implementations + ok = class_addMethod([Super class], @selector(superMethodNew2), &fn, NULL); + testassert(ok); + testassert(class_getMethodImplementation([Super class], @selector(superMethodNew2)) == &fn); + testassert(class_getMethodImplementation([Sub class], @selector(superMethodNew2)) == &fn); + + + // class_replaceMethod does add new implementations, + // returning NULL if super has an implementation + imp = class_replaceMethod([Sub2 class], @selector(superMethod), &fn, NULL); + testassert(imp == NULL); + testassert(class_getMethodImplementation([Sub2 class], @selector(superMethod)) == fn); + + // class_replaceMethod does add new implementations, + // returning NULL if super has no implementation + imp = class_replaceMethod([Sub2 class], @selector(subMethodNew), &fn, NULL); + testassert(imp == NULL); + testassert(class_getMethodImplementation([Sub2 class], @selector(subMethodNew)) == fn); + + // class_replaceMethod does add new implemetations + // returning NULL if there is no super class + imp = class_replaceMethod([Super class], @selector(superMethodNew), &fn, NULL); + testassert(imp == NULL); + testassert(class_getMethodImplementation([Super class], @selector(superMethodNew)) == fn); + + + // class_replaceMethod does replace existing implementations, + // returning existing implementation (regardless of super) + imp = class_replaceMethod([Sub2 class], @selector(subMethod), &fn, NULL); + testassert(imp == subMethodFromSub2); + testassert(class_getMethodImplementation([Sub2 class], @selector(subMethod)) == fn); + + // class_replaceMethod does replace existing implemetations, + // returning existing implementation (regardless of super) + imp = class_replaceMethod([Sub2 class], @selector(bothMethod), &fn, NULL); + testassert(imp == bothMethodFromSub2); + testassert(class_getMethodImplementation([Sub2 class], @selector(bothMethod)) == fn); + + // class_replaceMethod does replace existing implemetations, + // returning existing implementation (regardless of super) + imp = class_replaceMethod([Super class], @selector(superMethod), &fn, NULL); + testassert(imp == superMethodFromSuper); + testassert(class_getMethodImplementation([Super class], @selector(superMethod)) == fn); + + // fixme actually try calling them + + succeed(__FILE__); +} diff --git a/test/association-cf.m b/test/association-cf.m new file mode 100644 index 0000000..ffd995d --- /dev/null +++ b/test/association-cf.m @@ -0,0 +1,24 @@ +#include +#include + +#include "test.h" + +int main() +{ + // rdar://6164781 setAssociatedObject on pure-CF object crashes LP64 + + id obj; + CFArrayRef array = CFArrayCreate(0, 0, 0, 0); + testassert(array); + + testassert(! objc_getClass("NSCFArray")); + + objc_setAssociatedObject((id)array, (void*)1, (id)array, OBJC_ASSOCIATION_ASSIGN); + + obj = objc_getAssociatedObject((id)array, (void*)1); + testassert(obj == (id)array); + + CFRelease(array); + + succeed(__FILE__); +} diff --git a/test/cacheflush.h b/test/cacheflush.h new file mode 100644 index 0000000..50ccaad --- /dev/null +++ b/test/cacheflush.h @@ -0,0 +1,7 @@ +#include + +@interface Super { id isa; } ++class; ++(int)classMethod; +-(int)instanceMethod; +@end diff --git a/test/cacheflush.m b/test/cacheflush.m new file mode 100644 index 0000000..0de609e --- /dev/null +++ b/test/cacheflush.m @@ -0,0 +1,54 @@ +#include "test.h" +#include +#include + +#include "cacheflush.h" + +@interface Sub : Super @end +@implementation Sub @end + + +int main() +{ + uintptr_t buf[10]; + uintptr_t buf2[10]; + buf[0] = (uintptr_t)[Super class]; + buf2[0] = (uintptr_t)[Sub class]; + + // Fill method cache + testassert(1 == [Super classMethod]); + testassert(1 == [(Super *)buf instanceMethod]); + testassert(1 == [Super classMethod]); + testassert(1 == [(Super *)buf instanceMethod]); + + testassert(1 == [Sub classMethod]); + testassert(1 == [(Sub *)buf2 instanceMethod]); + testassert(1 == [Sub classMethod]); + testassert(1 == [(Sub *)buf2 instanceMethod]); + + // Dynamically load a category + dlopen("cacheflush2.out", 0); + + // Make sure old cache results are gone + testassert(2 == [Super classMethod]); + testassert(2 == [(Super *)buf instanceMethod]); + + testassert(2 == [Sub classMethod]); + testassert(2 == [(Sub *)buf2 instanceMethod]); + + // Dynamically load another category + dlopen("cacheflush3.out", 0); + + // Make sure old cache results are gone + testassert(3 == [Super classMethod]); + testassert(3 == [(Super *)buf instanceMethod]); + + testassert(3 == [Sub classMethod]); + testassert(3 == [(Sub *)buf2 instanceMethod]); + + // fixme test subclasses + + // fixme test objc_flush_caches(), class_addMethod(), class_addMethods() + + succeed(__FILE__); +} diff --git a/test/cacheflush0.m b/test/cacheflush0.m new file mode 100644 index 0000000..991471b --- /dev/null +++ b/test/cacheflush0.m @@ -0,0 +1,8 @@ +#include "cacheflush.h" + +@implementation Super ++(void)initialize { } ++class { return self; } ++(int)classMethod { return 1; } +-(int)instanceMethod { return 1; } +@end diff --git a/test/cacheflush2.m b/test/cacheflush2.m new file mode 100644 index 0000000..439c178 --- /dev/null +++ b/test/cacheflush2.m @@ -0,0 +1,6 @@ +#include "cacheflush.h" + +@implementation Super (Category2) ++(int)classMethod { return 2; } +-(int)instanceMethod { return 2; } +@end diff --git a/test/cacheflush3.m b/test/cacheflush3.m new file mode 100644 index 0000000..a5b5210 --- /dev/null +++ b/test/cacheflush3.m @@ -0,0 +1,6 @@ +#include "cacheflush.h" + +@implementation Super (Category3) ++(int)classMethod { return 3; } +-(int)instanceMethod { return 3; } +@end diff --git a/test/category.m b/test/category.m new file mode 100644 index 0000000..4c946b4 --- /dev/null +++ b/test/category.m @@ -0,0 +1,107 @@ +#include "test.h" +#include +#include + +static int state = 0; + +@interface Super { id isa; } @end +@implementation Super ++(void)initialize { } ++class { return self; } +-(void)instancemethod { fail("-instancemethod not overridden by category"); } ++(void)method { fail("+method not overridden by category"); } +@end + +@interface Super (Category) @end +@implementation Super (Category) ++(void)method { + testprintf("in [Super(Category) method]\n"); + testassert(self == [Super class]); + testassert(state == 0); + state = 1; +} +-(void)instancemethod { + testprintf("in [Super(Category) instancemethod]\n"); + testassert(self->isa == [Super class]); + testassert(state == 1); + state = 2; +} +@end + +@interface Super (PropertyCategory) +@property int i; +@end +@implementation Super (PropertyCategory) +- (int)i { return 0; } +- (void)setI:(int)value { (void)value; } +@end + +// rdar://5086110 memory smasher in category with class method and property +@interface Super (r5086110) +@property int property5086110; +@end +@implementation Super (r5086110) ++(void)method5086110 { + fail("method method5086110 called!"); +} +- (int)property5086110 { fail("property5086110 called!"); return 0; } +- (void)setProperty5086110:(int)value { fail("setProperty5086110 called!"); (void)value; } +@end + + +@interface PropertyClass : Super { + int q; +} +@property(readonly) int q; +@end +@implementation PropertyClass +@synthesize q; +@end + +@interface PropertyClass (PropertyCategory) +@property int q; +@end +@implementation PropertyClass (PropertyCategory) +@dynamic q; +@end + + +int main() +{ + id buf[10] = {0}; + + // methods introduced by category + state = 0; + [Super method]; + buf[0] = [Super class]; + [(Super *)buf instancemethod]; + testassert(state == 2); + + // property introduced by category + objc_property_t p = class_getProperty([Super class], "i"); + testassert(p); + testassert(0 == strcmp(property_getName(p), "i")); + testassert(property_getAttributes(p)); + + // methods introduced by category's property + Method m; + m = class_getInstanceMethod([Super class], @selector(i)); + testassert(m); + m = class_getInstanceMethod([Super class], @selector(setI:)); + testassert(m); + + // class's property shadowed by category's property + objc_property_t *plist = class_copyPropertyList([PropertyClass class], NULL); + testassert(plist); + testassert(plist[0]); + testassert(0 == strcmp(property_getName(plist[0]), "q")); + testassert(0 == strcmp(property_getAttributes(plist[0]), "Ti,D")); + testassert(plist[1]); + testassert(0 == strcmp(property_getName(plist[1]), "q")); + testassert(0 == strcmp(property_getAttributes(plist[1]), "Ti,R,Vq")); + testassert(!plist[2]); + free(plist); + + succeed(__FILE__); +} + diff --git a/test/classgetclass.m b/test/classgetclass.m new file mode 100644 index 0000000..b700019 --- /dev/null +++ b/test/classgetclass.m @@ -0,0 +1,19 @@ +#include "test.h" +#include +#import + +@interface Foo:NSObject +@end +@implementation Foo +@end + +extern Class gdb_class_getClass(Class cls); + +int main() +{ +#if __OBJC2__ + testassert(gdb_class_getClass([Foo class]) == [Foo class]); +#endif + + succeed(__FILE__); +} diff --git a/test/classname.m b/test/classname.m new file mode 100644 index 0000000..7fc9804 --- /dev/null +++ b/test/classname.m @@ -0,0 +1,41 @@ +#include "test.h" +#include +#include + +@interface Super { @public id isa; } @end +@implementation Super ++(void)initialize { } ++class { return self; } +@end + +@interface Fake { @public id isa; } @end +@implementation Fake ++(void)initialize { } ++class { return self; } +@end + +int main() +{ + id buf[10]; + Super *obj = (Super *)buf; + buf[0] = [Fake class]; + + testassert(obj->isa == [Fake class]); + testassert(object_setClass(obj, [Super class]) == [Fake class]); + testassert(obj->isa == [Super class]); + testassert(object_setClass(nil, [Super class]) == nil); + + testassert(object_getClass(obj) == buf[0]); + testassert(object_getClass([Super class]) == [Super class]->isa); + testassert(object_getClass(nil) == Nil); + + testassert(0 == strcmp(object_getClassName(obj), "Super")); + testassert(0 == strcmp(object_getClassName([Super class]), "Super")); + testassert(0 == strcmp(object_getClassName(nil), "nil")); + + testassert(0 == strcmp(class_getName([Super class]), "Super")); + testassert(0 == strcmp(class_getName([Super class]->isa), "Super")); + testassert(0 == strcmp(class_getName(nil), "nil")); + + succeed(__FILE__); +} diff --git a/test/classpair.m b/test/classpair.m new file mode 100644 index 0000000..3897674 --- /dev/null +++ b/test/classpair.m @@ -0,0 +1,250 @@ +#include "test.h" +#include +#include +#ifndef OBJC_NO_GC +#include +#include +#endif + +@protocol Proto +-(void) instanceMethod; ++(void) classMethod; +@optional +-(void) instanceMethod2; ++(void) classMethod2; +@end + +@protocol Proto2 +-(void) instanceMethod; ++(void) classMethod; +@optional +-(void) instanceMethod2; ++(void) classMethod_that_does_not_exist; +@end + +@protocol Proto3 +-(void) instanceMethod; ++(void) classMethod_that_does_not_exist; +@optional +-(void) instanceMethod2; ++(void) classMethod2; +@end + +@interface Super { @public id isa; } @end +@implementation Super ++(void)initialize { } ++class { return self; } ++(id) new { return class_createInstance(self, 0); } +-(void) free { object_dispose(self); } + ++(void) classMethod { fail("+[Super classMethod] called"); } ++(void) classMethod2 { fail("+[Super classMethod2] called"); } +-(void) instanceMethod { fail("-[Super instanceMethod] called"); } +-(void) instanceMethod2 { fail("-[Super instanceMethod2] called"); } +@end + +@interface WeakSuper : Super { __weak id weakIvar; } @end +@implementation WeakSuper @end + +static int state; + +static void instance_fn(id self, SEL _cmd __attribute__((unused))) +{ + testassert(!class_isMetaClass(self->isa)); + state++; +} + +static void class_fn(id self, SEL _cmd __attribute__((unused))) +{ + testassert(class_isMetaClass(self->isa)); + state++; +} + +static void cycle(void) +{ + Class cls; + BOOL ok; + + testassert(!objc_getClass("Sub")); + testassert([Super class]); + + // Test subclass with bells and whistles + + cls = objc_allocateClassPair([Super class], "Sub", 0); + testassert(cls); +#ifndef OBJC_NO_GC + if (objc_collecting_enabled()) { + testassert(auto_zone_size(auto_zone(), cls)); + testassert(auto_zone_size(auto_zone(), cls->isa)); + } +#endif + + class_addMethod(cls, @selector(instanceMethod), + (IMP)&instance_fn, "v@:"); + class_addMethod(cls->isa, @selector(classMethod), + (IMP)&class_fn, "v@:"); + + ok = class_addProtocol(cls, @protocol(Proto)); + testassert(ok); + ok = class_addProtocol(cls, @protocol(Proto)); + testassert(!ok); + +#ifndef __LP64__ +# define size 4 +# define align 2 +#else +#define size 8 +# define align 3 +#endif + + ok = class_addIvar(cls, "ivar", 4, 2, "i"); + testassert(ok); + ok = class_addIvar(cls, "ivarid", size, align, "@"); + testassert(ok); + ok = class_addIvar(cls, "ivaridstar", size, align, "^@"); + testassert(ok); + ok = class_addIvar(cls, "ivar", 4, 2, "i"); + testassert(!ok); + ok = class_addIvar(cls->isa, "classvar", 4, 2, "i"); + testassert(!ok); + + objc_registerClassPair(cls); + + + testassert(cls == [cls class]); + testassert(cls == objc_getClass("Sub")); + + testassert(!class_isMetaClass(cls)); + testassert(class_isMetaClass(cls->isa)); + + testassert(class_getSuperclass(cls) == [Super class]); + testassert(class_getSuperclass(cls->isa) == [Super class]->isa); + + testassert(class_getInstanceSize(cls) >= sizeof(Class) + 4 + 2*size); + testassert(class_conformsToProtocol(cls, @protocol(Proto))); + + if (objc_collecting_enabled()) { + testassert(0 == strcmp(class_getIvarLayout(cls), "\x01\x12")); + testassert(NULL == class_getWeakIvarLayout(cls)); + } + + class_addMethod(cls, @selector(instanceMethod2), + (IMP)&instance_fn, "v@:"); + class_addMethod(cls->isa, @selector(classMethod2), + (IMP)&class_fn, "v@:"); + + ok = class_addIvar(cls, "ivar2", 4, 4, "i"); + testassert(!ok); + ok = class_addIvar(cls->isa, "classvar2", 4, 4, "i"); + testassert(!ok); + + ok = class_addProtocol(cls, @protocol(Proto2)); + testassert(ok); + ok = class_addProtocol(cls, @protocol(Proto2)); + testassert(!ok); + ok = class_addProtocol(cls, @protocol(Proto)); + testassert(!ok); + + // note: adding more methods here causes a false leak check failure + state = 0; + [cls classMethod]; + [cls classMethod2]; + testassert(state == 2); + + id obj = [cls new]; + state = 0; + [obj instanceMethod]; + [obj instanceMethod2]; + testassert(state == 2); + [obj free]; + + + // Test ivar layouts of sub-subclass + Class cls2 = objc_allocateClassPair(cls, "SubSub", 0); + testassert(cls2); + + ok = class_addIvar(cls2, "ivarid2", size, align, "@"); + testassert(ok); + ok = class_addIvar(cls2, "idarray", 16*sizeof(id), align, "[16@]"); + testassert(ok); + ok = class_addIvar(cls2, "intarray", 16*sizeof(void*), align, "[16^]"); + testassert(ok); + + objc_registerClassPair(cls2); + + if (objc_collecting_enabled()) { + testassert(0 == strcmp((char *)class_getIvarLayout(cls2), "\x01\x1f\x04\xf0\x10")); + testassert(NULL == class_getWeakIvarLayout(cls2)); + } + + objc_disposeClassPair(cls2); + + objc_disposeClassPair(cls); + + testassert(!objc_getClass("Sub")); + + + // Test unmodified ivar layouts + + cls = objc_allocateClassPair([Super class], "Sub2", 0); + testassert(cls); + objc_registerClassPair(cls); + if (objc_collecting_enabled()) { + const char *l1, *l2; + l1 = class_getIvarLayout([Super class]); + l2 = class_getIvarLayout(cls); + testassert(l1 == l2 || 0 == strcmp(l1, l2)); + l1 = class_getWeakIvarLayout([Super class]); + l2 = class_getWeakIvarLayout(cls); + testassert(l1 == l2 || 0 == strcmp(l1, l2)); + } + objc_disposeClassPair(cls); + + cls = objc_allocateClassPair([WeakSuper class], "Sub3", 0); + testassert(cls); + objc_registerClassPair(cls); + if (objc_collecting_enabled()) { + const char *l1, *l2; + l1 = class_getIvarLayout([WeakSuper class]); + l2 = class_getIvarLayout(cls); + testassert(l1 == l2 || 0 == strcmp(l1, l2)); + l1 = class_getWeakIvarLayout([WeakSuper class]); + l2 = class_getWeakIvarLayout(cls); + testassert(l1 == l2 || 0 == strcmp(l1, l2)); + } + objc_disposeClassPair(cls); + + // Test layout setters + if (objc_collecting_enabled()) { + cls = objc_allocateClassPair([Super class], "Sub4", 0); + testassert(cls); + class_setIvarLayout(cls, "foo"); + class_setWeakIvarLayout(cls, NULL); + objc_registerClassPair(cls); + testassert(0 == strcmp("foo", class_getIvarLayout(cls))); + testassert(NULL == class_getWeakIvarLayout(cls)); + objc_disposeClassPair(cls); + + cls = objc_allocateClassPair([Super class], "Sub5", 0); + testassert(cls); + class_setIvarLayout(cls, NULL); + class_setWeakIvarLayout(cls, "bar"); + objc_registerClassPair(cls); + testassert(NULL == class_getIvarLayout(cls)); + testassert(0 == strcmp("bar", class_getWeakIvarLayout(cls))); + objc_disposeClassPair(cls); + } +} + +int main() +{ + int count = 100; + cycle(); + leak_mark(); + while (count--) { + cycle(); + } + leak_check(0); + + succeed(__FILE__); +} diff --git a/test/classversion.m b/test/classversion.m new file mode 100644 index 0000000..65dd89a --- /dev/null +++ b/test/classversion.m @@ -0,0 +1,22 @@ +#include "test.h" +#include + +@interface Super { id isa; } @end +@implementation Super ++class { return self; } ++(void)initialize { } +@end + +int main() +{ + Class cls = [Super class]; + testassert(class_getVersion(cls) == 0); + testassert(class_getVersion(cls->isa) > 5); + class_setVersion(cls, 100); + testassert(class_getVersion(cls) == 100); + + testassert(class_getVersion(Nil) == 0); + class_setVersion(Nil, 100); + + succeed(__FILE__); +} diff --git a/test/concurrentcat.m b/test/concurrentcat.m new file mode 100644 index 0000000..633cbc4 --- /dev/null +++ b/test/concurrentcat.m @@ -0,0 +1,110 @@ +#include "test.h" +#include +#include +#include +#include +#include + +@interface TargetClass : NSObject +@end + +@interface TargetClass(LoadedMethods) +- (void) m0; +- (void) m1; +- (void) m2; +- (void) m3; +- (void) m4; +- (void) m5; +- (void) m6; +- (void) m7; +- (void) m8; +- (void) m9; +- (void) m10; +- (void) m11; +- (void) m12; +- (void) m13; +- (void) m14; +- (void) m15; +@end + +@implementation TargetClass ++(void)initialize { } ++(id)new { + return class_createInstance(self, 0); +} +- (void) m0; { fail("shoulda been loaded!"); } +- (void) m1; { fail("shoulda been loaded!"); } +- (void) m2; { fail("shoulda been loaded!"); } +- (void) m3; { fail("shoulda been loaded!"); } +- (void) m4; { fail("shoulda been loaded!"); } +- (void) m5; { fail("shoulda been loaded!"); } +- (void) m6; { fail("shoulda been loaded!"); } +@end + +void *threadFun(void *aTargetClassName) { + const char *className = aTargetClassName; + + objc_registerThreadWithCollector(); + + NSAutoreleasePool *p = [NSAutoreleasePool new]; + + Class targetSubclass = objc_getClass(className); + testassert(targetSubclass); + + id target = [targetSubclass new]; + testassert(target); + + while(1) { + [target m0]; + [target retain]; + [target addObserver: target forKeyPath: @"m3" options: 0 context: NULL]; + [target addObserver: target forKeyPath: @"m4" options: 0 context: NULL]; + [target m1]; + [target release]; + [target m2]; + [target autorelease]; + [target m3]; + [target retain]; + [target removeObserver: target forKeyPath: @"m4"]; + [target addObserver: target forKeyPath: @"m5" options: 0 context: NULL]; + [target m4]; + [target retain]; + [target m5]; + [target autorelease]; + [target m6]; + [target m7]; + [target m8]; + [target m9]; + [target m10]; + [target m11]; + [target m12]; + [target m13]; + [target m14]; + [target m15]; + [target removeObserver: target forKeyPath: @"m3"]; + [target removeObserver: target forKeyPath: @"m5"]; + } + [p drain]; + return NULL; +} + +int main() +{ + int i; + + void *dylib; + + for(i=1; i<16; i++) { + pthread_t t; + char dlName[100]; + sprintf(dlName, "cc%d.out", i); + dylib = dlopen(dlName, RTLD_LAZY); + char className[100]; + sprintf(className, "cc%d", i); + pthread_create(&t, NULL, threadFun, strdup(className)); + testassert(dylib); + } + sleep(1); + + succeed(__FILE__); +} diff --git a/test/concurrentcat_category.m b/test/concurrentcat_category.m new file mode 100644 index 0000000..74cb144 --- /dev/null +++ b/test/concurrentcat_category.m @@ -0,0 +1,70 @@ +#include +#include +#import + +@interface TargetClass : NSObject +@end + +@interface TargetClass(LoadedMethods) +- (void) m0; +- (void) m1; +- (void) m2; +- (void) m3; +- (void) m4; +- (void) m5; +- (void) m6; +- (void) m7; +- (void) m8; +- (void) m9; +- (void) m10; +- (void) m11; +- (void) m12; +- (void) m13; +- (void) m14; +- (void) m15; +@end + +@interface TN:TargetClass +@end + +@implementation TN +- (void) m1; { [super m1]; } +- (void) m3; { [self m1]; } + +- (void) m2 +{ + [self willChangeValueForKey: @"m4"]; + [self didChangeValueForKey: @"m4"]; +} + +- (void)observeValueForKeyPath:(NSString *) keyPath + ofObject:(id)object + change:(NSDictionary *)change + context:(void *)context +{ + // suppress warning + keyPath = nil; + object = nil; + change = nil; + context = NULL; +} +@end + +@implementation TargetClass(LoadedMethods) +- (void) m0;{ ; } +- (void) m1;{ ; } +- (void) m2;{ ; } +- (void) m3;{ ; } +- (void) m4;{ ; } +- (void) m5;{ ; } +- (void) m6;{ ; } +- (void) m7;{ ; } +- (void) m8;{ ; } +- (void) m9;{ ; } +- (void) m10;{ ; } +- (void) m11;{ ; } +- (void) m12;{ ; } +- (void) m13;{ ; } +- (void) m14;{ ; } +- (void) m15;{ ; } +@end diff --git a/test/copyIvarList.m b/test/copyIvarList.m new file mode 100644 index 0000000..d7535a1 --- /dev/null +++ b/test/copyIvarList.m @@ -0,0 +1,111 @@ +#include "test.h" +#include +#include +#include + +@interface SuperIvars { + id isa; + int ivar1; + int ivar2; +} @end +@implementation SuperIvars @end + +@interface SubIvars : SuperIvars { + int ivar3; + int ivar4; +} @end +@implementation SubIvars @end + + +@interface FourIvars { + int ivar1; + int ivar2; + int ivar3; + int ivar4; +} @end +@implementation FourIvars @end + +@interface NoIvars { } @end +@implementation NoIvars @end + +static int isNamed(Ivar iv, const char *name) +{ + return (0 == strcmp(name, ivar_getName(iv))); +} + +int main() +{ + Ivar *ivars; + unsigned int count; + Class cls; + + cls = objc_getClass("SubIvars"); + testassert(cls); + + count = 100; + ivars = class_copyIvarList(cls, &count); + testassert(ivars); + testassert(count == 2); + testassert(isNamed(ivars[0], "ivar3")); + testassert(isNamed(ivars[1], "ivar4")); + // ivars[] should be null-terminated + testassert(ivars[2] == NULL); + free(ivars); + + cls = objc_getClass("SuperIvars"); + testassert(cls); + + count = 100; + ivars = class_copyIvarList(cls, &count); + testassert(ivars); + testassert(count == 3); + testassert(isNamed(ivars[0], "isa")); + testassert(isNamed(ivars[1], "ivar1")); + testassert(isNamed(ivars[2], "ivar2")); + // ivars[] should be null-terminated + testassert(ivars[3] == NULL); + free(ivars); + + // Check null-termination - this ivar list block would be 16 bytes + // if it weren't for the terminator + cls = objc_getClass("FourIvars"); + testassert(cls); + + count = 100; + ivars = class_copyIvarList(cls, &count); + testassert(ivars); + testassert(count == 4); + testassert(malloc_size(ivars) >= 5 * sizeof(Ivar)); + testassert(ivars[3] != NULL); + testassert(ivars[4] == NULL); + free(ivars); + + // Check NULL count parameter + ivars = class_copyIvarList(cls, NULL); + testassert(ivars); + testassert(ivars[4] == NULL); + testassert(ivars[3] != NULL); + free(ivars); + + // Check NULL class parameter + count = 100; + ivars = class_copyIvarList(NULL, &count); + testassert(!ivars); + testassert(count == 0); + + // Check NULL class and count + ivars = class_copyIvarList(NULL, NULL); + testassert(!ivars); + + // Check class with no ivars + cls = objc_getClass("NoIvars"); + testassert(cls); + + count = 100; + ivars = class_copyIvarList(cls, &count); + testassert(!ivars); + testassert(count == 0); + + succeed(__FILE__); + return 0; +} diff --git a/test/copyMethodList.m b/test/copyMethodList.m new file mode 100644 index 0000000..b050f40 --- /dev/null +++ b/test/copyMethodList.m @@ -0,0 +1,146 @@ +#include "test.h" +#include +#include + +@interface SuperMethods { } @end +@implementation SuperMethods ++(void)SuperMethodClass { } ++(void)SuperMethodClass2 { } +-(void)SuperMethodInstance { } +-(void)SuperMethodInstance2 { } +@end + +@interface SubMethods { } @end +@implementation SubMethods ++(void)SubMethodClass { } ++(void)SubMethodClass2 { } +-(void)SubMethodInstance { } +-(void)SubMethodInstance2 { } +@end + +@interface SuperMethods (Category) @end +@implementation SuperMethods (Category) ++(void)SuperMethodClassCat { } ++(void)SuperMethodClassCat2 { } +-(void)SuperMethodInstanceCat { } +-(void)SuperMethodInstanceCat2 { } +@end + +@interface SubMethods (Category) @end +@implementation SubMethods (Category) ++(void)SubMethodClassCat { } ++(void)SubMethodClassCat2 { } +-(void)SubMethodInstanceCat { } +-(void)SubMethodInstanceCat2 { } +@end + + +@interface FourMethods @end +@implementation FourMethods +-(void)one { } +-(void)two { } +-(void)three { } +-(void)four { } +@end + +@interface NoMethods @end +@implementation NoMethods @end + +static int isNamed(Method m, const char *name) +{ + return (method_getName(m) == sel_registerName(name)); +} + +int main() +{ + // Class SubMethods has not yet been touched, so runtime must attach + // the lazy categories + Method *methods; + unsigned int count; + Class cls; + + cls = objc_getClass("SubMethods"); + testassert(cls); + + testprintf("calling class_copyMethodList(SubMethods) (should be unmethodized)\n"); + + count = 100; + methods = class_copyMethodList(cls, &count); + testassert(methods); + testassert(count == 4); + // First two methods should be the category methods, + // followed by the class methods + testassert((isNamed(methods[0], "SubMethodInstanceCat") && + isNamed(methods[1], "SubMethodInstanceCat2")) + || + (isNamed(methods[1], "SubMethodInstanceCat") && + isNamed(methods[0], "SubMethodInstanceCat2"))); + testassert((isNamed(methods[2], "SubMethodInstance") && + isNamed(methods[3], "SubMethodInstance2")) + || + (isNamed(methods[3], "SubMethodInstance") && + isNamed(methods[2], "SubMethodInstance2"))); + // methods[] should be null-terminated + testassert(methods[4] == NULL); + free(methods); + + testprintf("calling class_copyMethodList(SubMethods(meta)) (should be unmethodized)\n"); + + count = 100; + methods = class_copyMethodList(cls->isa, &count); + testassert(methods); + testassert(count == 4); + // First two methods should be the category methods, + // followed by the class methods + testassert((isNamed(methods[0], "SubMethodClassCat") && + isNamed(methods[1], "SubMethodClassCat2")) + || + (isNamed(methods[1], "SubMethodClassCat") && + isNamed(methods[0], "SubMethodClassCat2"))); + testassert((isNamed(methods[2], "SubMethodClass") && + isNamed(methods[3], "SubMethodClass2")) + || + (isNamed(methods[3], "SubMethodClass") && + isNamed(methods[2], "SubMethodClass2"))); + // methods[] should be null-terminated + testassert(methods[4] == NULL); + free(methods); + + // Check null-termination - this method list block would be 16 bytes + // if it weren't for the terminator + count = 100; + cls = objc_getClass("FourMethods"); + methods = class_copyMethodList(cls, &count); + testassert(methods); + testassert(count == 4); + testassert(malloc_size(methods) >= 5 * sizeof(Method)); + testassert(methods[3] != NULL); + testassert(methods[4] == NULL); + free(methods); + + // Check NULL count parameter + methods = class_copyMethodList(cls, NULL); + testassert(methods); + testassert(methods[4] == NULL); + testassert(methods[3] != NULL); + free(methods); + + // Check NULL class parameter + count = 100; + methods = class_copyMethodList(NULL, &count); + testassert(!methods); + testassert(count == 0); + + // Check NULL class and count + methods = class_copyMethodList(NULL, NULL); + testassert(!methods); + + // Check class with no methods + count = 100; + cls = objc_getClass("NoMethods"); + methods = class_copyMethodList(cls, &count); + testassert(!methods); + testassert(count == 0); + + succeed(__FILE__); +} diff --git a/test/copyPropertyList.m b/test/copyPropertyList.m new file mode 100644 index 0000000..5821016 --- /dev/null +++ b/test/copyPropertyList.m @@ -0,0 +1,120 @@ +#include "test.h" +#include +#include +#include + +@interface SuperProps { id isa; int prop1; int prop2; } +@property int prop1; +@property int prop2; +@end +@implementation SuperProps +@synthesize prop1; +@synthesize prop2; +@end + +@interface SubProps : SuperProps { int prop3; int prop4; } +@property int prop3; +@property int prop4; +@end +@implementation SubProps +@synthesize prop3; +@synthesize prop4; +@end + + +@interface FourProps { int prop1; int prop2; int prop3; int prop4; } +@property int prop1; +@property int prop2; +@property int prop3; +@property int prop4; +@end +@implementation FourProps +@synthesize prop1; +@synthesize prop2; +@synthesize prop3; +@synthesize prop4; +@end + +@interface NoProps @end +@implementation NoProps @end + +static int isNamed(objc_property_t p, const char *name) +{ + return (0 == strcmp(name, property_getName(p))); +} + +int main() +{ + objc_property_t *props; + unsigned int count; + Class cls; + + cls = objc_getClass("SubProps"); + testassert(cls); + + count = 100; + props = class_copyPropertyList(cls, &count); + testassert(props); + testassert(count == 2); + testassert((isNamed(props[0], "prop3") && isNamed(props[1], "prop4")) || + (isNamed(props[1], "prop3") && isNamed(props[0], "prop4"))); + // props[] should be null-terminated + testassert(props[2] == NULL); + free(props); + + cls = objc_getClass("SuperProps"); + testassert(cls); + + count = 100; + props = class_copyPropertyList(cls, &count); + testassert(props); + testassert(count == 2); + testassert((isNamed(props[0], "prop1") && isNamed(props[1], "prop2")) || + (isNamed(props[1], "prop1") && isNamed(props[0], "prop2"))); + // props[] should be null-terminated + testassert(props[2] == NULL); + free(props); + + // Check null-termination - this property list block would be 16 bytes + // if it weren't for the terminator + cls = objc_getClass("FourProps"); + testassert(cls); + + count = 100; + props = class_copyPropertyList(cls, &count); + testassert(props); + testassert(count == 4); + testassert(malloc_size(props) >= 5 * sizeof(objc_property_t)); + testassert(props[3] != NULL); + testassert(props[4] == NULL); + free(props); + + // Check NULL count parameter + props = class_copyPropertyList(cls, NULL); + testassert(props); + testassert(props[4] == NULL); + testassert(props[3] != NULL); + free(props); + + // Check NULL class parameter + count = 100; + props = class_copyPropertyList(NULL, &count); + testassert(!props); + testassert(count == 0); + + // Check NULL class and count + props = class_copyPropertyList(NULL, NULL); + testassert(!props); + + // Check class with no properties + cls = objc_getClass("NoProps"); + testassert(cls); + + count = 100; + props = class_copyPropertyList(cls, &count); + testassert(!props); + testassert(count == 0); + + succeed(__FILE__); + return 0; +} diff --git a/test/createInstance.m b/test/createInstance.m new file mode 100644 index 0000000..5be912f --- /dev/null +++ b/test/createInstance.m @@ -0,0 +1,57 @@ +#import +#import +#ifndef OBJC_NO_GC +#include +#endif +#include "test.h" + +@interface Super { @public id isa; } @end +@implementation Super ++(void) initialize { } ++(Class) class { return self; } +@end + +@interface Sub : Super { int array[128]; } @end +@implementation Sub @end + +int main() +{ + Super *s; + + s = class_createInstance([Super class], 0); + testassert(s); + testassert(s->isa == [Super class]); + testassert(malloc_size(s) >= class_getInstanceSize([Super class])); + if (objc_collecting_enabled()) testassert(auto_zone_is_valid_pointer(auto_zone(), s)); + + object_dispose(s); + + s = class_createInstance([Sub class], 0); + testassert(s); + testassert(s->isa == [Sub class]); + testassert(malloc_size(s) >= class_getInstanceSize([Sub class])); + if (objc_collecting_enabled()) testassert(auto_zone_is_valid_pointer(auto_zone(), s)); + + object_dispose(s); + + s = class_createInstance([Super class], 100); + testassert(s); + testassert(s->isa == [Super class]); + testassert(malloc_size(s) >= class_getInstanceSize([Super class]) + 100); + if (objc_collecting_enabled()) testassert(auto_zone_is_valid_pointer(auto_zone(), s)); + + object_dispose(s); + + s = class_createInstance([Sub class], 100); + testassert(s); + testassert(s->isa == [Sub class]); + testassert(malloc_size(s) >= class_getInstanceSize([Sub class]) + 100); + if (objc_collecting_enabled()) testassert(auto_zone_is_valid_pointer(auto_zone(), s)); + + object_dispose(s); + + s = class_createInstance(Nil, 0); + testassert(!s); + + succeed(__FILE__); +} diff --git a/test/debuggerMode.m b/test/debuggerMode.m new file mode 100644 index 0000000..2836a4d --- /dev/null +++ b/test/debuggerMode.m @@ -0,0 +1,157 @@ +#include "test.h" +#include +#include +#include +#define _OBJC_PRIVATE_H_ +#include + +extern void _objc_flush_caches(Class cls, BOOL flushMeta); + + +@interface Super { id isa; } @end + +@implementation Super ++(void)initialize { } ++class { return self; } ++(int)method { return 1; } ++(int)method2 { return 1; } +@end + + +semaphore_t sema; + +void *thread(void *arg __unused) +{ + objc_registerThreadWithCollector(); + + semaphore_signal(sema); + testprintf("hi\n"); + while (1) { + [Super method]; + _objc_flush_caches(0, YES); + } +} + + +void stopAllThreads(void) +{ + mach_msg_type_number_t count, i; + thread_act_array_t list; + + task_threads(mach_task_self(), &list, &count); + for (i = 0; i < count; i++) { + if (list[i] == mach_thread_self()) continue; + thread_suspend(list[i]); + mach_port_deallocate(mach_task_self(), list[i]); + } +} + +void startAllThreads(void) +{ + mach_msg_type_number_t count, i; + thread_act_array_t list; + + task_threads(mach_task_self(), &list, &count); + for (i = 0; i < count; i++) { + if (list[i] == mach_thread_self()) continue; + thread_resume(list[i]); + mach_port_deallocate(mach_task_self(), list[i]); + } +} + + +static void cycle(int mode, int *good, int *bad) +{ + stopAllThreads(); + if (gdb_objc_startDebuggerMode(mode)) { + testprintf("good\n"); + [Super method]; + [Super method2]; + if (mode == OBJC_DEBUGMODE_FULL) { + // will crash without full write locks + _objc_flush_caches(0, YES); + } + gdb_objc_endDebuggerMode(); + ++*good; + } else { + testprintf("bad\n"); + ++*bad; + } + startAllThreads(); + sched_yield(); +} + + +int main() +{ +#define STOPS 10000 +#define THREADS 1 + int i; + + [Super class]; + + testassert(STOPS > 200); + + // Uncontended debugger mode + testassert(gdb_objc_startDebuggerMode(0)); + gdb_objc_endDebuggerMode(); + + // Uncontended full debugger mode + testassert(gdb_objc_startDebuggerMode(OBJC_DEBUGMODE_FULL)); + gdb_objc_endDebuggerMode(); + + // Nested debugger mode + testassert(gdb_objc_startDebuggerMode(0)); + testassert(gdb_objc_startDebuggerMode(0)); + gdb_objc_endDebuggerMode(); + gdb_objc_endDebuggerMode(); + + // Nested full debugger mode + testassert(gdb_objc_startDebuggerMode(OBJC_DEBUGMODE_FULL)); + testassert(gdb_objc_startDebuggerMode(OBJC_DEBUGMODE_FULL)); + gdb_objc_endDebuggerMode(); + gdb_objc_endDebuggerMode(); + + // Check that debugger mode sometimes works and sometimes doesn't + // when contending with another runtime-manipulating thread. + + semaphore_create(mach_task_self(), &sema, 0, 0); + + for (i = 0; i < THREADS; i++) { + pthread_t th; + pthread_create(&th, NULL, &thread, NULL); + semaphore_wait(sema); + } + + testprintf("go\n"); + + int good0 = 0, bad0 = 0; + for (i = 0; i < STOPS; i++) { + cycle(0, &good0, &bad0); + } + testprintf("good0 %d, bad0 %d\n", good0, bad0); + + int goodF = 0, badF = 0; + for (i = 0; i < STOPS; i++) { + cycle(OBJC_DEBUGMODE_FULL, &goodF, &badF); + } + testprintf("goodF %d, badF %d\n", goodF, badF); + + // Require at least 1% each of good and bad. + // Also require more than one each (exactly one is likely + // a bug wherein the locks got stuck the first time). + // Also require that FULL worked less often. + + if (good0 > STOPS/100 && bad0 > STOPS/100 && good0 > 1 && bad0 > 1 && + goodF > STOPS/100 && badF > STOPS/100 && goodF > 1 && badF > 1 +#ifdef __OBJC2__ + && good0 > goodF /* not reliable enough in old runtime */ +#endif + ) + { + succeed(__FILE__); + } + + fail("good0=%d/%d bad0=%d/%d goodF=%d/%d badF=%d/%d (required at least %d/%d good)", + good0, STOPS, bad0, STOPS, goodF, STOPS, badF, STOPS, STOPS/100, STOPS); +} diff --git a/test/definitions.m b/test/definitions.m new file mode 100644 index 0000000..5519933 --- /dev/null +++ b/test/definitions.m @@ -0,0 +1,23 @@ +// DO NOT include anything else here +#include +// DO NOT include anything else here +Class c = Nil; +SEL s; +IMP i; +id o = nil; +BOOL b = YES; +BOOL b2 = NO; +__strong void *p; + + +#include "test.h" + +int main() +{ + testassert(YES); + testassert(!NO); + testassert(!nil); + testassert(!Nil); + + succeed(__FILE__); +} diff --git a/test/duplicateClass.m b/test/duplicateClass.m new file mode 100644 index 0000000..794a46a --- /dev/null +++ b/test/duplicateClass.m @@ -0,0 +1,157 @@ +#include "test.h" +#include +#ifndef OBJC_NO_GC +#include +#include +#endif + +static int state; + +@protocol Proto ++class; +@end + +@interface Super { + id isa; + int i; +} +@property int i; +@end + +@implementation Super +@synthesize i; + ++(void)initialize { } ++class { return self; } ++new { return class_createInstance(self, 0); } +-(void)dealloc { object_dispose(self); } + ++(void)classMethod { + state = 1; +} + +-(void)instanceMethod { + state = 3; +} + +@end + + +@implementation Super (Category) + ++(void)classMethod { + state = 2; +} + +-(void)instanceMethod { + state = 4; +} + +@end + + +int main() +{ + Class clone; + Class cls; + Method *m1, *m2; + int i; + + cls = [Super class]; + clone = objc_duplicateClass(cls, "Super_copy", 0); +#ifndef OBJC_NO_GC + if (objc_collecting_enabled()) { + testassert(auto_zone_size(auto_zone(), clone)); + // objc_duplicateClass() doesn't duplicate the metaclass + // no: testassert(auto_zone_size(auto_zone(), clone->isa)); + } +#endif + + testassert(clone != cls); + testassert(clone->isa == cls->isa); + testassert(class_getSuperclass(clone) == class_getSuperclass(cls)); + testassert(class_getVersion(clone) == class_getVersion(cls)); + testassert(class_isMetaClass(clone) == class_isMetaClass(cls)); + testassert(class_getIvarLayout(clone) == class_getIvarLayout(cls)); + testassert(class_getWeakIvarLayout(clone) == class_getWeakIvarLayout(cls)); +#if !__OBJC2__ + testassert((clone->info & (CLS_CLASS|CLS_META)) == (cls->info & (CLS_CLASS|CLS_META))); +#endif + + // Check method list + + m1 = class_copyMethodList(cls, NULL); + m2 = class_copyMethodList(clone, NULL); + testassert(m1); + testassert(m2); + for (i = 0; m1[i] && m2[i]; i++) { + testassert(m1[i] != m2[i]); // method list must be deep-copied + testassert(method_getName(m1[i]) == method_getName(m2[i])); + testassert(method_getImplementation(m1[i]) == method_getImplementation(m2[i])); + testassert(method_getTypeEncoding(m1[i]) == method_getTypeEncoding(m2[i])); + } + testassert(m1[i] == NULL && m2[i] == NULL); + free(m1); + free(m2); + + // Check ivar list + Ivar *i1 = class_copyIvarList(cls, NULL); + Ivar *i2 = class_copyIvarList(clone, NULL); + testassert(i1); + testassert(i2); + for (i = 0; i1[i] && i2[i]; i++) { + testassert(i1[i] == i2[i]); // ivars are not deep-copied + } + testassert(i1[i] == NULL && i2[i] == NULL); + free(i1); + free(i2); + + // Check protocol list + Protocol **p1 = class_copyProtocolList(cls, NULL); + Protocol **p2 = class_copyProtocolList(clone, NULL); + testassert(p1); + testassert(p2); + for (i = 0; p1[i] && p2[i]; i++) { + testassert(p1[i] == p2[i]); // protocols are not deep-copied + } + testassert(p1[i] == NULL && p2[i] == NULL); + free(p1); + free(p2); + + // Check property list + objc_property_t *o1 = class_copyPropertyList(cls, NULL); + objc_property_t *o2 = class_copyPropertyList(clone, NULL); + testassert(o1); + testassert(o2); + for (i = 0; o1[i] && o2[i]; i++) { + testassert(o1[i] == o2[i]); // properties are not deep-copied + } + testassert(o1[i] == NULL && o2[i] == NULL); + free(o1); + free(o2); + + // Check method calls + + state = 0; + [cls classMethod]; + testassert(state == 2); + state = 0; + [clone classMethod]; + testassert(state == 2); + + // #4511660 Make sure category implementation is still the preferred one + id obj; + obj = [cls new]; + state = 0; + [obj instanceMethod]; + testassert(state == 4); + [obj dealloc]; + + obj = [clone new]; + state = 0; + [obj instanceMethod]; + testassert(state == 4); + [obj dealloc]; + + succeed(__FILE__); +} diff --git a/test/errcheck.pl b/test/errcheck.pl new file mode 100644 index 0000000..dd49a18 --- /dev/null +++ b/test/errcheck.pl @@ -0,0 +1,116 @@ +#!/usr/bin/perl +use strict; + +# errcheck.pl +# Check test output for errors. +# usage: test.out | errcheck.pl test [stderr-file] + +my $testname = shift || die; +my $errfile = shift || "$testname.expected-stderr"; + +my @input; +my @original_input; +while (my $line = <>) { + chomp $line; + push @input, $line; + push @original_input, $line; +} + +# Run result-checking passes, reducing @input each time +my $xit = 0; +my $bad = ""; +$bad |= filter_valgrind() if ($ENV{VALGRIND}); +$bad = filter_expected() if ($bad eq "" && -e $errfile); +$bad = filter_bad() if ($bad eq ""); + +# OK line should be the only one left +$bad = "(output not 'OK: $testname')" if ($bad eq "" && (scalar(@input) != 1 || $input[0] !~ /^OK: $testname/)); + +if ($bad ne "") { + my $red = "\e[41;37m"; + my $def = "\e[0m"; + $xit = 1; + print "${red}BAD: /// test '$testname' \\\\\\$def\n"; + for my $line (@original_input) { + print "$red $def$line\n"; + } + print "${red}BAD: \\\\\\ test '$testname' ///$def\n"; + print "${red}FAIL: ## $testname: $bad$def\n"; +} else { + print "PASS: $testname\n"; +} + +exit $xit; + +sub filter_expected +{ + my $bad = ""; + + open(my $checkfile, $errfile) + || die "can't find $errfile\n"; + my $check = join('', <$checkfile>); + close($checkfile); + + my $input = join("\n", @input) . "\n"; + if ($input !~ /^$check$/s) { + $bad = "(didn't match $errfile)"; + @input = "BAD: $testname"; + } else { + @input = "OK: $testname"; # pacify later filter + } + + return $bad; +} + +sub filter_bad +{ + my $bad = ""; + + my @new_input; + for my $line (@input) { + chomp $line; + if ($line =~ /^BAD: (.*)/) { + $bad = "(failed)"; + } else { + push @new_input, $line; + } + } + @input = @new_input; + return $bad; +} + +sub filter_valgrind +{ + my $errors = 0; + my $leaks = 0; + + my @new_input; + for my $line (@input) { + if ($line =~ /^Approx: do_origins_Dirty\([RW]\): missed \d bytes$/) { + # --track-origins warning (harmless) + next; + } + if ($line !~ /^^\.*==\d+==/) { + # not valgrind output + push @new_input, $line; + next; + } + + my ($errcount) = ($line =~ /==\d+== ERROR SUMMARY: (\d+) errors/); + if (defined $errcount && $errcount > 0) { + $errors = 1; + } + + (my $leakcount) = ($line =~ /==\d+==\s+(?:definitely|possibly) lost:\s+([0-9,]+)/); + if (defined $leakcount && $leakcount > 0) { + $leaks = 1; + } + } + + @input = @new_input; + + my $bad = ""; + $bad .= "(valgrind errors)" if ($errors); + $bad .= "(valgrind leaks)" if ($leaks); + return $bad; +} diff --git a/test/exc.m b/test/exc.m new file mode 100644 index 0000000..2921351 --- /dev/null +++ b/test/exc.m @@ -0,0 +1,635 @@ +#include "test.h" +#include +#include + +static volatile int state = 0; +#define BAD 1000000 + +#if defined(USE_FOUNDATION) + +#include + +static NSAutoreleasePool *p; +void pool(void) { [p release]; p = [NSAutoreleasePool new]; } + +@interface Super : NSException @end +@implementation Super ++new { return [[self exceptionWithName:@"Super" reason:@"reason" userInfo:nil] retain]; } +-(void)check { state++; } ++(void)check { testassert(!"caught class object, not instance"); } +@end + +#else + +void pool(void) { } + +@interface Super { id isa; } @end +@implementation Super ++new { return class_createInstance(self, 0); } ++(void)initialize { } +-(void)check { state++; } ++(void)check { testassert(!"caught class object, not instance"); } +-(void)release { object_dispose(self); } +@end + +#endif + +@interface Sub : Super @end +@implementation Sub +@end + + +#if __OBJC2__ + +void altHandlerFail(id unused __unused, void *context __unused) +{ + fail("altHandlerFail called"); +} + +#define ALT_HANDLER(n) \ + void altHandler##n(id unused __unused, void *context) \ + { \ + testassert(context == (void*)&altHandler##n); \ + testassert(state == n); \ + state++; \ + } + +ALT_HANDLER(2) +ALT_HANDLER(3) +ALT_HANDLER(4) +ALT_HANDLER(5) +ALT_HANDLER(6) +ALT_HANDLER(7) + + +static void throwWithAltHandler(void) __attribute__((noinline)); +static void throwWithAltHandler(void) +{ + @try { + state++; + uintptr_t token = objc_addExceptionHandler(altHandler3, altHandler3); + // state++ inside alt handler + @throw [Super new]; + state = BAD; + objc_removeExceptionHandler(token); + } + @catch (Sub *e) { + state = BAD; + } + state = BAD; +} + + +static void throwWithAltHandlerAndRethrow(void) __attribute__((noinline)); +static void throwWithAltHandlerAndRethrow(void) +{ + @try { + state++; + uintptr_t token = objc_addExceptionHandler(altHandler3, altHandler3); + // state++ inside alt handler + @throw [Super new]; + state = BAD; + objc_removeExceptionHandler(token); + } + @catch (...) { + testassert(state == 4); + state++; + @throw; + } + state = BAD; +} + +#endif + + +int main() +{ + pool(); + + testprintf("try-catch-finally, exception caught exactly\n"); + + state = 0; + @try { + state++; + @try { + state++; + @throw [Super new]; + state = BAD; + } + @catch (Super *e) { + state++; + [e check]; // state++ + [e release]; + } + @finally { + state++; + } + state++; + } + @catch (...) { + state = BAD; + } + testassert(state == 6); + + + testprintf("try-finally, no exception thrown\n"); + + state = 0; + @try { + state++; + @try { + state++; + } + @finally { + state++; + } + state++; + } + @catch (...) { + state = BAD; + } + testassert(state == 4); + + + testprintf("try-finally, with exception\n"); + + state = 0; + @try { + state++; + @try { + state++; + @throw [Super new]; + state = BAD; + } + @finally { + state++; + } + state = BAD; + } + @catch (id e) { + state++; + [e check]; // state++ + [e release]; + } + testassert(state == 5); + + + testprintf("try-catch-finally, no exception\n"); + + state = 0; + @try { + state++; + @try { + state++; + } + @catch (...) { + state = BAD; + } + @finally { + state++; + } + state++; + } @catch (...) { + state = BAD; + } + testassert(state == 4); + + + testprintf("try-catch-finally, exception not caught\n"); + + state = 0; + @try { + state++; + @try { + state++; + @throw [Super new]; + state = BAD; + } + @catch (Sub *e) { + state = BAD; + } + @finally { + state++; + } + state = BAD; + } + @catch (id e) { + state++; + [e check]; // state++ + [e release]; + } + testassert(state == 5); + + + testprintf("try-catch-finally, exception caught exactly, rethrown\n"); + + state = 0; + @try { + state++; + @try { + state++; + @throw [Super new]; + state = BAD; + } + @catch (Super *e) { + state++; + [e check]; // state++ + @throw; + state = BAD; + } + @finally { + state++; + } + state = BAD; + } + @catch (id e) { + state++; + [e check]; // state++ + [e release]; + } + testassert(state == 7); + + + testprintf("try-catch, no exception\n"); + + state = 0; + @try { + state++; + @try { + state++; + } + @catch (...) { + state = BAD; + } + state++; + } @catch (...) { + state = BAD; + } + testassert(state == 3); + + + testprintf("try-catch, exception not caught\n"); + + state = 0; + @try { + state++; + @try { + state++; + @throw [Super new]; + state = BAD; + } + @catch (Sub *e) { + state = BAD; + } + state = BAD; + } + @catch (id e) { + state++; + [e check]; // state++ + [e release]; + } + testassert(state == 4); + + + testprintf("try-catch, exception caught exactly\n"); + + state = 0; + @try { + state++; + @try { + state++; + @throw [Super new]; + state = BAD; + } + @catch (Super *e) { + state++; + [e check]; // state++ + [e release]; + } + state++; + } + @catch (...) { + state = BAD; + } + testassert(state == 5); + + + testprintf("try-catch, exception caught exactly, rethrown\n"); + + state = 0; + @try { + state++; + @try { + state++; + @throw [Super new]; + state = BAD; + } + @catch (Super *e) { + state++; + [e check]; // state++ + @throw; + state = BAD; + } + state = BAD; + } + @catch (id e) { + state++; + [e check]; // state++ + [e release]; + } + testassert(state == 6); + + + testprintf("try-catch, exception caught exactly, thrown again explicitly\n"); + + state = 0; + @try { + state++; + @try { + state++; + @throw [Super new]; + state = BAD; + } + @catch (Super *e) { + state++; + [e check]; // state++ + @throw e; + state = BAD; + } + state = BAD; + } + @catch (id e) { + state++; + [e check]; // state++ + [e release]; + } + testassert(state == 6); + + + testprintf("try-catch, default catch, rethrown\n"); + + state = 0; + @try { + state++; + @try { + state++; + @throw [Super new]; + state = BAD; + } + @catch (...) { + state++; + @throw; + state = BAD; + } + state = BAD; + } + @catch (id e) { + state++; + [e check]; // state++ + [e release]; + } + testassert(state == 5); + + + testprintf("try-catch, default catch, rethrown and caught inside nested handler\n"); + + state = 0; + @try { + state++; + @try { + state++; + @throw [Super new]; + state = BAD; + } + @catch (...) { + state++; + + @try { + state++; + @throw; + state = BAD; + } @catch (Sub *e) { + state = BAD; + } @catch (Super *e) { + state++; + [e check]; // state++ + [e release]; + } @catch (...) { + state = BAD; + } @finally { + state++; + } + + state++; + } + state++; + } + @catch (...) { + state = BAD; + } + testassert(state == 9); + + + testprintf("try-catch, default catch, rethrown inside nested handler but not caught\n"); + + state = 0; + @try { + state++; + @try { + state++; + @throw [Super new]; + state = BAD; + } + @catch (...) { + state++; + + @try { + state++; + @throw; + state = BAD; + } @catch (Sub *e) { + state = BAD; + } @finally { + state++; + } + + state = BAD; + } + state = BAD; + } + @catch (id e) { + state++; + [e check]; // state++ + [e release]; + } + testassert(state == 7); + +#if __OBJC2__ + // alt handlers + // run a lot to catch failed unregistration (runtime complains at 1000) +#define ALT_HANDLER_REPEAT 2000 + int i; + + testprintf("alt handler, no exception\n"); + + for (i = 0; i < ALT_HANDLER_REPEAT; i++) { + pool(); + + state = 0; + @try { + state++; + @try { + uintptr_t token = objc_addExceptionHandler(altHandlerFail, 0); + state++; + objc_removeExceptionHandler(token); + } + @catch (...) { + state = BAD; + } + state++; + } @catch (...) { + state = BAD; + } + testassert(state == 3); + } + + testprintf("alt handler, exception thrown through\n"); + + for (i = 0; i < ALT_HANDLER_REPEAT; i++) { + pool(); + + state = 0; + @try { + state++; + @try { + state++; + uintptr_t token = objc_addExceptionHandler(altHandler2, altHandler2); + // state++ inside alt handler + @throw [Super new]; + state = BAD; + objc_removeExceptionHandler(token); + } + @catch (Sub *e) { + state = BAD; + } + state = BAD; + } + @catch (id e) { + testassert(state == 3); + state++; + [e check]; // state++ + [e release]; + } + testassert(state == 5); + } + + + testprintf("alt handler, nested\n"); + + for (i = 0; i < ALT_HANDLER_REPEAT; i++) { + pool(); + + state = 0; + @try { + state++; + @try { + state++; + // same-level handlers called in FIFO order (not stack-like) + uintptr_t token = objc_addExceptionHandler(altHandler4, altHandler4); + // state++ inside alt handler + uintptr_t token2 = objc_addExceptionHandler(altHandler5, altHandler5); + // state++ inside alt handler + throwWithAltHandler(); // state += 2 inside + state = BAD; + objc_removeExceptionHandler(token); + objc_removeExceptionHandler(token2); + } + @catch (id e) { + testassert(state == 6); + state++; + [e check]; // state++; + [e release]; + } + state++; + } + @catch (...) { + state = BAD; + } + testassert(state == 9); + } + + + testprintf("alt handler, nested, rethrows in between\n"); + + for (i = 0; i < ALT_HANDLER_REPEAT; i++) { + pool(); + + state = 0; + @try { + state++; + @try { + state++; + // same-level handlers called in FIFO order (not stack-like) + uintptr_t token = objc_addExceptionHandler(altHandler5, altHandler5); + // state++ inside alt handler + uintptr_t token2 = objc_addExceptionHandler(altHandler6, altHandler6); + // state++ inside alt handler + throwWithAltHandlerAndRethrow(); // state += 3 inside + state = BAD; + objc_removeExceptionHandler(token); + objc_removeExceptionHandler(token2); + } + @catch (...) { + testassert(state == 7); + state++; + @throw; + } + state = BAD; + } + @catch (id e) { + testassert(state == 8); + state++; + [e check]; // state++ + [e release]; + } + testassert(state == 10); + } + + + testprintf("alt handler, exception thrown and caught inside\n"); + + for (i = 0; i < ALT_HANDLER_REPEAT; i++) { + pool(); + + state = 0; + @try { + state++; + uintptr_t token = objc_addExceptionHandler(altHandlerFail, 0); + @try { + state++; + @throw [Super new]; + state = BAD; + } + @catch (Super *e) { + state++; + [e check]; // state++ + [e release]; + } + state++; + objc_removeExceptionHandler(token); + } + @catch (...) { + state = BAD; + } + testassert(state == 5); + } + +#endif + +#if defined(USE_FOUNDATION) + [p release]; + succeed("nsexc.m"); +#else + succeed("exc.m"); +#endif +} diff --git a/test/exchangeImp.m b/test/exchangeImp.m new file mode 100644 index 0000000..8649e73 --- /dev/null +++ b/test/exchangeImp.m @@ -0,0 +1,86 @@ +#include "test.h" +#include + +static int state; + +#define ONE 1 +#define TWO 2 +#define LENGTH 3 +#define COUNT 4 + +@interface Super { id isa; } @end +@implementation Super ++class { return self; } ++(void)initialize { } ++(void) one { state = ONE; } ++(void) two { state = TWO; } ++(void) length { state = LENGTH; } ++(void) count { state = COUNT; } +@end + +#define checkExchange(s1, v1, s2, v2) \ + do { \ + Method m1, m2; \ + \ + /* Check unexchanged version */ \ + state = 0; \ + [Super s1]; \ + testassert(state == v1); \ + state = 0; \ + [Super s2]; \ + testassert(state == v2); \ + \ + /* Exchange */ \ + m1 = class_getClassMethod([Super class], @selector(s1)); \ + m2 = class_getClassMethod([Super class], @selector(s2)); \ + testassert(m1); \ + testassert(m2); \ + method_exchangeImplementations(m1, m2); \ + \ + /* Check exchanged version */ \ + state = 0; \ + [Super s1]; \ + testassert(state == v2); \ + state = 0; \ + [Super s2]; \ + testassert(state == v1); \ + \ + /* NULL should do nothing */ \ + method_exchangeImplementations(m1, NULL); \ + method_exchangeImplementations(NULL, m2); \ + method_exchangeImplementations(NULL, NULL); \ + \ + /* Make sure NULL did nothing */ \ + state = 0; \ + [Super s1]; \ + testassert(state == v2); \ + state = 0; \ + [Super s2]; \ + testassert(state == v1); \ + \ + /* Put them back */ \ + method_exchangeImplementations(m1, m2); \ + \ + /* Check restored version */ \ + state = 0; \ + [Super s1]; \ + testassert(state == v1); \ + state = 0; \ + [Super s2]; \ + testassert(state == v2); \ + } while (0) + +int main() +{ + // Check ordinary selectors + checkExchange(one, ONE, two, TWO); + + // Check vtable selectors + checkExchange(length, LENGTH, count, COUNT); + + // Check ordinary<->vtable and vtable<->ordinary + checkExchange(count, COUNT, one, ONE); + checkExchange(two, TWO, length, LENGTH); + + succeed(__FILE__); +} diff --git a/test/fail.m b/test/fail.m new file mode 100644 index 0000000..a0f6755 --- /dev/null +++ b/test/fail.m @@ -0,0 +1,6 @@ +#include "test.h" + +int main() +{ + fail("always fails"); +} diff --git a/test/foreach.m b/test/foreach.m new file mode 100644 index 0000000..c30717e --- /dev/null +++ b/test/foreach.m @@ -0,0 +1,237 @@ + +#import + +/* foreach tester */ + +int Verbosity = 0; +int Errors = 0; + +bool testHandwritten(char *style, char *test, char *message, id collection, NSSet *reference) { + unsigned int counter = 0; + bool result = true; + if (Verbosity) { + printf("testing: %s %s %s\n", style, test, message); + } +/* + for (id elem in collection) + if ([reference member:elem]) ++counter; + */ + NSFastEnumerationState state; + id buffer[4]; + state.state = 0; + NSUInteger limit = [collection countByEnumeratingWithState:&state objects:buffer count:4]; + if (limit != 0) { + unsigned long mutationsPtr = *state.mutationsPtr; + do { + unsigned long innerCounter = 0; + do { + if (mutationsPtr != *state.mutationsPtr) objc_enumerationMutation(collection); + id elem = state.itemsPtr[innerCounter++]; + + if ([reference member:elem]) ++counter; + + } while (innerCounter < limit); + } while ((limit = [collection countByEnumeratingWithState:&state objects:buffer count:4])); + } + + + + if (counter == [reference count]) { + if (Verbosity) { + printf("success: %s %s %s\n", style, test, message); + } + } + else { + result = false; + printf("** failed: %s %s %s (%d vs %d)\n", style, test, message, counter, (int)[reference count]); + ++Errors; + } + return result; +} + +bool testCompiler(char *style, char *test, char *message, id collection, NSSet *reference) { + unsigned int counter = 0; + bool result = true; + if (Verbosity) { + printf("testing: %s %s %s\n", style, test, message); + } + for (id elem in collection) + if ([reference member:elem]) ++counter; + if (counter == [reference count]) { + if (Verbosity) { + printf("success: %s %s %s\n", style, test, message); + } + } + else { + result = false; + printf("** failed: %s %s %s (%d vs %d)\n", style, test, message, counter, (int)[reference count]); + ++Errors; + } + return result; +} + +void testContinue(NSArray *array) { + bool broken = false; + if (Verbosity) { + printf("testing: continue statements\n"); + } + for (id elem in array) { + if ([array count]) + continue; + broken = true; + } + if (broken) { + printf("** continue statement did not work\n"); + ++Errors; + } +} + + +// array is filled with NSNumbers, in order, from 0 - N +bool testBreak(unsigned int where, NSArray *array) { + unsigned int counter = 0; + NSAutoreleasePool *pool = [NSAutoreleasePool new]; + id enumerator = [array objectEnumerator]; + for (id elem in enumerator) { + if (++counter == where) + break; + } + if (counter != where) { + ++Errors; + printf("*** break at %d didn't work (actual was %d)\n", where, counter); + return false; + } + for (id elem in enumerator) + ++counter; + if (counter != [array count]) { + ++Errors; + printf("*** break at %d didn't finish (actual was %d)\n", where, counter); + return false; + } + [pool drain]; + return true; +} + +bool testBreaks(NSArray *array) { + bool result = true; + if (Verbosity) printf("testing breaks\n"); + unsigned int counter = 0; + for (counter = 1; counter < [array count]; ++counter) { + result = testBreak(counter, array) && result; + } + return result; +} + +bool testCompleteness(char *test, char *message, id collection, NSSet *reference) { + bool result = true; + result = result && testHandwritten("handwritten", test, message, collection, reference); + result = result && testCompiler("compiler", test, message, collection, reference); + return result; +} + +bool testEnumerator(char *test, char *message, id collection, NSSet *reference) { + bool result = true; + result = result && testHandwritten("handwritten", test, message, [collection objectEnumerator], reference); + result = result && testCompiler("compiler", test, message, [collection objectEnumerator], reference); + return result; +} + +NSMutableSet *ReferenceSet = nil; +NSMutableArray *ReferenceArray = nil; + +void makeReferences(int n) { + if (!ReferenceSet) { + int i; + ReferenceSet = [[NSMutableSet alloc] init]; + ReferenceArray = [[NSMutableArray alloc] init]; + for (i = 0; i < n; ++i) { + NSNumber *number = [[NSNumber alloc] initWithInt:i]; + [ReferenceSet addObject:number]; + [ReferenceArray addObject:number]; + [number release]; + } + } +} + +void testCollections(char *test, NSArray *array, NSSet *set) { + NSAutoreleasePool *pool = [NSAutoreleasePool new]; + id collection; + collection = [NSMutableArray arrayWithArray:array]; + testCompleteness(test, "mutable array", collection, set); + testEnumerator(test, "mutable array enumerator", collection, set); + collection = [NSArray arrayWithArray:array]; + testCompleteness(test, "immutable array", collection, set); + testEnumerator(test, "immutable array enumerator", collection, set); + collection = set; + testCompleteness(test, "immutable set", collection, set); + testEnumerator(test, "immutable set enumerator", collection, set); + collection = [NSMutableSet setWithArray:array]; + testCompleteness(test, "mutable set", collection, set); + testEnumerator(test, "mutable set enumerator", collection, set); + [pool drain]; +} + +void testInnerDecl(char *test, char *message, id collection) { + unsigned int counter = 0; + for (id x in collection) + ++counter; + if (counter != [collection count]) { + printf("** failed: %s %s\n", test, message); + ++Errors; + } +} + + +void testOuterDecl(char *test, char *message, id collection) { + unsigned int counter = 0; + id x; + for (x in collection) + ++counter; + if (counter != [collection count]) { + printf("** failed: %s %s\n", test, message); + ++Errors; + } +} +void testInnerExpression(char *test, char *message, id collection) { + unsigned int counter = 0; + for (id x in [collection self]) + ++counter; + if (counter != [collection count]) { + printf("** failed: %s %s\n", test, message); + ++Errors; + } +} +void testOuterExpression(char *test, char *message, id collection) { + unsigned int counter = 0; + id x; + for (x in [collection self]) + ++counter; + if (counter != [collection count]) { + printf("** failed: %s %s\n", test, message); + ++Errors; + } +} + +void testExpressions(char *message, id collection) { + testInnerDecl("inner", message, collection); + testOuterDecl("outer", message, collection); + testInnerExpression("outer expression", message, collection); + testOuterExpression("outer expression", message, collection); +} + + +int main() { + Verbosity = (getenv("VERBOSE") != NULL); + NSAutoreleasePool *pool = [NSAutoreleasePool new]; + testCollections("nil", nil, nil); + testCollections("empty", [NSArray array], [NSSet set]); + makeReferences(100); + testCollections("100 item", ReferenceArray, ReferenceSet); + testExpressions("array", ReferenceArray); + testBreaks(ReferenceArray); + testContinue(ReferenceArray); + if (Errors == 0) printf("OK: foreach\n"); + else printf("BAD: foreach %d errors detected\n", Errors); + [pool drain]; + exit(Errors); +} diff --git a/test/forward.m b/test/forward.m new file mode 100644 index 0000000..741dca8 --- /dev/null +++ b/test/forward.m @@ -0,0 +1,639 @@ +#include "test.h" +#include +#include + +extern void _objc_flush_caches(Class cls, BOOL flushMeta); + +struct stret { + int a; + int b; + int c; + int d; + int e; + int pad[100]; // force stack return on ppc64 +}; + +BOOL stret_equal(struct stret a, struct stret b) +{ + return (a.a == b.a && + a.b == b.b && + a.c == b.c && + a.d == b.d && + a.e == b.e); +} + +id ID_RESULT = (id)0x12345678; +long long LL_RESULT = __LONG_LONG_MAX__ - 2LL*__INT_MAX__; +struct stret STRET_RESULT = {1, 2, 3, 4, 5, {0}}; +double FP_RESULT = __DBL_MIN__ + __DBL_EPSILON__; +long double LFP_RESULT = __LDBL_MIN__ + __LDBL_EPSILON__; + + +static int state = 0; +static id receiver; + +@interface Super { id isa; } @end + +@interface Super (Forwarded) ++(id)idret: + (long)i1:(long)i2:(long)i3:(long)i4:(long)i5:(long)i6:(long)i7:(long)i8:(long)i9:(long)i10:(long)i11:(long)i12:(long)i13 :(double)f1:(double)f2:(double)f3:(double)f4:(double)f5:(double)f6:(double)f7:(double)f8:(double)f9:(double)f10:(double)f11:(double)f12:(double)f13:(double)f14:(double)f15; + ++(id)idre2: + (long)i1:(long)i2:(long)i3:(long)i4:(long)i5:(long)i6:(long)i7:(long)i8:(long)i9:(long)i10:(long)i11:(long)i12:(long)i13 :(double)f1:(double)f2:(double)f3:(double)f4:(double)f5:(double)f6:(double)f7:(double)f8:(double)f9:(double)f10:(double)f11:(double)f12:(double)f13:(double)f14:(double)f15; + ++(id)idre3: + (long)i1:(long)i2:(long)i3:(long)i4:(long)i5:(long)i6:(long)i7:(long)i8:(long)i9:(long)i10:(long)i11:(long)i12:(long)i13 :(double)f1:(double)f2:(double)f3:(double)f4:(double)f5:(double)f6:(double)f7:(double)f8:(double)f9:(double)f10:(double)f11:(double)f12:(double)f13:(double)f14:(double)f15; + ++(long long)llret: + (long)i1:(long)i2:(long)i3:(long)i4:(long)i5:(long)i6:(long)i7:(long)i8:(long)i9:(long)i10:(long)i11:(long)i12:(long)i13 :(double)f1:(double)f2:(double)f3:(double)f4:(double)f5:(double)f6:(double)f7:(double)f8:(double)f9:(double)f10:(double)f11:(double)f12:(double)f13:(double)f14:(double)f15; + ++(long long)llre2: + (long)i1:(long)i2:(long)i3:(long)i4:(long)i5:(long)i6:(long)i7:(long)i8:(long)i9:(long)i10:(long)i11:(long)i12:(long)i13 :(double)f1:(double)f2:(double)f3:(double)f4:(double)f5:(double)f6:(double)f7:(double)f8:(double)f9:(double)f10:(double)f11:(double)f12:(double)f13:(double)f14:(double)f15; + ++(long long)llre3: + (long)i1:(long)i2:(long)i3:(long)i4:(long)i5:(long)i6:(long)i7:(long)i8:(long)i9:(long)i10:(long)i11:(long)i12:(long)i13 :(double)f1:(double)f2:(double)f3:(double)f4:(double)f5:(double)f6:(double)f7:(double)f8:(double)f9:(double)f10:(double)f11:(double)f12:(double)f13:(double)f14:(double)f15; + ++(struct stret)stret: + (long)i1:(long)i2:(long)i3:(long)i4:(long)i5:(long)i6:(long)i7:(long)i8:(long)i9:(long)i10:(long)i11:(long)i12:(long)i13 :(double)f1:(double)f2:(double)f3:(double)f4:(double)f5:(double)f6:(double)f7:(double)f8:(double)f9:(double)f10:(double)f11:(double)f12:(double)f13:(double)f14:(double)f15; + ++(struct stret)stre2: + (long)i1:(long)i2:(long)i3:(long)i4:(long)i5:(long)i6:(long)i7:(long)i8:(long)i9:(long)i10:(long)i11:(long)i12:(long)i13 :(double)f1:(double)f2:(double)f3:(double)f4:(double)f5:(double)f6:(double)f7:(double)f8:(double)f9:(double)f10:(double)f11:(double)f12:(double)f13:(double)f14:(double)f15; + ++(struct stret)stre3: + (long)i1:(long)i2:(long)i3:(long)i4:(long)i5:(long)i6:(long)i7:(long)i8:(long)i9:(long)i10:(long)i11:(long)i12:(long)i13 :(double)f1:(double)f2:(double)f3:(double)f4:(double)f5:(double)f6:(double)f7:(double)f8:(double)f9:(double)f10:(double)f11:(double)f12:(double)f13:(double)f14:(double)f15; + ++(double)fpret: + (long)i1:(long)i2:(long)i3:(long)i4:(long)i5:(long)i6:(long)i7:(long)i8:(long)i9:(long)i10:(long)i11:(long)i12:(long)i13 :(double)f1:(double)f2:(double)f3:(double)f4:(double)f5:(double)f6:(double)f7:(double)f8:(double)f9:(double)f10:(double)f11:(double)f12:(double)f13:(double)f14:(double)f15; + ++(double)fpre2: + (long)i1:(long)i2:(long)i3:(long)i4:(long)i5:(long)i6:(long)i7:(long)i8:(long)i9:(long)i10:(long)i11:(long)i12:(long)i13 :(double)f1:(double)f2:(double)f3:(double)f4:(double)f5:(double)f6:(double)f7:(double)f8:(double)f9:(double)f10:(double)f11:(double)f12:(double)f13:(double)f14:(double)f15; + ++(double)fpre3: + (long)i1:(long)i2:(long)i3:(long)i4:(long)i5:(long)i6:(long)i7:(long)i8:(long)i9:(long)i10:(long)i11:(long)i12:(long)i13 :(double)f1:(double)f2:(double)f3:(double)f4:(double)f5:(double)f6:(double)f7:(double)f8:(double)f9:(double)f10:(double)f11:(double)f12:(double)f13:(double)f14:(double)f15; + +@end + + +long long forward_handler(id self, SEL _cmd, long i1, long i2, long i3, long i4, long i5, long i6, long i7, long i8, long i9, long i10, long i11, long i12, long i13, double f1, double f2, double f3, double f4, double f5, double f6, double f7, double f8, double f9, double f10, double f11, double f12, double f13, double f14, double f15) +{ + testassert(self == receiver); + + testassert(i1 == 1); + testassert(i2 == 2); + testassert(i3 == 3); + testassert(i4 == 4); + testassert(i5 == 5); + testassert(i6 == 6); + testassert(i7 == 7); + testassert(i8 == 8); + testassert(i9 == 9); + testassert(i10 == 10); + testassert(i11 == 11); + testassert(i12 == 12); + testassert(i13 == 13); + + testassert(f1 == 1.0); + testassert(f2 == 2.0); + testassert(f3 == 3.0); + testassert(f4 == 4.0); + testassert(f5 == 5.0); + testassert(f6 == 6.0); + testassert(f7 == 7.0); + testassert(f8 == 8.0); + testassert(f9 == 9.0); + testassert(f10 == 10.0); + testassert(f11 == 11.0); + testassert(f12 == 12.0); + testassert(f13 == 13.0); + testassert(f14 == 14.0); + testassert(f15 == 15.0); + + if (_cmd == @selector(idret::::::::::::::::::::::::::::) || + _cmd == @selector(idre2::::::::::::::::::::::::::::) || + _cmd == @selector(idre3::::::::::::::::::::::::::::)) + { + union { + id idval; + long long llval; + } result; + testassert(state == 11); + state = 12; + result.idval = ID_RESULT; + return result.llval; + } else if (_cmd == @selector(llret::::::::::::::::::::::::::::) || + _cmd == @selector(llre2::::::::::::::::::::::::::::) || + _cmd == @selector(llre3::::::::::::::::::::::::::::)) + { + testassert(state == 13); + state = 14; + return LL_RESULT; + } else if (_cmd == @selector(fpret::::::::::::::::::::::::::::) || + _cmd == @selector(fpre2::::::::::::::::::::::::::::) || + _cmd == @selector(fpre3::::::::::::::::::::::::::::)) + { + testassert(state == 15); + state = 16; +#if defined(__ppc__) || defined(__ppc64__) + __asm__ volatile("lfd f1,%0" : : "m" (FP_RESULT)); +#elif defined(__i386__) + __asm__ volatile("fldl %0" : : "m" (FP_RESULT)); +#elif defined(__x86_64__) + __asm__ volatile("movsd %0, %%xmm0" : : "m" (FP_RESULT)); +#elif defined(__arm__) + union { + double fpval; + long long llval; + } result; + result.fpval = FP_RESULT; + return result.llval; +#else +# error unknown architecture +#endif + return 0; + } else if (_cmd == @selector(stret::::::::::::::::::::::::::::) || + _cmd == @selector(stre2::::::::::::::::::::::::::::) || + _cmd == @selector(stre3::::::::::::::::::::::::::::)) + { + fail("stret message sent to non-stret forward_handler"); + } else { + fail("unknown selector %s in forward_handler", sel_getName(_cmd)); + } +} + + +struct stret forward_stret_handler(id self, SEL _cmd, long i1, long i2, long i3, long i4, long i5, long i6, long i7, long i8, long i9, long i10, long i11, long i12, long i13, double f1, double f2, double f3, double f4, double f5, double f6, double f7, double f8, double f9, double f10, double f11, double f12, double f13, double f14, double f15) +{ + testassert(self == receiver); + + testassert(i1 == 1); + testassert(i2 == 2); + testassert(i3 == 3); + testassert(i4 == 4); + testassert(i5 == 5); + testassert(i6 == 6); + testassert(i7 == 7); + testassert(i8 == 8); + testassert(i9 == 9); + testassert(i10 == 10); + testassert(i11 == 11); + testassert(i12 == 12); + testassert(i13 == 13); + + testassert(f1 == 1.0); + testassert(f2 == 2.0); + testassert(f3 == 3.0); + testassert(f4 == 4.0); + testassert(f5 == 5.0); + testassert(f6 == 6.0); + testassert(f7 == 7.0); + testassert(f8 == 8.0); + testassert(f9 == 9.0); + testassert(f10 == 10.0); + testassert(f11 == 11.0); + testassert(f12 == 12.0); + testassert(f13 == 13.0); + testassert(f14 == 14.0); + testassert(f15 == 15.0); + + if (_cmd == @selector(idret::::::::::::::::::::::::::::) || + _cmd == @selector(idre2::::::::::::::::::::::::::::) || + _cmd == @selector(idre3::::::::::::::::::::::::::::) || + _cmd == @selector(llret::::::::::::::::::::::::::::) || + _cmd == @selector(llre2::::::::::::::::::::::::::::) || + _cmd == @selector(llre3::::::::::::::::::::::::::::) || + _cmd == @selector(fpret::::::::::::::::::::::::::::) || + _cmd == @selector(fpre2::::::::::::::::::::::::::::) || + _cmd == @selector(fpre3::::::::::::::::::::::::::::)) + { + fail("non-stret selector %s sent to forward_stret_handler", sel_getName(_cmd)); + } else if (_cmd == @selector(stret::::::::::::::::::::::::::::) || + _cmd == @selector(stre2::::::::::::::::::::::::::::) || + _cmd == @selector(stre3::::::::::::::::::::::::::::)) + { + testassert(state == 17); + state = 18; + return STRET_RESULT; + } else { + fail("unknown selector %s in forward::", sel_getName(_cmd)); + } + +} + +@implementation Super ++(void)initialize { } ++class { return self; } + +-(long long) forward:(SEL)sel :(marg_list)args +{ + char *p; + uintptr_t *gp; + double *fp; + struct stret *struct_addr; + +#if defined(__i386__) + struct_addr = ((struct stret **)args)[-1]; +#elif defined(__ppc__) + struct_addr = *(struct stret **)((char *)args + 128); +#elif defined(__ppc64__) + struct_addr = *(struct stret **)((char *)args + 152); +#elif defined(__x86_64__) + struct_addr = *(struct stret **)((char *)args + 8*16+4*8); +#elif defined(__arm__) + struct_addr = *(struct stret **)((char *)args + 0); +#else +# error unknown architecture +#endif + + testassert(self == receiver); + testassert(_cmd == sel_registerName("forward::")); + + p = args; +#if defined(__ppc__) || defined(__ppc64__) + p += 13*sizeof(double) + 6*sizeof(void*); // skip over fp and linkage + if (sel == @selector(stret::::::::::::::::::::::::::::) || + sel == @selector(stre2::::::::::::::::::::::::::::) || + sel == @selector(stre3::::::::::::::::::::::::::::)) + { + p += sizeof(void *); // struct return + } +#elif defined(__x86_64__) + p += 8*16 + 4*8; // skip over xmm and linkage + if (sel == @selector(stret::::::::::::::::::::::::::::) || + sel == @selector(stre2::::::::::::::::::::::::::::) || + sel == @selector(stre3::::::::::::::::::::::::::::)) + { + p += sizeof(void *); // struct return + } +#elif defined(__i386__) + // nothing to do +#elif defined(__arm__) + if (sel == @selector(stret::::::::::::::::::::::::::::) || + sel == @selector(stre2::::::::::::::::::::::::::::) || + sel == @selector(stre3::::::::::::::::::::::::::::)) + { + p += sizeof(void *); // struct return; + } +#else +# error unknown architecture +#endif + gp = (uintptr_t *)p; + testassert(*gp++ == (uintptr_t)self); + testassert(*gp++ == (uintptr_t)sel); + testassert(*gp++ == 1); + testassert(*gp++ == 2); + testassert(*gp++ == 3); + testassert(*gp++ == 4); + testassert(*gp++ == 5); + testassert(*gp++ == 6); + testassert(*gp++ == 7); + testassert(*gp++ == 8); + testassert(*gp++ == 9); + testassert(*gp++ == 10); + testassert(*gp++ == 11); + testassert(*gp++ == 12); + testassert(*gp++ == 13); + +#if defined(__i386__) || defined(__ppc__) || defined(__ppc64__) || defined(__arm__) + +# if defined(__ppc__) || defined(__ppc64__) + fp = (double *)args; +# elif defined(__i386__) || defined(__arm__) + fp = (double *)gp; +# else +# error unknown architecture +# endif + testassert(*fp++ == 1.0); + testassert(*fp++ == 2.0); + testassert(*fp++ == 3.0); + testassert(*fp++ == 4.0); + testassert(*fp++ == 5.0); + testassert(*fp++ == 6.0); + testassert(*fp++ == 7.0); + testassert(*fp++ == 8.0); + testassert(*fp++ == 9.0); + testassert(*fp++ == 10.0); + testassert(*fp++ == 11.0); + testassert(*fp++ == 12.0); + testassert(*fp++ == 13.0); +# if defined(__ppc__) || defined(__ppc64__) + fp = 13 + (double *)gp; +# endif + testassert(*fp++ == 14.0); + testassert(*fp++ == 15.0); + +#elif defined(__x86_64__) + + fp = args; // xmm, double-wide + testassert(*fp++ == 1.0); fp++; + testassert(*fp++ == 2.0); fp++; + testassert(*fp++ == 3.0); fp++; + testassert(*fp++ == 4.0); fp++; + testassert(*fp++ == 5.0); fp++; + testassert(*fp++ == 6.0); fp++; + testassert(*fp++ == 7.0); fp++; + testassert(*fp++ == 8.0); fp++; + fp = (double *)gp; + testassert(*fp++ == 9.0); + testassert(*fp++ == 10.0); + testassert(*fp++ == 11.0); + testassert(*fp++ == 12.0); + testassert(*fp++ == 13.0); + testassert(*fp++ == 14.0); + testassert(*fp++ == 15.0); + +#else +# error unknown architecture +#endif + + if (sel == @selector(idret::::::::::::::::::::::::::::) || + sel == @selector(idre2::::::::::::::::::::::::::::) || + sel == @selector(idre3::::::::::::::::::::::::::::)) + { + union { + id idval; + long long llval; + } result; + testassert(state == 1); + state = 2; + result.idval = ID_RESULT; + return result.llval; + } else if (sel == @selector(llret::::::::::::::::::::::::::::) || + sel == @selector(llre2::::::::::::::::::::::::::::) || + sel == @selector(llre3::::::::::::::::::::::::::::)) + { + testassert(state == 3); + state = 4; + return LL_RESULT; + } else if (sel == @selector(fpret::::::::::::::::::::::::::::) || + sel == @selector(fpre2::::::::::::::::::::::::::::) || + sel == @selector(fpre3::::::::::::::::::::::::::::)) + { + testassert(state == 5); + state = 6; +#if defined(__ppc__) || defined(__ppc64__) + __asm__ volatile("lfd f1,%0" : : "m" (FP_RESULT)); +#elif defined(__i386__) + __asm__ volatile("fldl %0" : : "m" (FP_RESULT)); +#elif defined(__x86_64__) + __asm__ volatile("movsd %0, %%xmm0" : : "m" (FP_RESULT)); +#elif defined(__arm__) + union { + double fpval; + long long llval; + } result; + result.fpval = FP_RESULT; + return result.llval; +#else +# error unknown architecture +#endif + return 0; + } else if (sel == @selector(stret::::::::::::::::::::::::::::) || + sel == @selector(stre2::::::::::::::::::::::::::::) || + sel == @selector(stre3::::::::::::::::::::::::::::)) + { + testassert(state == 7); + state = 8; + *struct_addr = STRET_RESULT; + return 0; + } else { + fail("unknown selector %s in forward::", sel_getName(sel)); + } + return 0; +} + +@end + +typedef id (*id_fn_t)(id self, SEL _cmd, long i1, long i2, long i3, long i4, long i5, long i6, long i7, long i8, long i9, long i10, long i11, long i12, long i13, double f1, double f2, double f3, double f4, double f5, double f6, double f7, double f8, double f9, double f10, double f11, double f12, double f13, double f14, double f15); + +typedef long long (*ll_fn_t)(id self, SEL _cmd, long i1, long i2, long i3, long i4, long i5, long i6, long i7, long i8, long i9, long i10, long i11, long i12, long i13, double f1, double f2, double f3, double f4, double f5, double f6, double f7, double f8, double f9, double f10, double f11, double f12, double f13, double f14, double f15); + +typedef double (*fp_fn_t)(id self, SEL _cmd, long i1, long i2, long i3, long i4, long i5, long i6, long i7, long i8, long i9, long i10, long i11, long i12, long i13, double f1, double f2, double f3, double f4, double f5, double f6, double f7, double f8, double f9, double f10, double f11, double f12, double f13, double f14, double f15); + +typedef struct stret (*st_fn_t)(id self, SEL _cmd, long i1, long i2, long i3, long i4, long i5, long i6, long i7, long i8, long i9, long i10, long i11, long i12, long i13, double f1, double f2, double f3, double f4, double f5, double f6, double f7, double f8, double f9, double f10, double f11, double f12, double f13, double f14, double f15); + +int main() +{ + id idval; + long long llval; + struct stret stval; + double fpval; + + receiver = [Super class]; + + // Test default forward handler + + state = 1; + idval = [Super idret:1:2:3:4:5:6:7:8:9:10:11:12:13:1.0:2.0:3.0:4.0:5.0:6.0:7.0:8.0:9.0:10.0:11.0:12.0:13.0:14.0:15.0]; + testassert(state == 2); + testassert(idval == ID_RESULT); + + state = 3; + llval = [Super llret:1:2:3:4:5:6:7:8:9:10:11:12:13:1.0:2.0:3.0:4.0:5.0:6.0:7.0:8.0:9.0:10.0:11.0:12.0:13.0:14.0:15.0]; + testassert(state == 4); + testassert(llval == LL_RESULT); + + state = 5; + fpval = [Super fpret:1:2:3:4:5:6:7:8:9:10:11:12:13:1.0:2.0:3.0:4.0:5.0:6.0:7.0:8.0:9.0:10.0:11.0:12.0:13.0:14.0:15.0]; + testassert(state == 6); + testassert(fpval == FP_RESULT); + + state = 7; + stval = [Super stret:1:2:3:4:5:6:7:8:9:10:11:12:13:1.0:2.0:3.0:4.0:5.0:6.0:7.0:8.0:9.0:10.0:11.0:12.0:13.0:14.0:15.0]; + testassert(state == 8); + testassert(stret_equal(stval, STRET_RESULT)); + + + // Test default forward handler, cached + + state = 1; + idval = [Super idret:1:2:3:4:5:6:7:8:9:10:11:12:13:1.0:2.0:3.0:4.0:5.0:6.0:7.0:8.0:9.0:10.0:11.0:12.0:13.0:14.0:15.0]; + testassert(state == 2); + testassert(idval == ID_RESULT); + + state = 3; + llval = [Super llret:1:2:3:4:5:6:7:8:9:10:11:12:13:1.0:2.0:3.0:4.0:5.0:6.0:7.0:8.0:9.0:10.0:11.0:12.0:13.0:14.0:15.0]; + testassert(state == 4); + testassert(llval == LL_RESULT); + + state = 5; + fpval = [Super fpret:1:2:3:4:5:6:7:8:9:10:11:12:13:1.0:2.0:3.0:4.0:5.0:6.0:7.0:8.0:9.0:10.0:11.0:12.0:13.0:14.0:15.0]; + testassert(state == 6); + testassert(fpval == FP_RESULT); + + state = 7; + stval = [Super stret:1:2:3:4:5:6:7:8:9:10:11:12:13:1.0:2.0:3.0:4.0:5.0:6.0:7.0:8.0:9.0:10.0:11.0:12.0:13.0:14.0:15.0]; + testassert(state == 8); + testassert(stret_equal(stval, STRET_RESULT)); + + + // Test default forward handler, uncached but fixed-up + + _objc_flush_caches(nil, YES); + + state = 1; + idval = [Super idret:1:2:3:4:5:6:7:8:9:10:11:12:13:1.0:2.0:3.0:4.0:5.0:6.0:7.0:8.0:9.0:10.0:11.0:12.0:13.0:14.0:15.0]; + testassert(state == 2); + testassert(idval == ID_RESULT); + + state = 3; + llval = [Super llret:1:2:3:4:5:6:7:8:9:10:11:12:13:1.0:2.0:3.0:4.0:5.0:6.0:7.0:8.0:9.0:10.0:11.0:12.0:13.0:14.0:15.0]; + testassert(state == 4); + testassert(llval == LL_RESULT); + + state = 5; + fpval = [Super fpret:1:2:3:4:5:6:7:8:9:10:11:12:13:1.0:2.0:3.0:4.0:5.0:6.0:7.0:8.0:9.0:10.0:11.0:12.0:13.0:14.0:15.0]; + testassert(state == 6); + testassert(fpval == FP_RESULT); + + state = 7; + stval = [Super stret:1:2:3:4:5:6:7:8:9:10:11:12:13:1.0:2.0:3.0:4.0:5.0:6.0:7.0:8.0:9.0:10.0:11.0:12.0:13.0:14.0:15.0]; + testassert(state == 8); + testassert(stret_equal(stval, STRET_RESULT)); + + + // Test manual forwarding + + state = 1; + idval = ((id_fn_t)_objc_msgForward)(receiver, @selector(idre2::::::::::::::::::::::::::::), 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0); + testassert(state == 2); + testassert(idval == ID_RESULT); + + state = 3; + llval = ((ll_fn_t)_objc_msgForward)(receiver, @selector(llre2::::::::::::::::::::::::::::), 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0); + testassert(state == 4); + testassert(llval == LL_RESULT); + + state = 5; + fpval = ((fp_fn_t)_objc_msgForward)(receiver, @selector(fpre2::::::::::::::::::::::::::::), 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0); + testassert(state == 6); + testassert(fpval == FP_RESULT); + + state = 7; + stval = ((st_fn_t)_objc_msgForward_stret)(receiver, @selector(stre2::::::::::::::::::::::::::::), 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0); + testassert(state == 8); + testassert(stret_equal(stval, STRET_RESULT)); + + + // Test manual forwarding, cached + + state = 1; + idval = ((id_fn_t)_objc_msgForward)(receiver, @selector(idre2::::::::::::::::::::::::::::), 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0); + testassert(state == 2); + testassert(idval == ID_RESULT); + + state = 3; + llval = ((ll_fn_t)_objc_msgForward)(receiver, @selector(llre2::::::::::::::::::::::::::::), 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0); + testassert(state == 4); + testassert(llval == LL_RESULT); + + state = 5; + fpval = ((fp_fn_t)_objc_msgForward)(receiver, @selector(fpre2::::::::::::::::::::::::::::), 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0); + testassert(state == 6); + testassert(fpval == FP_RESULT); + + state = 7; + stval = ((st_fn_t)_objc_msgForward_stret)(receiver, @selector(stre2::::::::::::::::::::::::::::), 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0); + testassert(state == 8); + testassert(stret_equal(stval, STRET_RESULT)); + + + // Test manual forwarding, uncached but fixed-up + + _objc_flush_caches(nil, YES); + + state = 1; + idval = ((id_fn_t)_objc_msgForward)(receiver, @selector(idre2::::::::::::::::::::::::::::), 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0); + testassert(state == 2); + testassert(idval == ID_RESULT); + + state = 3; + llval = ((ll_fn_t)_objc_msgForward)(receiver, @selector(llre2::::::::::::::::::::::::::::), 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0); + testassert(state == 4); + testassert(llval == LL_RESULT); + + state = 5; + fpval = ((fp_fn_t)_objc_msgForward)(receiver, @selector(fpre2::::::::::::::::::::::::::::), 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0); + testassert(state == 6); + testassert(fpval == FP_RESULT); + + state = 7; + stval = ((st_fn_t)_objc_msgForward_stret)(receiver, @selector(stre2::::::::::::::::::::::::::::), 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0); + testassert(state == 8); + testassert(stret_equal(stval, STRET_RESULT)); + + + // Test user-defined forward handler + + objc_setForwardHandler(&forward_handler, &forward_stret_handler); + + state = 11; + idval = [Super idre3:1:2:3:4:5:6:7:8:9:10:11:12:13:1.0:2.0:3.0:4.0:5.0:6.0:7.0:8.0:9.0:10.0:11.0:12.0:13.0:14.0:15.0]; + testassert(state == 12); + testassert(idval == ID_RESULT); + + state = 13; + llval = [Super llre3:1:2:3:4:5:6:7:8:9:10:11:12:13:1.0:2.0:3.0:4.0:5.0:6.0:7.0:8.0:9.0:10.0:11.0:12.0:13.0:14.0:15.0]; + testassert(state == 14); + testassert(llval == LL_RESULT); + + state = 15; + fpval = [Super fpre3:1:2:3:4:5:6:7:8:9:10:11:12:13:1.0:2.0:3.0:4.0:5.0:6.0:7.0:8.0:9.0:10.0:11.0:12.0:13.0:14.0:15.0]; + testassert(state == 16); + testassert(fpval == FP_RESULT); + + state = 17; + stval = [Super stre3:1:2:3:4:5:6:7:8:9:10:11:12:13:1.0:2.0:3.0:4.0:5.0:6.0:7.0:8.0:9.0:10.0:11.0:12.0:13.0:14.0:15.0]; + testassert(state == 18); + testassert(stret_equal(stval, STRET_RESULT)); + + + // Test user-defined forward handler, cached + + state = 11; + idval = [Super idre3:1:2:3:4:5:6:7:8:9:10:11:12:13:1.0:2.0:3.0:4.0:5.0:6.0:7.0:8.0:9.0:10.0:11.0:12.0:13.0:14.0:15.0]; + testassert(state == 12); + testassert(idval == ID_RESULT); + + state = 13; + llval = [Super llre3:1:2:3:4:5:6:7:8:9:10:11:12:13:1.0:2.0:3.0:4.0:5.0:6.0:7.0:8.0:9.0:10.0:11.0:12.0:13.0:14.0:15.0]; + testassert(state == 14); + testassert(llval == LL_RESULT); + + state = 15; + fpval = [Super fpre3:1:2:3:4:5:6:7:8:9:10:11:12:13:1.0:2.0:3.0:4.0:5.0:6.0:7.0:8.0:9.0:10.0:11.0:12.0:13.0:14.0:15.0]; + testassert(state == 16); + testassert(fpval == FP_RESULT); + + state = 17; + stval = [Super stre3:1:2:3:4:5:6:7:8:9:10:11:12:13:1.0:2.0:3.0:4.0:5.0:6.0:7.0:8.0:9.0:10.0:11.0:12.0:13.0:14.0:15.0]; + testassert(state == 18); + testassert(stret_equal(stval, STRET_RESULT)); + + + // Test user-defined forward handler, uncached but fixed-up + + _objc_flush_caches(nil, YES); + + state = 11; + idval = [Super idre3:1:2:3:4:5:6:7:8:9:10:11:12:13:1.0:2.0:3.0:4.0:5.0:6.0:7.0:8.0:9.0:10.0:11.0:12.0:13.0:14.0:15.0]; + testassert(state == 12); + testassert(idval == ID_RESULT); + + state = 13; + llval = [Super llre3:1:2:3:4:5:6:7:8:9:10:11:12:13:1.0:2.0:3.0:4.0:5.0:6.0:7.0:8.0:9.0:10.0:11.0:12.0:13.0:14.0:15.0]; + testassert(state == 14); + testassert(llval == LL_RESULT); + + state = 15; + fpval = [Super fpre3:1:2:3:4:5:6:7:8:9:10:11:12:13:1.0:2.0:3.0:4.0:5.0:6.0:7.0:8.0:9.0:10.0:11.0:12.0:13.0:14.0:15.0]; + testassert(state == 16); + testassert(fpval == FP_RESULT); + + state = 17; + stval = [Super stre3:1:2:3:4:5:6:7:8:9:10:11:12:13:1.0:2.0:3.0:4.0:5.0:6.0:7.0:8.0:9.0:10.0:11.0:12.0:13.0:14.0:15.0]; + testassert(state == 18); + testassert(stret_equal(stval, STRET_RESULT)); + + + succeed(__FILE__); +} diff --git a/test/future.h b/test/future.h new file mode 100644 index 0000000..71470cd --- /dev/null +++ b/test/future.h @@ -0,0 +1,19 @@ +#include "test.h" + +@interface Super { id isa; } ++class; +@end + +@interface Sub1 : Super ++(int)method; ++(Class)classref; +@end + +@interface Sub2 : Super ++(int)method; ++(Class)classref; +@end + +@interface SubSub1 : Sub1 @end + +@interface SubSub2 : Sub2 @end diff --git a/test/future0.m b/test/future0.m new file mode 100644 index 0000000..c9aef34 --- /dev/null +++ b/test/future0.m @@ -0,0 +1,7 @@ +#include "future.h" + +@implementation Super ++class { return self; } ++(void)initialize { } +@end + diff --git a/test/future1.m b/test/future1.m new file mode 100644 index 0000000..1423a5f --- /dev/null +++ b/test/future1.m @@ -0,0 +1,86 @@ +#include "test.h" +#include +#include +#include +#include +#include "future.h" + +@implementation Sub2 ++(int)method { + return 2; +} ++(Class)classref { + return [Sub2 class]; +} +@end + +@implementation SubSub2 ++(int)method { + return 1 + [super method]; +} +@end + +int main() +{ + Class oldSuper; + Class oldSub1; + Class newSub1; +#if !__OBJC2__ + Class oldSub2; + Class newSub2; + uintptr_t buf[20]; +#endif + + // objc_getFutureClass with existing class + oldSuper = objc_getFutureClass("Super"); + testassert(oldSuper == [Super class]); + + // objc_getFutureClass with missing class + oldSub1 = objc_getFutureClass("Sub1"); + testassert(oldSub1); + testassert(malloc_size(oldSub1) > 0); + testassert(objc_getClass("Sub1") == Nil); + + // objc_getFutureClass a second time + testassert(oldSub1 == objc_getFutureClass("Sub1")); + +#if !__OBJC2__ + // objc_setFutureClass with existing class + oldSub2 = objc_getClass("Sub2"); + testassert(oldSub2 == [Sub2 class]); + testassert(oldSub2 == class_getSuperclass(objc_getClass("SubSub2"))); + objc_setFutureClass((Class)buf, "Sub2"); + testassert(0 == strcmp(class_getName((Class)buf), "Sub2")); + newSub2 = objc_getClass("Sub2"); + testassert(newSub2 == (Class)buf); + testassert(newSub2 != oldSub2); + // check classrefs + testassert(newSub2 == [Sub2 class]); + testassert(newSub2 == [newSub2 class]); + testassert(newSub2 == [newSub2 classref]); + testassert(newSub2 != [oldSub2 class]); + // check superclass chains + testassert(newSub2 == class_getSuperclass(objc_getClass("SubSub2"))); +#else + // 64-bit ABI ignores objc_setFutureClass. +#endif + + // Load class Sub1 + dlopen("future2.out", 0); + + // Verify use of future class + newSub1 = objc_getClass("Sub1"); + testassert(oldSub1 == newSub1); + testassert(newSub1 == [newSub1 classref]); + testassert(newSub1 == class_getSuperclass(objc_getClass("SubSub1"))); + + testassert(1 == [oldSub1 method]); + testassert(1 == [newSub1 method]); +#if !__OBJC2__ + testassert(2 == [newSub2 method]); + testassert(2 == [oldSub2 method]); + testassert(3 == [SubSub2 method]); +#endif + + succeed(__FILE__); +} diff --git a/test/future2.m b/test/future2.m new file mode 100644 index 0000000..c5ebb58 --- /dev/null +++ b/test/future2.m @@ -0,0 +1,17 @@ +#include "future.h" + + +@implementation Sub1 ++(Class)classref { + return [Sub1 class]; +} ++(int)method { + return 1; +} +@end + +@implementation SubSub1 ++(int)method { + return 1 + [super method]; +} +@end diff --git a/test/gc.c b/test/gc.c new file mode 100644 index 0000000..dab0f7b --- /dev/null +++ b/test/gc.c @@ -0,0 +1 @@ +int GC(void) { return 42; } diff --git a/test/gc.m b/test/gc.m new file mode 100644 index 0000000..fb9497d --- /dev/null +++ b/test/gc.m @@ -0,0 +1,2 @@ +@interface GC @end +@implementation GC @end diff --git a/test/gcenforcer.m b/test/gcenforcer.m new file mode 100644 index 0000000..f3241b0 --- /dev/null +++ b/test/gcenforcer.m @@ -0,0 +1,22 @@ +#include "test.h" +#include +#include + +int main() +{ + int i; + for (i = 0; i < 1000; i++) { + testassert(dlopen_preflight("libsupportsgc.dylib")); + testassert(dlopen_preflight("libnoobjc.dylib")); + + if (objc_collecting_enabled()) { + testassert(dlopen_preflight("librequiresgc.dylib")); + testassert(! dlopen_preflight("libnogc.dylib")); + } else { + testassert(! dlopen_preflight("librequiresgc.dylib")); + testassert(dlopen_preflight("libnogc.dylib")); + } + } + + succeed(__FILE__); +} diff --git a/test/gcenforcer_nogc.gc.expected-stderr b/test/gcenforcer_nogc.gc.expected-stderr new file mode 100644 index 0000000..2bc2de8 --- /dev/null +++ b/test/gcenforcer_nogc.gc.expected-stderr @@ -0,0 +1,2 @@ +objc\[\d+\]: '.*libnogc.dylib' was not compiled with -fobjc-gc or -fobjc-gc-only, but the application requires GC +objc\[\d+\]: \*\*\* GC capability of application and some libraries did not match diff --git a/test/gcenforcer_nogc.nogc.expected-stderr b/test/gcenforcer_nogc.nogc.expected-stderr new file mode 100644 index 0000000..5ec78df --- /dev/null +++ b/test/gcenforcer_nogc.nogc.expected-stderr @@ -0,0 +1 @@ +OK: gcenforcer_nogc.out diff --git a/test/gcenforcer_requiresgc.gc.expected-stderr b/test/gcenforcer_requiresgc.gc.expected-stderr new file mode 100644 index 0000000..6a0db82 --- /dev/null +++ b/test/gcenforcer_requiresgc.gc.expected-stderr @@ -0,0 +1 @@ +OK: gcenforcer_requiresgc.out diff --git a/test/gcenforcer_requiresgc.nogc.expected-stderr b/test/gcenforcer_requiresgc.nogc.expected-stderr new file mode 100644 index 0000000..8b91e01 --- /dev/null +++ b/test/gcenforcer_requiresgc.nogc.expected-stderr @@ -0,0 +1,2 @@ +objc\[\d+\]: '.*librequiresgc.dylib' was compiled with -fobjc-gc-only, but the application does not support GC +objc\[\d+\]: \*\*\* GC capability of application and some libraries did not match diff --git a/test/gdb-lock.m b/test/gdb-lock.m new file mode 100644 index 0000000..ee426d6 --- /dev/null +++ b/test/gdb-lock.m @@ -0,0 +1,59 @@ +#import +#import + +#include "test.h" + +// gcc -arch ppc -arch i386 -arch x86_64 -x objective-c gdb-lock.m -framework Foundation +// CONFIG GC RR + +#if __cplusplus +extern "C" +#endif + BOOL gdb_objc_isRuntimeLocked(); + +@interface Foo : NSObject +@end +@implementation Foo +- (void) foo; +{ +} + +- (void) test: __attribute__((unused)) sender +{ + unsigned int x = 0; + Method foo = class_getInstanceMethod([Foo class], @selector(foo)); + IMP fooIMP = method_getImplementation(foo); + const char *fooTypes = method_getTypeEncoding(foo); + while(1) { + NSAutoreleasePool *p = [[NSAutoreleasePool alloc] init]; + char newSELName[100]; + sprintf(newSELName, "a%u", x++); + SEL newSEL = sel_registerName(newSELName); + class_addMethod([Foo class], newSEL, fooIMP, fooTypes); + [self performSelector: newSEL]; + [p drain]; + } +} +@end + +int main() { + NSAutoreleasePool *p = [[NSAutoreleasePool alloc] init]; + [NSThread detachNewThreadSelector: @selector(test:) toTarget: [Foo new] withObject: nil]; + unsigned int x = 0; + unsigned int lockCount = 0; + while(1) { + if (gdb_objc_isRuntimeLocked()) + lockCount++; + x++; + if (x > 1000000) + break; + } + if (lockCount < 10) { + fail("Runtime not locked very much."); + } + [p drain]; + + succeed(__FILE__); + + return 0; +} \ No newline at end of file diff --git a/test/gdb.m b/test/gdb.m new file mode 100644 index 0000000..9507ec5 --- /dev/null +++ b/test/gdb.m @@ -0,0 +1,51 @@ +#include "test.h" +#include +#include + +@interface Super { @public id isa; } @end +@implementation Super ++(void)initialize { } ++class { return self; } +@end + + +int main() +{ + // Class hashes +#if __OBJC2__ + + Class result; + + // Class should not be realized yet + // fixme not true during class hash rearrangement + // result = NXMapGet(gdb_objc_realized_classes, "Super"); + // testassert(!result); + + [Super class]; + // Now class should be realized + + result = NXMapGet(gdb_objc_realized_classes, "Super"); + testassert(result); + testassert(result == [Super class]); + + result = NXMapGet(gdb_objc_realized_classes, "DoesNotExist"); + testassert(!result); + +#else + + struct objc_class query; + struct objc_class *result; + + query.name = "Super"; + result = NXHashGet(_objc_debug_class_hash, &query); + testassert(result); + testassert(result == [Super class]); + + query.name = "DoesNotExist"; + result = NXHashGet(_objc_debug_class_hash, &query); + testassert(!result); + +#endif + + succeed(__FILE__); +} diff --git a/test/getMethod.m b/test/getMethod.m new file mode 100644 index 0000000..c6babd8 --- /dev/null +++ b/test/getMethod.m @@ -0,0 +1,117 @@ +#include "test.h" +#include +#include + +static int state = 0; + +@interface Super { id isa; } @end +@implementation Super ++class { return self; } ++(void)initialize { } ++(void)classMethod { state = 1; } +-(void)instanceMethod { state = 4; } ++(void)classMethodSuperOnly { state = 3; } +-(void)instanceMethodSuperOnly { state = 6; } +@end + +@interface Sub : Super @end +@implementation Sub ++(void)classMethod { state = 2; } +-(void)instanceMethod { state = 5; } +@end + + +int main() +{ + Class Super_cls, Sub_cls; + Class buf[10]; + Method m; + SEL sel; + IMP imp; + + // don't use [Super class] to check laziness handing + Super_cls = objc_getClass("Super"); + Sub_cls = objc_getClass("Sub"); + + sel = sel_registerName("classMethod"); + m = class_getClassMethod(Super_cls, sel); + testassert(m); + testassert(sel == method_getName(m)); + imp = method_getImplementation(m); + testassert(imp == class_getMethodImplementation(Super_cls->isa, sel)); + state = 0; + (*imp)(Super_cls, sel); + testassert(state == 1); + + sel = sel_registerName("classMethod"); + m = class_getClassMethod(Sub_cls, sel); + testassert(m); + testassert(sel == method_getName(m)); + imp = method_getImplementation(m); + testassert(imp == class_getMethodImplementation(Sub_cls->isa, sel)); + state = 0; + (*imp)(Sub_cls, sel); + testassert(state == 2); + + sel = sel_registerName("classMethodSuperOnly"); + m = class_getClassMethod(Sub_cls, sel); + testassert(m); + testassert(sel == method_getName(m)); + imp = method_getImplementation(m); + testassert(imp == class_getMethodImplementation(Sub_cls->isa, sel)); + state = 0; + (*imp)(Sub_cls, sel); + testassert(state == 3); + + sel = sel_registerName("instanceMethod"); + m = class_getInstanceMethod(Super_cls, sel); + testassert(m); + testassert(sel == method_getName(m)); + imp = method_getImplementation(m); + testassert(imp == class_getMethodImplementation(Super_cls, sel)); + state = 0; + buf[0] = Super_cls; + (*imp)((Super *)buf, sel); + testassert(state == 4); + + sel = sel_registerName("instanceMethod"); + m = class_getInstanceMethod(Sub_cls, sel); + testassert(m); + testassert(sel == method_getName(m)); + imp = method_getImplementation(m); + testassert(imp == class_getMethodImplementation(Sub_cls, sel)); + state = 0; + buf[0] = Sub_cls; + (*imp)((Sub *)buf, sel); + testassert(state == 5); + + sel = sel_registerName("instanceMethodSuperOnly"); + m = class_getInstanceMethod(Sub_cls, sel); + testassert(m); + testassert(sel == method_getName(m)); + imp = method_getImplementation(m); + testassert(imp == class_getMethodImplementation(Sub_cls, sel)); + state = 0; + buf[0] = Sub_cls; + (*imp)((Sub *)buf, sel); + testassert(state == 6); + + // check class_getClassMethod(cls) == class_getInstanceMethod(cls->isa) + sel = sel_registerName("classMethod"); + testassert(class_getClassMethod(Sub_cls, sel) == class_getInstanceMethod(Sub_cls->isa, sel)); + + sel = sel_registerName("nonexistent"); + testassert(! class_getInstanceMethod(Sub_cls, sel)); + testassert(! class_getClassMethod(Sub_cls, sel)); + testassert(class_getMethodImplementation(Sub_cls, sel) == (IMP)&_objc_msgForward); + testassert(class_getMethodImplementation_stret(Sub_cls, sel) == (IMP)&_objc_msgForward_stret); + + testassert(! class_getInstanceMethod(NULL, NULL)); + testassert(! class_getInstanceMethod(NULL, sel)); + testassert(! class_getInstanceMethod(Sub_cls, NULL)); + testassert(! class_getClassMethod(NULL, NULL)); + testassert(! class_getClassMethod(NULL, sel)); + testassert(! class_getClassMethod(Sub_cls, NULL)); + + succeed(__FILE__); +} diff --git a/test/ignoredSelector.m b/test/ignoredSelector.m new file mode 100644 index 0000000..f0f87b7 --- /dev/null +++ b/test/ignoredSelector.m @@ -0,0 +1,287 @@ +#include "test.h" +#include +#include +#include + +static int state = 0; + +@interface Super { id isa; } @end +@implementation Super ++class { return self; } ++(void)initialize { } + ++normal { state = 1; return self; } ++normal2 { testassert(0); } ++retain { state = 2; return self; } ++release { state = 3; return self; } ++autorelease { state = 4; return self; } ++(void)dealloc { state = 5; } ++(uintptr_t)retainCount { state = 6; return 6; } +@end + +@interface Sub : Super @end +@implementation Sub @end + +@interface Sub2 : Super @end +@implementation Sub2 @end + +@interface Empty { id isa; } @end +@implementation Empty ++class { return self; } ++(void)initialize { } ++forward:(SEL)sel :(marg_list)margs { + (void)sel; (void)margs; + state = 1; + return nil; +} +@end + +@interface Empty (Unimplemented) ++normal; ++retain; ++release; ++autorelease; ++(void)dealloc; ++(uintptr_t)retainCount; +@end + + +#define getImp(sel) \ + do { \ + sel##Method = class_getClassMethod(cls, @selector(sel)); \ + testassert(sel##Method); \ + testassert(@selector(sel) == method_getName(sel##Method)); \ + sel = method_getImplementation(sel##Method); \ + } while (0) + + +static IMP normal, normal2, retain, release, autorelease, dealloc, retainCount; +static Method normalMethod, normal2Method, retainMethod, releaseMethod, autoreleaseMethod, deallocMethod, retainCountMethod; + +void cycle(Class cls) +{ + id idVal; + uintptr_t intVal; + + if (objc_collecting_enabled()) { + // GC: all ignored selectors are identical + testassert(@selector(retain) == @selector(release) && + @selector(retain) == @selector(autorelease) && + @selector(retain) == @selector(dealloc) && + @selector(retain) == @selector(retainCount) ); + } + else { + // no GC: all ignored selectors are distinct + testassert(@selector(retain) != @selector(release) && + @selector(retain) != @selector(autorelease) && + @selector(retain) != @selector(dealloc) && + @selector(retain) != @selector(retainCount) ); + } + + // no ignored selector matches a real selector + testassert(@selector(normal) != @selector(retain) && + @selector(normal) != @selector(release) && + @selector(normal) != @selector(autorelease) && + @selector(normal) != @selector(dealloc) && + @selector(normal) != @selector(retainCount) ); + + getImp(normal); + getImp(normal2); + getImp(retain); + getImp(release); + getImp(autorelease); + getImp(dealloc); + getImp(retainCount); + + if (objc_collecting_enabled()) { + // GC: all ignored selector IMPs are identical + testassert(retain == release && + retain == autorelease && + retain == dealloc && + retain == retainCount ); + } + else { + // no GC: all ignored selector IMPs are distinct + testassert(retain != release && + retain != autorelease && + retain != dealloc && + retain != retainCount ); + } + + // no ignored selector IMP matches a real selector IMP + testassert(normal != retain && + normal != release && + normal != autorelease && + normal != dealloc && + normal != retainCount ); + + // Test calls via method_invoke + + idVal = ((id(*)(id, Method))method_invoke)(cls, normalMethod); + testassert(state == 1); + testassert(idVal == cls); + + state = 0; + idVal = ((id(*)(id, Method))method_invoke)(cls, retainMethod); + testassert(state == (objc_collecting_enabled() ? 0 : 2)); + testassert(idVal == cls); + + idVal = ((id(*)(id, Method))method_invoke)(cls, releaseMethod); + testassert(state == (objc_collecting_enabled() ? 0 : 3)); + testassert(idVal == cls); + + idVal = ((id(*)(id, Method))method_invoke)(cls, autoreleaseMethod); + testassert(state == (objc_collecting_enabled() ? 0 : 4)); + testassert(idVal == cls); + + (void) ((void(*)(id, Method))method_invoke)(cls, deallocMethod); + testassert(state == (objc_collecting_enabled() ? 0 : 5)); + + intVal = ((uintptr_t(*)(id, Method))method_invoke)(cls, retainCountMethod); + testassert(state == (objc_collecting_enabled() ? 0 : 6)); + testassert(intVal == (objc_collecting_enabled() ? (uintptr_t)cls : 6)); + + + // Test calls via objc_msgSend + + state = 0; + idVal = [cls normal]; + testassert(state == 1); + testassert(idVal == cls); + + state = 0; + idVal = [cls retain]; + testassert(state == (objc_collecting_enabled() ? 0 : 2)); + testassert(idVal == cls); + + idVal = [cls release]; + testassert(state == (objc_collecting_enabled() ? 0 : 3)); + testassert(idVal == cls); + + idVal = [cls autorelease]; + testassert(state == (objc_collecting_enabled() ? 0 : 4)); + testassert(idVal == cls); + + (void) [cls dealloc]; + testassert(state == (objc_collecting_enabled() ? 0 : 5)); + + intVal = [cls retainCount]; + testassert(state == (objc_collecting_enabled() ? 0 : 6)); + testassert(intVal == (objc_collecting_enabled() ? (uintptr_t)cls : 6)); +} + +int main() +{ + Class cls; + + // Test selector API + + testassert(sel_registerName("retain") == @selector(retain)); + testassert(sel_getUid("retain") == @selector(retain)); + if (objc_collecting_enabled()) { + testassert(0 == strcmp(sel_getName(@selector(retain)), "")); + } else { + testassert(0 == strcmp(sel_getName(@selector(retain)), "retain")); + } +#if !__OBJC2__ + testassert(sel_isMapped(@selector(retain))); +#endif + + cls = [Sub class]; + testassert(cls); + cycle(cls); + + cls = [Super class]; + testassert(cls); + cycle(cls); + + if (objc_collecting_enabled()) { + // rdar://6200570 Method manipulation shouldn't affect ignored methods. + + cls = [Super class]; + testassert(cls); + cycle(cls); + + method_setImplementation(retainMethod, (IMP)1); + method_setImplementation(releaseMethod, (IMP)1); + method_setImplementation(autoreleaseMethod, (IMP)1); + method_setImplementation(deallocMethod, (IMP)1); + method_setImplementation(retainCountMethod, (IMP)1); + cycle(cls); + + testassert(normal2 != dealloc); + method_exchangeImplementations(retainMethod, releaseMethod); + method_exchangeImplementations(autoreleaseMethod, retainCountMethod); + method_exchangeImplementations(deallocMethod, normal2Method); + cycle(cls); + // normal2 exchanged with ignored method is now ignored too + testassert(normal2 == dealloc); + + // replace == replace existing + class_replaceMethod(cls, @selector(retain), (IMP)1, ""); + class_replaceMethod(cls, @selector(release), (IMP)1, ""); + class_replaceMethod(cls, @selector(autorelease), (IMP)1, ""); + class_replaceMethod(cls, @selector(dealloc), (IMP)1, ""); + class_replaceMethod(cls, @selector(retainCount), (IMP)1, ""); + cycle(cls); + + cls = [Sub class]; + testassert(cls); + cycle(cls); + + // replace == add override + class_replaceMethod(cls, @selector(retain), (IMP)1, ""); + class_replaceMethod(cls, @selector(release), (IMP)1, ""); + class_replaceMethod(cls, @selector(autorelease), (IMP)1, ""); + class_replaceMethod(cls, @selector(dealloc), (IMP)1, ""); + class_replaceMethod(cls, @selector(retainCount), (IMP)1, ""); + cycle(cls); + + cls = [Sub2 class]; + testassert(cls); + cycle(cls); + + class_addMethod(cls, @selector(retain), (IMP)1, ""); + class_addMethod(cls, @selector(release), (IMP)1, ""); + class_addMethod(cls, @selector(autorelease), (IMP)1, ""); + class_addMethod(cls, @selector(dealloc), (IMP)1, ""); + class_addMethod(cls, @selector(retainCount), (IMP)1, ""); + cycle(cls); + } + + // Test calls via objc_msgSend - ignored selectors are ignored + // under GC even if the class provides no implementation for them + if (objc_collecting_enabled()) { + Class cls; + id idVal; + uintptr_t intVal; + + cls = [Empty class]; + state = 0; + + idVal = [Empty retain]; + testassert(state == 0); + testassert(idVal == cls); + + idVal = [Empty release]; + testassert(state == 0); + testassert(idVal == cls); + + idVal = [Empty autorelease]; + testassert(state == 0); + testassert(idVal == cls); + + (void) [Empty dealloc]; + testassert(state == 0); + + intVal = [Empty retainCount]; + testassert(state == 0); + testassert(intVal == (uintptr_t)cls); + + idVal = [Empty normal]; + testassert(state == 1); + testassert(idVal == nil); + } + + succeed(__FILE__); +} diff --git a/test/imageorder.h b/test/imageorder.h new file mode 100644 index 0000000..0ccb3bc --- /dev/null +++ b/test/imageorder.h @@ -0,0 +1,19 @@ +extern int state; +extern int cstate; + +@interface Super { id isa; } ++(void) method; ++(void) method0; +@end + +@interface Super (cat1) ++(void) method1; +@end + +@interface Super (cat2) ++(void) method2; +@end + +@interface Super (cat3) ++(void) method3; +@end diff --git a/test/imageorder.m b/test/imageorder.m new file mode 100644 index 0000000..8ae12aa --- /dev/null +++ b/test/imageorder.m @@ -0,0 +1,32 @@ +#include "test.h" +#include "imageorder.h" +#include +#include + +int main() +{ + // +load methods and C static initializers + testassert(state == 3); + testassert(cstate == 3); + + Class cls = objc_getClass("Super"); + testassert(cls); + + // make sure all categories arrived + state = -1; + [Super method0]; + testassert(state == 0); + [Super method1]; + testassert(state == 1); + [Super method2]; + testassert(state == 2); + [Super method3]; + testassert(state == 3); + + // make sure imageorder3.out is the last category to attach + state = 0; + [Super method]; + testassert(state == 3); + + succeed(__FILE__); +} diff --git a/test/imageorder1.m b/test/imageorder1.m new file mode 100644 index 0000000..98ba1a4 --- /dev/null +++ b/test/imageorder1.m @@ -0,0 +1,41 @@ +#include "test.h" +#include "imageorder.h" + +int state = -1; +int cstate = 0; + +static void c1(void) __attribute__((constructor)); +static void c1(void) +{ + testassert(state == 1); // +load before C/C++ + testassert(cstate == 0); + cstate = 1; +} + +@implementation Super (cat1) ++(void) method { + fail("+[Super(cat1) method] not replaced!"); +} ++(void) method1 { + state = 1; +} ++(void) load { + testassert(state == 0); + state = 1; +} +@end + +@implementation Super ++(void) initialize { } ++(void) method { + fail("+[Super method] not replaced!"); +} ++(void) method0 { + state = 0; +} ++(void) load { + testassert(state == -1); + state = 0; +} +@end + diff --git a/test/imageorder2.m b/test/imageorder2.m new file mode 100644 index 0000000..0b443a5 --- /dev/null +++ b/test/imageorder2.m @@ -0,0 +1,23 @@ +#include "test.h" +#include "imageorder.h" + +static void c2(void) __attribute__((constructor)); +static void c2(void) +{ + testassert(state == 2); // +load before C/C++ + testassert(cstate == 1); + cstate = 2; +} + +@implementation Super (cat2) ++(void) method { + fail("+[Super(cat2) method] not replaced!"); +} ++(void) method2 { + state = 2; +} ++(void) load { + testassert(state == 1); + state = 2; +} +@end diff --git a/test/imageorder3.m b/test/imageorder3.m new file mode 100644 index 0000000..15d9591 --- /dev/null +++ b/test/imageorder3.m @@ -0,0 +1,23 @@ +#include "test.h" +#include "imageorder.h" + +static void c3(void) __attribute__((constructor)); +static void c3(void) +{ + testassert(state == 3); // +load before C/C++ + testassert(cstate == 2); + cstate = 3; +} + +@implementation Super (cat3) ++(void) method { + state = 3; +} ++(void) method3 { + state = 3; +} ++(void) load { + testassert(state == 2); + state = 3; +} +@end diff --git a/test/initialize.m b/test/initialize.m new file mode 100644 index 0000000..4f3f6ef --- /dev/null +++ b/test/initialize.m @@ -0,0 +1,129 @@ +// initialize.m +// Test basic +initialize behavior +// * +initialize before class method +// * superclass +initialize before subclass +initialize +// * subclass inheritance of superclass implementation +// * messaging during +initialize +#include "test.h" + +int state = 0; + +@interface Super0 { } @end +@implementation Super0 ++(void)initialize { + fail("objc_getClass() must not trigger +initialize"); +} +@end + +@interface Super {} @end +@implementation Super ++(void)initialize { + testprintf("in [Super initialize]\n"); + testassert(state == 0); + state = 1; +} ++(void)method { + fail("[Super method] shouldn't be called"); +} +@end + +@interface Sub : Super { } @end +@implementation Sub ++(void)initialize { + testprintf("in [Sub initialize]\n"); + testassert(state == 1); + state = 2; +} ++(void)method { + testprintf("in [Sub method]\n"); + testassert(state == 2); + state = 3; +} +@end + + +@interface Super2 { } @end +@interface Sub2 : Super2 { } @end + +@implementation Super2 ++(id)class { return self; } ++(void)initialize { + if (self == objc_getClass("Sub2")) { + testprintf("in [Super2 initialize] of Sub2\n"); + testassert(state == 1); + state = 2; + } else if (self == objc_getClass("Super2")) { + testprintf("in [Super2 initialize] of Super2\n"); + testassert(state == 0); + state = 1; + } else { + fail("in [Super2 initialize] of unknown class"); + } +} ++(void)method { + testprintf("in [Super2 method]\n"); + testassert(state == 2); + state = 3; +} +@end + +@implementation Sub2 +// nothing here +@end + + +@interface Super3 { } @end +@interface Sub3 : Super3 { } @end + +@implementation Super3 ++(id)class { return self; } ++(void)initialize { + if (self == [Sub3 class]) { // this message triggers [Sub3 initialize] + testprintf("in [Super3 initialize] of Sub3\n"); + testassert(state == 0); + state = 1; + } else if (self == [Super3 class]) { + testprintf("in [Super3 initialize] of Super3\n"); + testassert(state == 1); + state = 2; + } else { + fail("in [Super3 initialize] of unknown class"); + } +} ++(void)method { + testprintf("in [Super3 method]\n"); + testassert(state == 2); + state = 3; +} +@end + +@implementation Sub3 +// nothing here +@end + +int main() +{ + // objc_getClass() must not +initialize anything + state = 0; + objc_getClass("Super0"); + testassert(state == 0); + + // initialize superclass, then subclass + state = 0; + [Sub method]; + testassert(state == 3); + + // check subclass's inheritance of superclass initialize + state = 0; + [Sub2 method]; + testassert(state == 3); + + // check subclass method called from superclass initialize + state = 0; + [Sub3 method]; + testassert(state == 3); + + succeed(__FILE__); + + return 0; +} diff --git a/test/instanceSize.m b/test/instanceSize.m new file mode 100644 index 0000000..14e32e1 --- /dev/null +++ b/test/instanceSize.m @@ -0,0 +1,63 @@ +#include "test.h" + +#include + + +@interface Super { id isa; } @end +@implementation Super ++(void)initialize { } ++class { return self; } ++new { return class_createInstance(self, 0); } +-(void)dealloc { object_dispose(self); } +@end + +@interface Sub1 : Super { + // id isa; // 0..4 + BOOL b; // 4..5 +} +@end + +@implementation Sub1 @end + +@interface Sub2 : Sub1 { + // id isa // 0..4 0..8 + // BOOL b // 4..5 8..9 + BOOL b2; // 5..6 9..10 + id o; // 8..12 16..24 +} +@end +@implementation Sub2 @end + +@interface Sub3 : Sub1 { + // id isa; // 0..4 0..8 + // BOOL b; // 4..5 8..9 + id o; // 8..12 16..24 + BOOL b2; // 12..13 24..25 +} +@end +@implementation Sub3 @end + +int main() +{ + testassert(sizeof(id) == class_getInstanceSize([Super class])); + testassert(2*sizeof(id) == class_getInstanceSize([Sub1 class])); + testassert(3*sizeof(id) == class_getInstanceSize([Sub2 class])); + testassert(4*sizeof(id) == class_getInstanceSize([Sub3 class])); + + id o; + + o = [Super new]; + testassert(object_getIndexedIvars(o) == (char *)o + class_getInstanceSize(o->isa)); + [o dealloc]; + o = [Sub1 new]; + testassert(object_getIndexedIvars(o) == (char *)o + class_getInstanceSize(o->isa)); + [o dealloc]; + o = [Sub2 new]; + testassert(object_getIndexedIvars(o) == (char *)o + class_getInstanceSize(o->isa)); + [o dealloc]; + o = [Sub3 new]; + testassert(object_getIndexedIvars(o) == (char *)o + class_getInstanceSize(o->isa)); + [o dealloc]; + + succeed(__FILE__); +} diff --git a/test/ismeta.m b/test/ismeta.m new file mode 100644 index 0000000..e3b16c7 --- /dev/null +++ b/test/ismeta.m @@ -0,0 +1,16 @@ +#include "test.h" +#include + +@interface Super { id isa; } @end +@implementation Super ++(void)initialize { } ++class { return self; } +@end + +int main() +{ + testassert(!class_isMetaClass([Super class])); + testassert(class_isMetaClass([Super class]->isa)); + testassert(!class_isMetaClass(nil)); + succeed(__FILE__); +} diff --git a/test/ivar.m b/test/ivar.m new file mode 100644 index 0000000..56b097f --- /dev/null +++ b/test/ivar.m @@ -0,0 +1,116 @@ +#include "test.h" +#include +#include +#include + +@interface Super { + @public + id isa; + char superIvar; +} +@end + +@implementation Super ++(void)initialize { } ++class { return self; } ++new { return class_createInstance(self, 0); } +@end + + +@interface Sub : Super { + @public + uintptr_t subIvar; +} +@end + +@implementation Sub @end + + +int main() +{ + /* + Runtime layout of Sub: + [0] isa + [1] superIvar + [2] subIvar + */ + + Ivar ivar; + uintptr_t value; + Sub *sub = [Sub new]; + sub->subIvar = 10; + testassert(((uintptr_t *)sub)[2] == 10); + + ivar = class_getInstanceVariable([Sub class], "subIvar"); + testassert(ivar); + testassert(2*sizeof(intptr_t) == ivar_getOffset(ivar)); + testassert(0 == strcmp(ivar_getName(ivar), "subIvar")); +#if __LP64__ + testassert(0 == strcmp(ivar_getTypeEncoding(ivar), "Q")); +#else + testassert(0 == strcmp(ivar_getTypeEncoding(ivar), "I")); +#endif + + ivar = class_getInstanceVariable([Super class], "superIvar"); + testassert(ivar); + testassert(sizeof(intptr_t) == ivar_getOffset(ivar)); + testassert(0 == strcmp(ivar_getName(ivar), "superIvar")); + testassert(0 == strcmp(ivar_getTypeEncoding(ivar), "c")); + testassert(ivar == class_getInstanceVariable([Sub class], "superIvar")); + + ivar = class_getInstanceVariable([Super class], "subIvar"); + testassert(!ivar); + + ivar = class_getInstanceVariable([Sub class]->isa, "subIvar"); + testassert(!ivar); + + + sub->subIvar = 10; + value = 0; + object_getInstanceVariable(sub, "subIvar", (void **)&value); + testassert(value == 10); + + object_setInstanceVariable(sub, "subIvar", (void *)11); + testassert(sub->subIvar == 11); + + ivar = class_getInstanceVariable([Sub class], "subIvar"); + object_setIvar(sub, ivar, (id)12); + testassert(sub->subIvar == 12); + testassert((id)12 == object_getIvar(sub, ivar)); + + ivar = class_getInstanceVariable([Sub class], "subIvar"); + testassert(ivar == object_getInstanceVariable(sub, "subIvar", NULL)); + + + testassert(NULL == class_getInstanceVariable(NULL, "foo")); + testassert(NULL == class_getInstanceVariable([Sub class], NULL)); + testassert(NULL == class_getInstanceVariable(NULL, NULL)); + + testassert(NULL == object_getIvar(sub, NULL)); + testassert(NULL == object_getIvar(NULL, ivar)); + testassert(NULL == object_getIvar(NULL, NULL)); + + testassert(NULL == object_getInstanceVariable(sub, NULL, NULL)); + testassert(NULL == object_getInstanceVariable(NULL, "foo", NULL)); + testassert(NULL == object_getInstanceVariable(NULL, NULL, NULL)); + value = 10; + testassert(NULL == object_getInstanceVariable(sub, NULL, (void **)&value)); + testassert(value == 0); + value = 10; + testassert(NULL == object_getInstanceVariable(NULL, "foo", (void **)&value)); + testassert(value == 0); + value = 10; + testassert(NULL == object_getInstanceVariable(NULL, NULL, (void **)&value)); + testassert(value == 0); + + object_setIvar(sub, NULL, NULL); + object_setIvar(NULL, ivar, NULL); + object_setIvar(NULL, NULL, NULL); + + testassert(NULL == object_setInstanceVariable(sub, NULL, NULL)); + testassert(NULL == object_setInstanceVariable(NULL, "foo", NULL)); + testassert(NULL == object_setInstanceVariable(NULL, NULL, NULL)); + + succeed(__FILE__); + return 0; +} diff --git a/test/ivarSlide.h b/test/ivarSlide.h new file mode 100644 index 0000000..c0e5a13 --- /dev/null +++ b/test/ivarSlide.h @@ -0,0 +1,120 @@ +@interface Base { + @public + id isa; +} + ++class; ++new; +-(void)dealloc; +@end + +@interface Super : Base { + @public +#if OLD + // nothing +#else + char superIvar; +#endif +} +@end + + +@interface ShrinkingSuper : Base { + @public +#if OLD + id superIvar[5]; + __weak id superIvar2[5]; +#else + // nothing +#endif +} +@end; + + +@interface MoreStrongSuper : Base { + @public +#if OLD + void *superIvar; +#else + id superIvar; +#endif +} +@end; + + +@interface MoreWeakSuper : Base { + @public +#if OLD + id superIvar; +#else + __weak id superIvar; +#endif +} +@end; + +@interface MoreWeak2Super : Base { + @public +#if OLD + void *superIvar; +#else + __weak id superIvar; +#endif +} +@end; + +@interface LessStrongSuper : Base { + @public +#if OLD + id superIvar; +#else + void *superIvar; +#endif +} +@end; + +@interface LessWeakSuper : Base { + @public +#if OLD + __weak id superIvar; +#else + id superIvar; +#endif +} +@end; + +@interface LessWeak2Super : Base { + @public +#if OLD + __weak id superIvar; +#else + void *superIvar; +#endif +} +@end; + +@interface NoGCChangeSuper : Base { + @public + intptr_t d; + char superc1; +#if OLD + // nothing +#else + char superc2; +#endif +} +@end + +@interface RunsOf15 : Base { + @public + id scan1; + intptr_t skip15[15]; + id scan15[15]; + intptr_t skip15_2[15]; + id scan15_2[15]; +#if OLD + // nothing +#else + intptr_t skip1; +#endif +} +@end diff --git a/test/ivarSlide1.m b/test/ivarSlide1.m new file mode 100644 index 0000000..59299a0 --- /dev/null +++ b/test/ivarSlide1.m @@ -0,0 +1,27 @@ +#include "test.h" +#include +#include + +#define OLD 0 +#include "ivarSlide.h" + +@implementation Base ++(void)initialize { } ++class { return self; } ++new { return class_createInstance(self, 0); } +-(void)dealloc { object_dispose(self); } +-(void)finalize { } +@end + +@implementation Super @end + +@implementation ShrinkingSuper @end + +@implementation MoreStrongSuper @end +@implementation LessStrongSuper @end +@implementation MoreWeakSuper @end +@implementation MoreWeak2Super @end +@implementation LessWeakSuper @end +@implementation LessWeak2Super @end +@implementation NoGCChangeSuper @end +@implementation RunsOf15 @end diff --git a/test/ivarSlide2.m b/test/ivarSlide2.m new file mode 100644 index 0000000..22d8493 --- /dev/null +++ b/test/ivarSlide2.m @@ -0,0 +1,519 @@ +#include "test.h" +#include +#include +#include +#include +#include + +#define OLD 1 +#include "ivarSlide.h" + +#ifdef __cplusplus +class CXX { + public: + static uintptr_t count; + uintptr_t magic; + CXX() : magic(1) { } + ~CXX() { count += magic; } +}; +uintptr_t CXX::count; +#endif + +@interface Bitfields : Super { + uint8_t uint8_ivar; + uint8_t uint8_bitfield1 :7; + uint8_t uint8_bitfield2 :1; + + id id_ivar; + + uintptr_t uintptr_ivar; + uintptr_t /*uintptr_bitfield1*/ :31; // anonymous (rdar://5723893) + uintptr_t uintptr_bitfield2 :1; + + id id_ivar2; +} +@end + +@implementation Bitfields @end + + +@interface Sub : Super { + @public + uintptr_t subIvar; + __strong uintptr_t subIvar2; + __weak uintptr_t subIvar3; +#ifdef __cplusplus + CXX cxx; +#else + // same layout as cxx + uintptr_t cxx_magic; +#endif +} +@end + +@implementation Sub @end + + +@interface Sub2 : ShrinkingSuper { + @public + __weak uintptr_t subIvar; + __strong uintptr_t subIvar2; +} +@end + +@implementation Sub2 @end + +@interface MoreStrongSub : MoreStrongSuper { id subIvar; } @end +@interface LessStrongSub : LessStrongSuper { id subIvar; } @end +@interface MoreWeakSub : MoreWeakSuper { id subIvar; } @end +@interface MoreWeak2Sub : MoreWeak2Super { id subIvar; } @end +@interface LessWeakSub : LessWeakSuper { id subIvar; } @end +@interface LessWeak2Sub : LessWeak2Super { id subIvar; } @end + +@implementation MoreStrongSub @end +@implementation LessStrongSub @end +@implementation MoreWeakSub @end +@implementation MoreWeak2Sub @end +@implementation LessWeakSub @end +@implementation LessWeak2Sub @end + +@interface NoGCChangeSub : NoGCChangeSuper { + @public + char subc3; +} +@end +@implementation NoGCChangeSub @end + +@interface RunsOf15Sub : RunsOf15 { + @public + char sub; +} +@end +@implementation RunsOf15Sub @end + + +int main(int argc __attribute__((unused)), char **argv) +{ + if (objc_collecting_enabled()) { + objc_startCollectorThread(); + } + +#if __OBJC2__ + + /* + Bitfield ivars. + rdar://5723893 anonymous bitfield ivars crash when slid + rdar://5724385 bitfield ivar alignment incorrect + + Compile-time layout of Bitfields: + [0 scan] isa + [1 skip] uint8_ivar, uint8_bitfield + [2 scan] id_ivar + [3 skip] uintptr_ivar + [4 skip] uintptr_bitfield + [5 scan] id_ivar2 + + Runtime layout of Bitfields: + [0 scan] isa + [1 skip] superIvar + [2 skip] uint8_ivar, uint8_bitfield + [3 scan] id_ivar + [4 skip] uintptr_ivar + [5 skip] uintptr_bitfield + [6 scan] id_ivar2 + */ + + [Bitfields class]; + + testassert(class_getInstanceSize([Bitfields class]) == 7*sizeof(void*)); + + if (objc_collecting_enabled()) { + const char *bitfieldlayout; + bitfieldlayout = class_getIvarLayout([Bitfields class]); + testassert(0 == strcmp(bitfieldlayout, "\x01\x21\x21")); + + bitfieldlayout = class_getWeakIvarLayout([Bitfields class]); + testassert(bitfieldlayout == NULL); + } + + /* + Compile-time layout of Sub: + [0 scan] isa + [1 skip] subIvar + [2 scan] subIvar2 + [3 weak] subIvar3 + [6 skip] cxx + + Runtime layout of Sub: + [0 scan] isa + [1 skip] superIvar + [2 skip] subIvar + [3 scan] subIvar2 + [4 weak] subIvar3 + [6 skip] cxx + + Also, superIvar is only one byte, so subIvar's alignment must + be handled correctly. + + fixme test more layouts + */ + + Ivar ivar; + static Sub * volatile sub; + sub = [Sub new]; + sub->subIvar = 10; + testassert(((uintptr_t *)sub)[2] == 10); + +#ifdef __cplusplus + uintptr_t i; + for (i = 0; i < 10; i++) { + if (i != 0) sub = [Sub new]; + testassert(((uintptr_t *)sub)[5] == 1); + testassert(sub->cxx.magic == 1); + sub->cxx.magic++; + testassert(((uintptr_t *)sub)[5] == 2); + testassert(sub->cxx.magic == 2); + if (! objc_collecting_enabled()) { + [sub dealloc]; + } + } + + if (objc_collecting_enabled()) { + // only require one of the objects to be reclaimed + objc_collect(OBJC_EXHAUSTIVE_COLLECTION | OBJC_WAIT_UNTIL_DONE); + objc_collect(OBJC_EXHAUSTIVE_COLLECTION | OBJC_WAIT_UNTIL_DONE); + testassert(CXX::count > 0 && CXX::count <= i*2 && CXX::count % 2 == 0); + } + else { + testassert(CXX::count == i*2); + } +#endif + + + testassert(class_getInstanceSize([Sub class]) == 6*sizeof(void*)); + + ivar = class_getInstanceVariable([Sub class], "subIvar"); + testassert(ivar); + testassert(2*sizeof(void*) == ivar_getOffset(ivar)); + testassert(0 == strcmp(ivar_getName(ivar), "subIvar")); + testassert(0 == strcmp(ivar_getTypeEncoding(ivar), +#if __LP64__ + "Q" +#else + "I" +#endif + )); + +#ifdef __cplusplus + ivar = class_getInstanceVariable([Sub class], "cxx"); + testassert(ivar); +#endif + + ivar = class_getInstanceVariable([Super class], "superIvar"); + testassert(ivar); + testassert(sizeof(void*) == ivar_getOffset(ivar)); + testassert(0 == strcmp(ivar_getName(ivar), "superIvar")); + testassert(0 == strcmp(ivar_getTypeEncoding(ivar), "c")); + + ivar = class_getInstanceVariable([Super class], "subIvar"); + testassert(!ivar); + + if (objc_collecting_enabled()) { + const char *superlayout; + const char *sublayout; + superlayout = class_getIvarLayout([Super class]); + sublayout = class_getIvarLayout([Sub class]); + testassert(0 == strcmp(superlayout, "\x01\x10")); + testassert(0 == strcmp(sublayout, "\x01\x21\x20")); + + superlayout = class_getWeakIvarLayout([Super class]); + sublayout = class_getWeakIvarLayout([Sub class]); + testassert(superlayout == NULL); + testassert(0 == strcmp(sublayout, "\x41\x10")); + } + + /* + Shrinking superclass. + Subclass ivars do not compact, but the GC layout needs to + update, including the gap that the superclass no longer spans. + + Compile-time layout of Sub2: + [0 scan] isa + [1-5 scan] superIvar + [6-10 weak] superIvar2 + [11 weak] subIvar + [12 scan] subIvar2 + + Runtime layout of Sub2: + [0 scan] isa + [1-10 skip] was superIvar + [11 weak] subIvar + [12 scan] subIvar2 + */ + + Sub2 *sub2 = [Sub2 new]; + sub2->isa = [Sub2 class]; + sub2->subIvar = 10; + testassert(((uintptr_t *)sub2)[11] == 10); + + testassert(class_getInstanceSize([Sub2 class]) == 13*sizeof(void*)); + + ivar = class_getInstanceVariable([Sub2 class], "subIvar"); + testassert(ivar); + testassert(11*sizeof(void*) == ivar_getOffset(ivar)); + testassert(0 == strcmp(ivar_getName(ivar), "subIvar")); + + ivar = class_getInstanceVariable([ShrinkingSuper class], "superIvar"); + testassert(!ivar); + + if (objc_collecting_enabled()) { + const char *superlayout; + const char *sublayout; + superlayout = class_getIvarLayout([ShrinkingSuper class]); + sublayout = class_getIvarLayout([Sub2 class]); + testassert(superlayout == NULL); + testassert(0 == strcmp(sublayout, "\x01\xb1")); + + superlayout = class_getWeakIvarLayout([ShrinkingSuper class]); + sublayout = class_getWeakIvarLayout([Sub2 class]); + testassert(superlayout == NULL); + testassert(0 == strcmp(sublayout, "\xb1\x10")); + } + + /* + Ivars slide but GC layouts stay the same + Here, the last word of the superclass is misaligned, but + its GC layout includes a bit for that whole word. + Additionally, all of the subclass ivars fit into that word too, + both before and after sliding. + The runtime will try to slide the GC layout and must not be + confused (rdar://6851700). Note that the second skip-word may or may + not actually be included, because it crosses the end of the object. + + + Compile-time layout of NoGCChangeSub: + [0 scan] isa + [1 skip] d + [2 skip] superc1, subc3 + + Runtime layout of NoGCChangeSub: + [0 scan] isa + [1 skip] d + [2 skip] superc1, superc2, subc3 + */ + if (objc_collecting_enabled()) { + Ivar ivar1 = class_getInstanceVariable([NoGCChangeSub class], "superc1"); + testassert(ivar1); + Ivar ivar2 = class_getInstanceVariable([NoGCChangeSub class], "superc2"); + testassert(ivar2); + Ivar ivar3 = class_getInstanceVariable([NoGCChangeSub class], "subc3"); + testassert(ivar3); + testassert(ivar_getOffset(ivar1) != ivar_getOffset(ivar2) && + ivar_getOffset(ivar1) != ivar_getOffset(ivar3) && + ivar_getOffset(ivar2) != ivar_getOffset(ivar3)); + } + + /* Ivar layout includes runs of 15 words. + rdar://6859875 this would generate a truncated GC layout. + */ + if (objc_collecting_enabled()) { + const uint8_t *layout = (const uint8_t *) + class_getIvarLayout(objc_getClass("RunsOf15Sub")); + testassert(layout); + int totalSkip = 0; + int totalScan = 0; + // should find 30+ each of skip and scan + uint8_t c; + while ((c = *layout++)) { + totalSkip += c>>4; + totalScan += c&0xf; + } + testassert(totalSkip >= 30); + testassert(totalScan >= 30); + } + +// __OBJC2__ +#endif + + + /* + Non-strong -> strong + Classes do not change size, but GC layouts must be updated. + Both new and old ABI detect this case (rdar://5774578) + + Compile-time layout of MoreStrongSub: + [0 scan] isa + [1 skip] superIvar + [2 scan] subIvar + + Runtime layout of MoreStrongSub: + [0 scan] isa + [1 scan] superIvar + [2 scan] subIvar + */ + testassert(class_getInstanceSize([MoreStrongSub class]) == 3*sizeof(void*)); + if (objc_collecting_enabled()) { + const char *layout; + layout = class_getIvarLayout([MoreStrongSub class]); + testassert(layout == NULL); + + layout = class_getWeakIvarLayout([MoreStrongSub class]); + testassert(layout == NULL); + } + + + /* + Strong -> weak + Classes do not change size, but GC layouts must be updated. + Old ABI intentionally does not detect this case (rdar://5774578) + + Compile-time layout of MoreWeakSub: + [0 scan] isa + [1 scan] superIvar + [2 scan] subIvar + + Runtime layout of MoreWeakSub: + [0 scan] isa + [1 weak] superIvar + [2 scan] subIvar + */ + testassert(class_getInstanceSize([MoreWeakSub class]) == 3*sizeof(void*)); + if (objc_collecting_enabled()) { + const char *layout; + layout = class_getIvarLayout([MoreWeakSub class]); +#if __OBJC2__ + testassert(0 == strcmp(layout, "\x01\x11")); +#else + testassert(layout == NULL); +#endif + + layout = class_getWeakIvarLayout([MoreWeakSub class]); +#if __OBJC2__ + testassert(0 == strcmp(layout, "\x11\x10")); +#else + testassert(layout == NULL); +#endif + } + + + /* + Non-strong -> weak + Classes do not change size, but GC layouts must be updated. + Old ABI intentionally does not detect this case (rdar://5774578) + + Compile-time layout of MoreWeak2Sub: + [0 scan] isa + [1 skip] superIvar + [2 scan] subIvar + + Runtime layout of MoreWeak2Sub: + [0 scan] isa + [1 weak] superIvar + [2 scan] subIvar + */ + testassert(class_getInstanceSize([MoreWeak2Sub class]) == 3*sizeof(void*)); + if (objc_collecting_enabled()) { + const char *layout; + layout = class_getIvarLayout([MoreWeak2Sub class]); + testassert(0 == strcmp(layout, "\x01\x11") || + 0 == strcmp(layout, "\x01\x10\x01")); + + layout = class_getWeakIvarLayout([MoreWeak2Sub class]); +#if __OBJC2__ + testassert(0 == strcmp(layout, "\x11\x10")); +#else + testassert(layout == NULL); +#endif + } + + + /* + Strong -> non-strong + Classes do not change size, but GC layouts must be updated. + Old ABI intentionally does not detect this case (rdar://5774578) + + Compile-time layout of LessStrongSub: + [0 scan] isa + [1 scan] superIvar + [2 scan] subIvar + + Runtime layout of LessStrongSub: + [0 scan] isa + [1 skip] superIvar + [2 scan] subIvar + */ + testassert(class_getInstanceSize([LessStrongSub class]) == 3*sizeof(void*)); + if (objc_collecting_enabled()) { + const char *layout; + layout = class_getIvarLayout([LessStrongSub class]); +#if __OBJC2__ + testassert(0 == strcmp(layout, "\x01\x11")); +#else + testassert(layout == NULL); +#endif + + layout = class_getWeakIvarLayout([LessStrongSub class]); + testassert(layout == NULL); + } + + + /* + Weak -> strong + Classes do not change size, but GC layouts must be updated. + Both new and old ABI detect this case (rdar://5774578 rdar://6924114) + + Compile-time layout of LessWeakSub: + [0 scan] isa + [1 weak] superIvar + [2 scan] subIvar + + Runtime layout of LessWeakSub: + [0 scan] isa + [1 scan] superIvar + [2 scan] subIvar + */ + testassert(class_getInstanceSize([LessWeakSub class]) == 3*sizeof(void*)); + if (objc_collecting_enabled()) { + const char *layout; + layout = class_getIvarLayout([LessWeakSub class]); + testassert(layout == NULL); + + layout = class_getWeakIvarLayout([LessWeakSub class]); + testassert(layout == NULL); + } + + + /* + Weak -> non-strong + Classes do not change size, but GC layouts must be updated. + Old ABI intentionally does not detect this case (rdar://5774578) + + Compile-time layout of LessWeak2Sub: + [0 scan] isa + [1 weak] superIvar + [2 scan] subIvar + + Runtime layout of LessWeak2Sub: + [0 scan] isa + [1 skip] superIvar + [2 scan] subIvar + */ + testassert(class_getInstanceSize([LessWeak2Sub class]) == 3*sizeof(void*)); + if (objc_collecting_enabled()) { + const char *layout; + layout = class_getIvarLayout([LessWeak2Sub class]); + testassert(0 == strcmp(layout, "\x01\x11") || + 0 == strcmp(layout, "\x01\x10\x01")); + + layout = class_getWeakIvarLayout([LessWeak2Sub class]); +#if __OBJC2__ + testassert(layout == NULL); +#else + testassert(0 == strcmp(layout, "\x11\x10")); +#endif + } + + + succeed(basename(argv[0])); + return 0; +} diff --git a/test/layout.m b/test/layout.m new file mode 100644 index 0000000..181e47d --- /dev/null +++ b/test/layout.m @@ -0,0 +1,94 @@ +#include "test.h" +#include +#include + +@class NSObject; + +void printlayout(const char *name, const char *layout) +{ + testprintf("%s: ", name); + + if (!layout) { + testprintf("NULL\n"); + return; + } + + const char *c; + for (c = layout; *c; c++) { + testprintf("%02x ", *c); + } + + testprintf("00\n"); +} + + +@interface Super { id isa; } @end +@implementation Super @end + + +// strong: 0c 00 (0a00 without structs) +// weak: NULL +@interface AllScanned : Super { + id id1; + NSObject *o1; + __strong void *v1; + __strong intptr_t i1; + __strong long l1; + /* fixme + struct { + id id1; + id id2; + } str; + */ + id arr1[4]; +} +@end +@implementation AllScanned @end + +// strong: 00 +// weak: 1b 00 (18 00 without structs) +@interface AllWeak : Super { + __weak id id1; + __weak NSObject *o1; + __weak void *v1; + __weak intptr_t i1; + __weak long l1; + /* fixme + struct { + __weak id id1; + __weak id id2; + } str; + */ + __weak id arr1[4]; +} +@end +@implementation AllWeak @end + +// strong: "" +// weak: NULL +@interface NoScanned { long i; } @end +@implementation NoScanned @end + +int main() +{ + const char *layout; + + layout = class_getIvarLayout(objc_getClass("AllScanned")); + printlayout("AllScanned", layout); + layout = class_getWeakIvarLayout(objc_getClass("AllScanned")); + printlayout("AllScanned weak", layout); + // testassert(0 == strcmp(layout, "\x0a")); + + layout = class_getIvarLayout(objc_getClass("AllWeak")); + printlayout("AllWeak", layout); + layout = class_getWeakIvarLayout(objc_getClass("AllWeak")); + printlayout("AllWeak weak", layout); + // testassert(0 == strcmp(layout, "")); + + layout = class_getIvarLayout(objc_getClass("NoScanned")); + printlayout("NoScanned", layout); + // testassert(0 == strcmp(layout, "")); + + succeed(__FILE__); + return 0; +} diff --git a/test/load-order.m b/test/load-order.m new file mode 100644 index 0000000..79d68e4 --- /dev/null +++ b/test/load-order.m @@ -0,0 +1,9 @@ +#include "test.h" + +extern int state1, state2, state3; + +int main() +{ + testassert(state1 == 1 && state2 == 2 && state3 == 3); + succeed(__FILE__); +} diff --git a/test/load-order1.m b/test/load-order1.m new file mode 100644 index 0000000..54fe530 --- /dev/null +++ b/test/load-order1.m @@ -0,0 +1,14 @@ +#include "test.h" + +extern int state2, state3; + +int state1 = 0; + +@interface One @end +@implementation One ++(void)load +{ + testassert(state2 == 2 && state3 == 3); + state1 = 1; +} +@end diff --git a/test/load-order2.m b/test/load-order2.m new file mode 100644 index 0000000..ad2e1ac --- /dev/null +++ b/test/load-order2.m @@ -0,0 +1,14 @@ +#include "test.h" + +extern int state3; + +int state2 = 0; + +@interface Two @end +@implementation Two ++(void)load +{ + testassert(state3 == 3); + state2 = 2; +} +@end diff --git a/test/load-order3.m b/test/load-order3.m new file mode 100644 index 0000000..80a936a --- /dev/null +++ b/test/load-order3.m @@ -0,0 +1,11 @@ +#include "test.h" + +int state3 = 0; + +@interface Three @end +@implementation Three ++(void)load +{ + state3 = 3; +} +@end diff --git a/test/load-parallel.m b/test/load-parallel.m new file mode 100644 index 0000000..db31191 --- /dev/null +++ b/test/load-parallel.m @@ -0,0 +1,46 @@ +#include "test.h" + +#include +#include + +#ifndef COUNT +#error -DCOUNT=c missing +#endif + +extern int state; + +void *thread(void *arg) +{ + uintptr_t num = (uintptr_t)arg; + char *buf; + + objc_registerThreadWithCollector(); + + asprintf(&buf, "load-parallel%lu.out", (unsigned long)num); + testprintf("%s\n", buf); + void *dlh = dlopen(buf, RTLD_LAZY); + if (!dlh) { + fail("dlopen failed: %s", dlerror()); + } + + return NULL; +} + +int main() +{ + pthread_t t[COUNT]; + uintptr_t i; + + for (i = 0; i < COUNT; i++) { + pthread_create(&t[i], NULL, thread, (void *)i); + } + + for (i = 0; i < COUNT; i++) { + pthread_join(t[i], NULL); + } + + testprintf("loaded %d/%d\n", state, COUNT*26); + testassert(state == COUNT*26); + + succeed(__FILE__); +} diff --git a/test/load-parallel0.m b/test/load-parallel0.m new file mode 100644 index 0000000..dc410d6 --- /dev/null +++ b/test/load-parallel0.m @@ -0,0 +1,44 @@ +#ifndef N +#error -DN=n missing +#endif + +#include +#include +#include +#include +extern int state; + +#define CLASS0(n,nn) \ + @interface C_##n##_##nn @end \ + @implementation C_##n##_##nn \ + +(void)load { OSAtomicIncrement32(&state); usleep(10); } \ + @end + +#define CLASS(n,nn) CLASS0(n,nn) + +CLASS(a,N) +CLASS(b,N) +CLASS(c,N) +CLASS(d,N) +CLASS(e,N) +CLASS(f,N) +CLASS(g,N) +CLASS(h,N) +CLASS(i,N) +CLASS(j,N) +CLASS(k,N) +CLASS(l,N) +CLASS(m,N) +CLASS(n,N) +CLASS(o,N) +CLASS(p,N) +CLASS(q,N) +CLASS(r,N) +CLASS(s,N) +CLASS(t,N) +CLASS(u,N) +CLASS(v,N) +CLASS(w,N) +CLASS(x,N) +CLASS(y,N) +CLASS(z,N) diff --git a/test/load-parallel00.m b/test/load-parallel00.m new file mode 100644 index 0000000..4bef2b6 --- /dev/null +++ b/test/load-parallel00.m @@ -0,0 +1 @@ +int state = 0; diff --git a/test/load-reentrant.m b/test/load-reentrant.m new file mode 100644 index 0000000..d1740e4 --- /dev/null +++ b/test/load-reentrant.m @@ -0,0 +1,28 @@ +#include "test.h" +#include + +int state1 = 0; +int *state2_p; + +@interface One @end +@implementation One ++(void)load +{ + state1 = 111; + + // Re-entrant +load doesn't get to complete until we do + void *dlh = dlopen("libload-reentrant2.dylib", RTLD_LAZY); + testassert(dlh); + state2_p = (int *)dlsym(dlh, "state2"); + testassert(state2_p); + testassert(*state2_p == 0); + + state1 = 1; +} +@end + +int main() +{ + testassert(state1 == 1 && state2_p && *state2_p == 2); + succeed(__FILE__); +} diff --git a/test/load-reentrant2.m b/test/load-reentrant2.m new file mode 100644 index 0000000..78d897f --- /dev/null +++ b/test/load-reentrant2.m @@ -0,0 +1,22 @@ +#include "test.h" + +int state2 = 0; +extern int state1; + +static void ctor(void) __attribute__((constructor)); +static void ctor(void) +{ + // should be called during One's dlopen(), before Two's +load + testassert(state1 == 111); + testassert(state2 == 0); +} + +@interface Two @end +@implementation Two ++(void) load +{ + // Does not run until One's +load completes + testassert(state1 == 1); + state2 = 2; +} +@end diff --git a/test/load.m b/test/load.m new file mode 100644 index 0000000..6158d9a --- /dev/null +++ b/test/load.m @@ -0,0 +1,82 @@ +#include "test.h" + +int state = 0; +int catstate = 0; + +@interface Super { id isa; } @end +@implementation Super ++class { return self; } ++(void)initialize { + if (self == [Super class]) { + testprintf("in +[Super initialize]\n"); + testassert(state == 2); + state = 3; + } else { + testprintf("in +[Super initialize] on behalf of Sub\n"); + testassert(state == 3); + state = 4; + } +} +-(void)load { fail("-[Super load] called!"); } ++(void)load { + testprintf("in +[Super load]\n"); + testassert(state == 0); + state = 1; +} +@end + +@interface Sub : Super { } @end +@implementation Sub ++(void)load { + testprintf("in +[Sub load]\n"); + testassert(state == 1); + state = 2; +} +-(void)load { fail("-[Sub load] called!"); } +@end + +@interface SubNoLoad : Super { } @end +@implementation SubNoLoad @end + +@interface Super (Category) @end +@implementation Super (Category) +-(void)load { fail("-[Super(Category) load called!"); } ++(void)load { + testprintf("in +[Super(Category) load]\n"); + testassert(state >= 1); + catstate++; +} +@end + + +@interface Sub (Category) @end +@implementation Sub (Category) +-(void)load { fail("-[Sub(Category) load called!"); } ++(void)load { + testprintf("in +[Sub(Category) load]\n"); + testassert(state >= 2); + catstate++; +} +@end + + +@interface SubNoLoad (Category) @end +@implementation SubNoLoad (Category) +-(void)load { fail("-[SubNoLoad(Category) load called!"); } ++(void)load { + testprintf("in +[SubNoLoad(Category) load]\n"); + testassert(state >= 1); + catstate++; +} +@end + +int main() +{ + testassert(state == 2); + testassert(catstate == 3); + [Sub class]; + testassert(state == 4); + testassert(catstate == 3); + + succeed(__FILE__); +} diff --git a/test/main.m b/test/main.m new file mode 100644 index 0000000..54bd976 --- /dev/null +++ b/test/main.m @@ -0,0 +1,9 @@ +#include "test.h" + +@interface Main @end +@implementation Main @end + +int main(int argc __attribute__((unused)), char **argv) +{ + succeed(basename(argv[0])); +} diff --git a/test/methodArgs.m b/test/methodArgs.m new file mode 100644 index 0000000..ec13df2 --- /dev/null +++ b/test/methodArgs.m @@ -0,0 +1,147 @@ +#include "test.h" +#include +#include +#include + +@interface Super { id isa; } @end +@implementation Super ++(void)initialize { } ++class { return self; } ++(id)method:(int)arg { return (id)(intptr_t)arg; } +@end + + +int main() +{ + char buf[128]; + char *arg; + struct objc_method_description *desc; + Method m = class_getClassMethod([Super class], sel_registerName("method:")); + testassert(m); + + testassert(method_getNumberOfArguments(m) == 3); +#if !__OBJC2__ + testassert(method_getSizeOfArguments(m) == 12); +#endif + + arg = method_copyArgumentType(m, 0); + testassert(arg); + testassert(0 == strcmp(arg, "@")); + memset(buf, 1, 128); + method_getArgumentType(m, 0, buf, 1+strlen(arg)); + testassert(0 == strcmp(arg, buf)); + testassert(buf[1+strlen(arg)] == 1); + memset(buf, 1, 128); + method_getArgumentType(m, 0, buf, 2); + testassert(0 == strncmp(arg, buf, 2)); + testassert(buf[2] == 1); + free(arg); + + arg = method_copyArgumentType(m, 1); + testassert(arg); + testassert(0 == strcmp(arg, ":")); + memset(buf, 1, 128); + method_getArgumentType(m, 1, buf, 1+strlen(arg)); + testassert(0 == strcmp(arg, buf)); + testassert(buf[1+strlen(arg)] == 1); + memset(buf, 1, 128); + method_getArgumentType(m, 1, buf, 2); + testassert(0 == strncmp(arg, buf, 2)); + testassert(buf[2] == 1); + free(arg); + + arg = method_copyArgumentType(m, 2); + testassert(arg); + testassert(0 == strcmp(arg, "i")); + memset(buf, 1, 128); + method_getArgumentType(m, 2, buf, 1+strlen(arg)); + testassert(0 == strcmp(arg, buf)); + testassert(buf[1+strlen(arg)] == 1); + memset(buf, 1, 128); + method_getArgumentType(m, 2, buf, 2); + testassert(0 == strncmp(arg, buf, 2)); + testassert(buf[2] == 1); + free(arg); + + arg = method_copyArgumentType(m, 3); + testassert(!arg); + + arg = method_copyArgumentType(m, -1); + testassert(!arg); + + memset(buf, 1, 128); + method_getArgumentType(m, 3, buf, 127); + testassert(buf[0] == 0); + testassert(buf[1] == 0); + testassert(buf[127] == 1); + + memset(buf, 1, 128); + method_getArgumentType(m, -1, buf, 127); + testassert(buf[0] == 0); + testassert(buf[1] == 0); + testassert(buf[127] == 1); + + arg = method_copyReturnType(m); + testassert(arg); + testassert(0 == strcmp(arg, "@")); + memset(buf, 1, 128); + method_getReturnType(m, buf, 1+strlen(arg)); + testassert(0 == strcmp(arg, buf)); + testassert(buf[1+strlen(arg)] == 1); + memset(buf, 1, 128); + method_getReturnType(m, buf, 2); + testassert(0 == strncmp(arg, buf, 2)); + testassert(buf[2] == 1); + free(arg); + + desc = method_getDescription(m); + testassert(desc); + testassert(desc->name == sel_registerName("method:")); +#if __LP64__ + testassert(0 == strcmp(desc->types, "@20@0:8i16")); +#else + testassert(0 == strcmp(desc->types, "@12@0:4i8")); +#endif + + testassert(0 == method_getNumberOfArguments(NULL)); +#if !__OBJC2__ + testassert(0 == method_getSizeOfArguments(NULL)); +#endif + testassert(NULL == method_copyArgumentType(NULL, 10)); + testassert(NULL == method_copyReturnType(NULL)); + testassert(NULL == method_getDescription(NULL)); + + memset(buf, 1, 128); + method_getArgumentType(NULL, 1, buf, 127); + testassert(buf[0] == 0); + testassert(buf[1] == 0); + testassert(buf[127] == 1); + + memset(buf, 1, 128); + method_getArgumentType(NULL, 1, buf, 0); + testassert(buf[0] == 1); + testassert(buf[1] == 1); + + method_getArgumentType(m, 1, NULL, 128); + method_getArgumentType(m, 1, NULL, 0); + method_getArgumentType(NULL, 1, NULL, 128); + method_getArgumentType(NULL, 1, NULL, 0); + + memset(buf, 1, 128); + method_getReturnType(NULL, buf, 127); + testassert(buf[0] == 0); + testassert(buf[1] == 0); + testassert(buf[127] == 1); + + memset(buf, 1, 128); + method_getReturnType(NULL, buf, 0); + testassert(buf[0] == 1); + testassert(buf[1] == 1); + + method_getReturnType(m, NULL, 128); + method_getReturnType(m, NULL, 0); + method_getReturnType(NULL, NULL, 128); + method_getReturnType(NULL, NULL, 0); + + succeed(__FILE__); +} diff --git a/test/method_getName.m b/test/method_getName.m new file mode 100644 index 0000000..fe6793d --- /dev/null +++ b/test/method_getName.m @@ -0,0 +1,20 @@ +#include "test.h" +#include +#include +#include "../runtime/objc-rtp.h" + +int main() { + unsigned i; + Class c = [NSObject class]; + unsigned numMethods; + Method *methods = class_copyMethodList(c, &numMethods); + + for (i=0; i method_getName crash on NSObject method when GC is enabled + SEL aMethod = method_getName(methods[i]); + if (aMethod == (SEL)kIgnore) + fail(__FILE__); + } + + succeed(__FILE__); +} diff --git a/test/msgSend.m b/test/msgSend.m new file mode 100644 index 0000000..6383c62 --- /dev/null +++ b/test/msgSend.m @@ -0,0 +1,501 @@ +#include "test.h" +#include +#include + +@interface Super { id isa; } ++class; +@end + +@interface Sub : Super @end + +static int state = 0; + +#if defined(__ppc__) || defined(__ppc64__) +// On ppc and ppc64, methods must be called with r12==IMP (i.e. indirect function call convention) +#define CHECK_R12(cls) \ +do { \ + IMP val; \ + __asm__ volatile ("mr %[val], r12\n" : [val] "=r" (val)); \ + testassert(val == method_getImplementation(class_getClassMethod([cls class], _cmd))); \ +} while (0); +#else +#define CHECK_R12(cls) do {/* empty */} while (0) +#endif + + +#define CHECK_ARGS(cls, sel) \ +do { \ + testassert(self == [cls class]); \ + testassert(_cmd == sel_registerName(#sel "::::::::::::::::::::::::::::"));\ + testassert(i1 == 1); \ + testassert(i2 == 2); \ + testassert(i3 == 3); \ + testassert(i4 == 4); \ + testassert(i5 == 5); \ + testassert(i6 == 6); \ + testassert(i7 == 7); \ + testassert(i8 == 8); \ + testassert(i9 == 9); \ + testassert(i10 == 10); \ + testassert(i11 == 11); \ + testassert(i12 == 12); \ + testassert(i13 == 13); \ + testassert(f1 == 1.0); \ + testassert(f2 == 2.0); \ + testassert(f3 == 3.0); \ + testassert(f4 == 4.0); \ + testassert(f5 == 5.0); \ + testassert(f6 == 6.0); \ + testassert(f7 == 7.0); \ + testassert(f8 == 8.0); \ + testassert(f9 == 9.0); \ + testassert(f10 == 10.0); \ + testassert(f11 == 11.0); \ + testassert(f12 == 12.0); \ + testassert(f13 == 13.0); \ + testassert(f14 == 14.0); \ + testassert(f15 == 15.0); \ +} while (0) + +struct stret { + int a; + int b; + int c; + int d; + int e; + int pad[32]; // force stack return on ppc64 +}; + +BOOL stret_equal(struct stret a, struct stret b) +{ + return (a.a == b.a && + a.b == b.b && + a.c == b.c && + a.d == b.d && + a.e == b.e); +} + +id ID_RESULT = (id)0x12345678; +long long LL_RESULT = __LONG_LONG_MAX__ - 2LL*__INT_MAX__; +struct stret STRET_RESULT = {1, 2, 3, 4, 5, {0}}; +double FP_RESULT = __DBL_MIN__ + __DBL_EPSILON__; +long double LFP_RESULT = __LDBL_MIN__ + __LDBL_EPSILON__; + + +@implementation Super ++class { return self; } ++(void)initialize { } + ++(id)idret: + (int)i1:(int)i2:(int)i3:(int)i4:(int)i5:(int)i6:(int)i7:(int)i8:(int)i9:(int)i10:(int)i11:(int)i12:(int)i13 :(double)f1:(double)f2:(double)f3:(double)f4:(double)f5:(double)f6:(double)f7:(double)f8:(double)f9:(double)f10:(double)f11:(double)f12:(double)f13:(double)f14:(double)f15 +{ + CHECK_R12(Super); + if (state == 10) CHECK_ARGS(Sub, idret); + else CHECK_ARGS(Super, idret); + state = 1; + return ID_RESULT; +} + ++(long long)llret: + (int)i1:(int)i2:(int)i3:(int)i4:(int)i5:(int)i6:(int)i7:(int)i8:(int)i9:(int)i10:(int)i11:(int)i12:(int)i13 :(double)f1:(double)f2:(double)f3:(double)f4:(double)f5:(double)f6:(double)f7:(double)f8:(double)f9:(double)f10:(double)f11:(double)f12:(double)f13:(double)f14:(double)f15 +{ + CHECK_R12(Super); + if (state == 10) CHECK_ARGS(Sub, llret); + else CHECK_ARGS(Super, llret); + state = 2; + return LL_RESULT; +} + ++(struct stret)stret: + (int)i1:(int)i2:(int)i3:(int)i4:(int)i5:(int)i6:(int)i7:(int)i8:(int)i9:(int)i10:(int)i11:(int)i12:(int)i13 :(double)f1:(double)f2:(double)f3:(double)f4:(double)f5:(double)f6:(double)f7:(double)f8:(double)f9:(double)f10:(double)f11:(double)f12:(double)f13:(double)f14:(double)f15 +{ + CHECK_R12(Super); + if (state == 10) CHECK_ARGS(Sub, stret); + else CHECK_ARGS(Super, stret); + state = 3; + return STRET_RESULT; +} + ++(double)fpret: + (int)i1:(int)i2:(int)i3:(int)i4:(int)i5:(int)i6:(int)i7:(int)i8:(int)i9:(int)i10:(int)i11:(int)i12:(int)i13 :(double)f1:(double)f2:(double)f3:(double)f4:(double)f5:(double)f6:(double)f7:(double)f8:(double)f9:(double)f10:(double)f11:(double)f12:(double)f13:(double)f14:(double)f15 +{ + CHECK_R12(Super); + if (state == 10) CHECK_ARGS(Sub, fpret); + else CHECK_ARGS(Super, fpret); + state = 4; + return FP_RESULT; +} + ++(long double)lfpret: + (int)i1:(int)i2:(int)i3:(int)i4:(int)i5:(int)i6:(int)i7:(int)i8:(int)i9:(int)i10:(int)i11:(int)i12:(int)i13 :(double)f1:(double)f2:(double)f3:(double)f4:(double)f5:(double)f6:(double)f7:(double)f8:(double)f9:(double)f10:(double)f11:(double)f12:(double)f13:(double)f14:(double)f15 +{ + CHECK_R12(Super); + if (state == 10) CHECK_ARGS(Sub, lfpret); + else CHECK_ARGS(Super, lfpret); + state = 5; + return LFP_RESULT; +} + + +-(id)idret: + (int)i1:(int)i2:(int)i3:(int)i4:(int)i5:(int)i6:(int)i7:(int)i8:(int)i9:(int)i10:(int)i11:(int)i12:(int)i13 :(double)f1:(double)f2:(double)f3:(double)f4:(double)f5:(double)f6:(double)f7:(double)f8:(double)f9:(double)f10:(double)f11:(double)f12:(double)f13:(double)f14:(double)f15 +{ + fail("-idret called instead of +idret"); + CHECK_ARGS(Super, idret); +} + +-(long long)llret: + (int)i1:(int)i2:(int)i3:(int)i4:(int)i5:(int)i6:(int)i7:(int)i8:(int)i9:(int)i10:(int)i11:(int)i12:(int)i13 :(double)f1:(double)f2:(double)f3:(double)f4:(double)f5:(double)f6:(double)f7:(double)f8:(double)f9:(double)f10:(double)f11:(double)f12:(double)f13:(double)f14:(double)f15 +{ + fail("-llret called instead of +llret"); + CHECK_ARGS(Super, llret); +} + +-(struct stret)stret: + (int)i1:(int)i2:(int)i3:(int)i4:(int)i5:(int)i6:(int)i7:(int)i8:(int)i9:(int)i10:(int)i11:(int)i12:(int)i13 :(double)f1:(double)f2:(double)f3:(double)f4:(double)f5:(double)f6:(double)f7:(double)f8:(double)f9:(double)f10:(double)f11:(double)f12:(double)f13:(double)f14:(double)f15 +{ + fail("-stret called instead of +stret"); + CHECK_ARGS(Super, stret); +} + +-(double)fpret: + (int)i1:(int)i2:(int)i3:(int)i4:(int)i5:(int)i6:(int)i7:(int)i8:(int)i9:(int)i10:(int)i11:(int)i12:(int)i13 :(double)f1:(double)f2:(double)f3:(double)f4:(double)f5:(double)f6:(double)f7:(double)f8:(double)f9:(double)f10:(double)f11:(double)f12:(double)f13:(double)f14:(double)f15 +{ + fail("-fpret called instead of +fpret"); + CHECK_ARGS(Super, fpret); +} + +-(long double)lfpret: + (int)i1:(int)i2:(int)i3:(int)i4:(int)i5:(int)i6:(int)i7:(int)i8:(int)i9:(int)i10:(int)i11:(int)i12:(int)i13 :(double)f1:(double)f2:(double)f3:(double)f4:(double)f5:(double)f6:(double)f7:(double)f8:(double)f9:(double)f10:(double)f11:(double)f12:(double)f13:(double)f14:(double)f15 +{ + fail("-lfpret called instead of +lfpret"); + CHECK_ARGS(Super, lfpret); +} + +@end + + +@implementation Sub + ++(id)idret: + (int)i1:(int)i2:(int)i3:(int)i4:(int)i5:(int)i6:(int)i7:(int)i8:(int)i9:(int)i10:(int)i11:(int)i12:(int)i13 :(double)f1:(double)f2:(double)f3:(double)f4:(double)f5:(double)f6:(double)f7:(double)f8:(double)f9:(double)f10:(double)f11:(double)f12:(double)f13:(double)f14:(double)f15 +{ + id result; + CHECK_R12(Sub); + CHECK_ARGS(Sub, idret); + state = 10; + result = [super idret:i1:i2:i3:i4:i5:i6:i7:i8:i9:i10:i11:i12:i13:f1:f2:f3:f4:f5:f6:f7:f8:f9:f10:f11:f12:f13:f14:f15]; + testassert(state == 1); + testassert(result == ID_RESULT); + state = 11; + return result; +} + ++(long long)llret: + (int)i1:(int)i2:(int)i3:(int)i4:(int)i5:(int)i6:(int)i7:(int)i8:(int)i9:(int)i10:(int)i11:(int)i12:(int)i13 :(double)f1:(double)f2:(double)f3:(double)f4:(double)f5:(double)f6:(double)f7:(double)f8:(double)f9:(double)f10:(double)f11:(double)f12:(double)f13:(double)f14:(double)f15 +{ + long long result; + CHECK_R12(Sub); + CHECK_ARGS(Sub, llret); + state = 10; + result = [super llret:i1:i2:i3:i4:i5:i6:i7:i8:i9:i10:i11:i12:i13:f1:f2:f3:f4:f5:f6:f7:f8:f9:f10:f11:f12:f13:f14:f15]; + testassert(state == 2); + testassert(result == LL_RESULT); + state = 12; + return result; +} + ++(struct stret)stret: + (int)i1:(int)i2:(int)i3:(int)i4:(int)i5:(int)i6:(int)i7:(int)i8:(int)i9:(int)i10:(int)i11:(int)i12:(int)i13 :(double)f1:(double)f2:(double)f3:(double)f4:(double)f5:(double)f6:(double)f7:(double)f8:(double)f9:(double)f10:(double)f11:(double)f12:(double)f13:(double)f14:(double)f15 +{ + struct stret result; + CHECK_R12(Sub); + CHECK_ARGS(Sub, stret); + state = 10; + result = [super stret:i1:i2:i3:i4:i5:i6:i7:i8:i9:i10:i11:i12:i13:f1:f2:f3:f4:f5:f6:f7:f8:f9:f10:f11:f12:f13:f14:f15]; + testassert(state == 3); + testassert(stret_equal(result, STRET_RESULT)); + state = 13; + return result; +} + ++(double)fpret: + (int)i1:(int)i2:(int)i3:(int)i4:(int)i5:(int)i6:(int)i7:(int)i8:(int)i9:(int)i10:(int)i11:(int)i12:(int)i13 :(double)f1:(double)f2:(double)f3:(double)f4:(double)f5:(double)f6:(double)f7:(double)f8:(double)f9:(double)f10:(double)f11:(double)f12:(double)f13:(double)f14:(double)f15 +{ + double result; + CHECK_R12(Sub); + CHECK_ARGS(Sub, fpret); + state = 10; + result = [super fpret:i1:i2:i3:i4:i5:i6:i7:i8:i9:i10:i11:i12:i13:f1:f2:f3:f4:f5:f6:f7:f8:f9:f10:f11:f12:f13:f14:f15]; + testassert(state == 4); + testassert(result == FP_RESULT); + state = 14; + return result; +} + ++(long double)lfpret: + (int)i1:(int)i2:(int)i3:(int)i4:(int)i5:(int)i6:(int)i7:(int)i8:(int)i9:(int)i10:(int)i11:(int)i12:(int)i13 :(double)f1:(double)f2:(double)f3:(double)f4:(double)f5:(double)f6:(double)f7:(double)f8:(double)f9:(double)f10:(double)f11:(double)f12:(double)f13:(double)f14:(double)f15 +{ + long double result; + CHECK_R12(Sub); + CHECK_ARGS(Sub, lfpret); + state = 10; + result = [super lfpret:i1:i2:i3:i4:i5:i6:i7:i8:i9:i10:i11:i12:i13:f1:f2:f3:f4:f5:f6:f7:f8:f9:f10:f11:f12:f13:f14:f15]; + testassert(state == 5); + testassert(result == LFP_RESULT); + state = 15; + return result; +} + + + +// performance-test code (do nothing for better comparability) + ++(id)idret_perf +{ + return ID_RESULT; +} + ++(long long)llret_perf +{ + return LL_RESULT; +} + ++(struct stret)stret_perf +{ + return STRET_RESULT; +} + ++(double)fpret_perf +{ + return FP_RESULT; +} + ++(long double)lfpret_perf +{ + return LFP_RESULT; +} +@end + + +int main() +{ + int i; + + id idval; + long long llval; + struct stret stretval; + double fpval; + long double lfpval; + + uint64_t startTime; + uint64_t totalTime; + uint64_t targetTime; + + Method idmethod; + Method llmethod; + Method stretmethod; + Method fpmethod; + Method lfpmethod; + + id (*idfn)(id, Method, int, int, int, int, int, int, int, int, int, int, int, int, int, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double); + long long (*llfn)(id, Method, int, int, int, int, int, int, int, int, int, int, int, int, int, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double); + struct stret (*stretfn)(id, Method, int, int, int, int, int, int, int, int, int, int, int, int, int, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double); + double (*fpfn)(id, Method, int, int, int, int, int, int, int, int, int, int, int, int, int, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double); + long double (*lfpfn)(id, Method, int, int, int, int, int, int, int, int, int, int, int, int, int, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double); + + struct stret zero = {0, 0, 0, 0, 0, {0}}; + + // get +initialize out of the way + [Sub class]; + + idmethod = class_getClassMethod([Super class], @selector(idret::::::::::::::::::::::::::::)); + testassert(idmethod); + llmethod = class_getClassMethod([Super class], @selector(llret::::::::::::::::::::::::::::)); + testassert(llmethod); + stretmethod = class_getClassMethod([Super class], @selector(stret::::::::::::::::::::::::::::)); + testassert(stretmethod); + fpmethod = class_getClassMethod([Super class], @selector(fpret::::::::::::::::::::::::::::)); + testassert(fpmethod); + lfpmethod = class_getClassMethod([Super class], @selector(lfpret::::::::::::::::::::::::::::)); + testassert(lfpmethod); + + idfn = (id (*)(id, Method, int, int, int, int, int, int, int, int, int, int, int, int, int, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double)) method_invoke; + llfn = (long long (*)(id, Method, int, int, int, int, int, int, int, int, int, int, int, int, int, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double)) method_invoke; + stretfn = (struct stret (*)(id, Method, int, int, int, int, int, int, int, int, int, int, int, int, int, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double)) method_invoke_stret; + fpfn = (double (*)(id, Method, int, int, int, int, int, int, int, int, int, int, int, int, int, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double)) method_invoke; + lfpfn = (long double (*)(id, Method, int, int, int, int, int, int, int, int, int, int, int, int, int, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double)) method_invoke; + + // message uncached + // message uncached long long + // message uncached stret + // message uncached fpret + // message uncached fpret long double + // message cached + // message cached long long + // message cached stret + // message cached fpret + // message cached fpret long double + // fixme verify that uncached lookup didn't happen the 2nd time? + for (i = 0; i < 5; i++) { + state = 0; + idval = nil; + idval = [Sub idret :1:2:3:4:5:6:7:8:9:10:11:12:13:1.0:2.0:3.0:4.0:5.0:6.0:7.0:8.0:9.0:10.0:11.0:12.0:13.0:14.0:15.0]; + testassert(state == 11); + testassert(idval == ID_RESULT); + + llval = 0; + llval = [Sub llret :1:2:3:4:5:6:7:8:9:10:11:12:13:1.0:2.0:3.0:4.0:5.0:6.0:7.0:8.0:9.0:10.0:11.0:12.0:13.0:14.0:15.0]; + testassert(state == 12); + testassert(llval == LL_RESULT); + + stretval = zero; + stretval = [Sub stret :1:2:3:4:5:6:7:8:9:10:11:12:13:1.0:2.0:3.0:4.0:5.0:6.0:7.0:8.0:9.0:10.0:11.0:12.0:13.0:14.0:15.0]; + testassert(state == 13); + testassert(stret_equal(stretval, STRET_RESULT)); + + fpval = 0; + fpval = [Sub fpret :1:2:3:4:5:6:7:8:9:10:11:12:13:1.0:2.0:3.0:4.0:5.0:6.0:7.0:8.0:9.0:10.0:11.0:12.0:13.0:14.0:15.0]; + testassert(state == 14); + testassert(fpval == FP_RESULT); + + lfpval = 0; + lfpval = [Sub lfpret :1:2:3:4:5:6:7:8:9:10:11:12:13:1.0:2.0:3.0:4.0:5.0:6.0:7.0:8.0:9.0:10.0:11.0:12.0:13.0:14.0:15.0]; + testassert(state == 15); + testassert(lfpval == LFP_RESULT); + } + + // cached message performance + // catches failure to cache or (abi=2) failure to fixup (#5584187) + // fixme unless they all fail + // `.align 4` matches loop alignment to make -O0 work +#define COUNT 1000000 + [Sub idret_perf]; + startTime = mach_absolute_time(); + asm(".align 4"); + for (i = 0; i < COUNT; i++) { + [Sub idret_perf]; + } + totalTime = mach_absolute_time() - startTime; + testprintf("idret %llu\n", totalTime); + targetTime = totalTime; + + [Sub llret_perf]; + startTime = mach_absolute_time(); + asm(".align 4"); + for (i = 0; i < COUNT; i++) { + [Sub llret_perf]; + } + totalTime = mach_absolute_time() - startTime; + testprintf("llret %llu\n", totalTime); + timeassert(totalTime > targetTime * 0.8 && totalTime < targetTime * 2.0); + + [Sub stret_perf]; + startTime = mach_absolute_time(); + asm(".align 4"); + for (i = 0; i < COUNT; i++) { + [Sub stret_perf]; + } + totalTime = mach_absolute_time() - startTime; + testprintf("stret %llu\n", totalTime); + timeassert(totalTime > targetTime * 0.8 && totalTime < targetTime * 5.0); + + [Sub fpret_perf]; + startTime = mach_absolute_time(); + asm(".align 4"); + for (i = 0; i < COUNT; i++) { + [Sub fpret_perf]; + } + totalTime = mach_absolute_time() - startTime; + testprintf("fpret %llu\n", totalTime); + timeassert(totalTime > targetTime * 0.8 && totalTime < targetTime * 2.0); + + [Sub lfpret_perf]; + startTime = mach_absolute_time(); + asm(".align 4"); + for (i = 0; i < COUNT; i++) { + [Sub lfpret_perf]; + } + totalTime = mach_absolute_time() - startTime; + testprintf("lfpret %llu\n", totalTime); + timeassert(totalTime > targetTime * 0.8 && totalTime < targetTime * 2.0); +#undef COUNT + + // method_invoke + // method_invoke long long + // method_invoke_stret stret + // method_invoke_stret fpret + // method_invoke fpret long double + + state = 0; + idval = nil; + idval = (*idfn)([Super class], idmethod, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0); + testassert(state == 1); + testassert(idval == ID_RESULT); + + llval = 0; + llval = (*llfn)([Super class], llmethod, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0); + testassert(state == 2); + testassert(llval == LL_RESULT); + + stretval = zero; + stretval = (*stretfn)([Super class], stretmethod, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0); + testassert(state == 3); + testassert(stret_equal(stretval, STRET_RESULT)); + + fpval = 0; + fpval = (*fpfn)([Super class], fpmethod, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0); + testassert(state == 4); + testassert(fpval == FP_RESULT); + + lfpval = 0; + lfpval = (*lfpfn)([Super class], lfpmethod, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0); + testassert(state == 5); + testassert(lfpval == LFP_RESULT); + + + // message to nil + // message to nil long long + // message to nil stret + // message to nil fpret + // message to nil fpret long double + state = 0; + idval = ID_RESULT; + idval = [(id)nil idret :1:2:3:4:5:6:7:8:9:10:11:12:13:1.0:2.0:3.0:4.0:5.0:6.0:7.0:8.0:9.0:10.0:11.0:12.0:13.0:14.0:15.0]; + testassert(state == 0); + testassert(idval == nil); + + state = 0; + llval = LL_RESULT; + llval = [(id)nil llret :1:2:3:4:5:6:7:8:9:10:11:12:13:1.0:2.0:3.0:4.0:5.0:6.0:7.0:8.0:9.0:10.0:11.0:12.0:13.0:14.0:15.0]; + testassert(state == 0); + testassert(llval == 0LL); + + state = 0; + stretval = zero; + stretval = [(id)nil stret :1:2:3:4:5:6:7:8:9:10:11:12:13:1.0:2.0:3.0:4.0:5.0:6.0:7.0:8.0:9.0:10.0:11.0:12.0:13.0:14.0:15.0]; + testassert(state == 0); + // no stret result guarantee + + state = 0; + fpval = FP_RESULT; + fpval = [(id)nil fpret :1:2:3:4:5:6:7:8:9:10:11:12:13:1.0:2.0:3.0:4.0:5.0:6.0:7.0:8.0:9.0:10.0:11.0:12.0:13.0:14.0:15.0]; + testassert(state == 0); + testassert(fpval == 0.0); + + state = 0; + lfpval = LFP_RESULT; + lfpval = [(id)nil lfpret :1:2:3:4:5:6:7:8:9:10:11:12:13:1.0:2.0:3.0:4.0:5.0:6.0:7.0:8.0:9.0:10.0:11.0:12.0:13.0:14.0:15.0]; + testassert(state == 0); + testassert(lfpval == 0.0); + + + // message forwarded + // message forwarded long long + // message forwarded stret + // message forwarded fpret + // message forwarded fpret long double + // fixme + + succeed(__FILE__); +} diff --git a/test/nilAPIArgs.m b/test/nilAPIArgs.m new file mode 100644 index 0000000..e26ad12 --- /dev/null +++ b/test/nilAPIArgs.m @@ -0,0 +1,11 @@ +#include "test.h" + +#import + +int main() { + // ensure various bits of API don't crash when tossed nil parameters + class_conformsToProtocol(nil, nil); + method_setImplementation(nil, NULL); + + succeed(__FILE__); +} diff --git a/test/nsobject.m b/test/nsobject.m new file mode 100644 index 0000000..7e831c2 --- /dev/null +++ b/test/nsobject.m @@ -0,0 +1,24 @@ +#include "test.h" + +#import + +@interface Sub : NSObject { } @end +@implementation Sub ++allocWithZone:(NSZone *)zone { + testprintf("in +[Sub alloc]\n"); + return [super allocWithZone:zone]; + } +-(void)dealloc { + testprintf("in -[Sub dealloc]\n"); + [super dealloc]; +} +@end + +int main() +{ + NSAutoreleasePool *pool = [NSAutoreleasePool new]; + [[Sub new] autorelease]; + [pool release]; + + succeed(__FILE__); +} diff --git a/test/property.m b/test/property.m new file mode 100644 index 0000000..d62f45f --- /dev/null +++ b/test/property.m @@ -0,0 +1,65 @@ +#include "test.h" +#include +#include +#include + +@interface Super { + @public + id isa; + char superIvar; +} + +@property(readonly) char superProp; +@end + +@implementation Super +@synthesize superProp = superIvar; ++(void)initialize { } ++class { return self; } +@end + + +@interface Sub : Super { + @public + uintptr_t subIvar; +} +@property(readonly) uintptr_t subProp; +@end + +@implementation Sub +@synthesize subProp = subIvar; +@end + + +int main() +{ + /* + Runtime layout of Sub: + [0] isa + [1] superIvar + [2] subIvar + */ + + objc_property_t prop; + + prop = class_getProperty([Sub class], "subProp"); + testassert(prop); + + prop = class_getProperty([Super class], "superProp"); + testassert(prop); + testassert(prop == class_getProperty([Sub class], "superProp")); + + prop = class_getProperty([Super class], "subProp"); + testassert(!prop); + + prop = class_getProperty([Sub class]->isa, "subProp"); + testassert(!prop); + + + testassert(NULL == class_getProperty(NULL, "foo")); + testassert(NULL == class_getProperty([Sub class], NULL)); + testassert(NULL == class_getProperty(NULL, NULL)); + + succeed(__FILE__); + return 0; +} diff --git a/test/protocol.m b/test/protocol.m new file mode 100644 index 0000000..33214b8 --- /dev/null +++ b/test/protocol.m @@ -0,0 +1,202 @@ +#include "test.h" + +#include +#include +#include + +@protocol Proto1 ++proto1ClassMethod; +-proto1InstanceMethod; +@end + +@protocol Proto2 ++proto2ClassMethod; +-proto2InstanceMethod; +@end + +@protocol Proto3 ++proto3ClassMethod; +-proto3InstanceMethod; +@end + +@protocol Proto4 +@property int i; +@end + +@protocol ProtoEmpty +@end + +@interface Super { id isa; } @end +@implementation Super ++class { return self; } ++(void)initialize { } ++proto1ClassMethod { return self; } +-proto1InstanceMethod { return self; } +@end + +@interface SubNoProtocols : Super { } @end +@implementation SubNoProtocols @end + +@interface SuperNoProtocols { id isa; } @end +@implementation SuperNoProtocols ++class { return self; } ++(void)initialize { } +@end + +@interface SubProp : Super { int i; } @end +@implementation SubProp +@synthesize i; +@end + + +int main() +{ + Class cls; + Protocol **list; + Protocol *protocol, *empty; +#if !__OBJC2__ + struct objc_method_description *desc; +#endif + struct objc_method_description desc2; + objc_property_t *proplist; + unsigned int count; + + protocol = @protocol(Proto3); + empty = @protocol(ProtoEmpty); + testassert(protocol); + testassert(empty); + +#if !__OBJC2__ + testassert([protocol isKindOf:[Protocol class]]); + testassert([empty isKindOf:[Protocol class]]); + testassert(0 == strcmp([protocol name], "Proto3")); + testassert(0 == strcmp([empty name], "ProtoEmpty")); +#endif + testassert(0 == strcmp(protocol_getName(protocol), "Proto3")); + testassert(0 == strcmp(protocol_getName(empty), "ProtoEmpty")); + + testassert(class_conformsToProtocol([Super class], @protocol(Proto1))); + testassert(!class_conformsToProtocol([SubProp class], @protocol(Proto1))); + testassert(class_conformsToProtocol([SubProp class], @protocol(Proto4))); + testassert(!class_conformsToProtocol([SubProp class], @protocol(Proto3))); + testassert(!class_conformsToProtocol([Super class], @protocol(Proto3))); + + testassert(!protocol_conformsToProtocol(@protocol(Proto1), @protocol(Proto2))); + testassert(protocol_conformsToProtocol(@protocol(Proto3), @protocol(Proto2))); + testassert(!protocol_conformsToProtocol(@protocol(Proto2), @protocol(Proto3))); + +#if !__OBJC2__ + testassert([@protocol(Proto1) isEqual:@protocol(Proto1)]); + testassert(! [@protocol(Proto1) isEqual:@protocol(Proto2)]); +#endif + testassert(protocol_isEqual(@protocol(Proto1), @protocol(Proto1))); + testassert(! protocol_isEqual(@protocol(Proto1), @protocol(Proto2))); + +#if !__OBJC2__ + desc = [protocol descriptionForInstanceMethod:@selector(proto3InstanceMethod)]; + testassert(desc); + testassert(desc->name == @selector(proto3InstanceMethod)); + desc = [protocol descriptionForClassMethod:@selector(proto3ClassMethod)]; + testassert(desc); + testassert(desc->name == @selector(proto3ClassMethod)); + desc = [protocol descriptionForInstanceMethod:@selector(proto3ClassMethod)]; + testassert(!desc); + desc = [protocol descriptionForClassMethod:@selector(proto3InstanceMethod)]; + testassert(!desc); + desc = [empty descriptionForInstanceMethod:@selector(proto3ClassMethod)]; + testassert(!desc); + desc = [empty descriptionForClassMethod:@selector(proto3InstanceMethod)]; + testassert(!desc); +#endif + desc2 = protocol_getMethodDescription(protocol, @selector(proto3InstanceMethod), YES, YES); + testassert(desc2.name && desc2.types); + testassert(desc2.name == @selector(proto3InstanceMethod)); + desc2 = protocol_getMethodDescription(protocol, @selector(proto3ClassMethod), YES, NO); + testassert(desc2.name && desc2.types); + testassert(desc2.name == @selector(proto3ClassMethod)); + + desc2 = protocol_getMethodDescription(protocol, @selector(proto3ClassMethod), YES, YES); + testassert(!desc2.name && !desc2.types); + desc2 = protocol_getMethodDescription(protocol, @selector(proto3InstanceMethod), YES, NO); + testassert(!desc2.name && !desc2.types); + desc2 = protocol_getMethodDescription(empty, @selector(proto3ClassMethod), YES, YES); + testassert(!desc2.name && !desc2.types); + desc2 = protocol_getMethodDescription(empty, @selector(proto3InstanceMethod), YES, NO); + testassert(!desc2.name && !desc2.types); + + count = 100; + list = protocol_copyProtocolList(@protocol(Proto2), &count); + testassert(!list); + testassert(count == 0); + count = 100; + list = protocol_copyProtocolList(@protocol(Proto3), &count); + testassert(list); + testassert(count == 1); + testassert(protocol_isEqual(list[0], @protocol(Proto2))); + testassert(!list[1]); + free(list); + + count = 100; + cls = objc_getClass("Super"); + testassert(cls); + list = class_copyProtocolList(cls, &count); + testassert(list); + testassert(list[count] == NULL); + testassert(count == 1); + testassert(0 == strcmp(protocol_getName(list[0]), "Proto1")); + free(list); + + count = 100; + cls = objc_getClass("SuperNoProtocols"); + testassert(cls); + list = class_copyProtocolList(cls, &count); + testassert(!list); + testassert(count == 0); + + count = 100; + cls = objc_getClass("SubNoProtocols"); + testassert(cls); + list = class_copyProtocolList(cls, &count); + testassert(!list); + testassert(count == 0); + + + cls = objc_getClass("SuperNoProtocols"); + testassert(cls); + list = class_copyProtocolList(cls, NULL); + testassert(!list); + + cls = objc_getClass("Super"); + testassert(cls); + list = class_copyProtocolList(cls, NULL); + testassert(list); + free(list); + + count = 100; + list = class_copyProtocolList(NULL, &count); + testassert(!list); + testassert(count == 0); + + + // Check property added by protocol + cls = objc_getClass("SubProp"); + testassert(cls); + + count = 100; + list = class_copyProtocolList(cls, &count); + testassert(list); + testassert(count == 1); + testassert(0 == strcmp(protocol_getName(list[0]), "Proto4")); + testassert(list[1] == NULL); + free(list); + + count = 100; + proplist = class_copyPropertyList(cls, &count); + testassert(proplist); + testassert(count == 1); + testassert(0 == strcmp(property_getName(proplist[0]), "i")); + testassert(proplist[1] == NULL); + free(proplist); + + succeed(__FILE__); +} diff --git a/test/protocol_copyMethodList.m b/test/protocol_copyMethodList.m new file mode 100644 index 0000000..8847099 --- /dev/null +++ b/test/protocol_copyMethodList.m @@ -0,0 +1,141 @@ +#include "test.h" +#include +#include + +@protocol SuperMethods ++(void)SuperMethodClass; ++(void)SuperMethodClass2; +-(void)SuperMethodInstance; +-(void)SuperMethodInstance2; +@end + +@protocol SubMethods ++(void)SubMethodClass; ++(void)SubMethodClass2; +-(void)SubMethodInstance; +-(void)SubMethodInstance2; +@end + +@protocol SuperOptionalMethods +@optional ++(void)SuperOptMethodClass; ++(void)SuperOptMethodClass2; +-(void)SuperOptMethodInstance; +-(void)SuperOptMethodInstance2; +@end + +@protocol SubOptionalMethods +@optional ++(void)SubOptMethodClass; ++(void)SubOptMethodClass2; +-(void)SubOptMethodInstance; +-(void)SubOptMethodInstance2; +@end + +@protocol NoMethods @end + +static int isNamed(struct objc_method_description m, const char *name) +{ + return (m.name == sel_registerName(name)); +} + +int main() +{ + struct objc_method_description *methods; + unsigned int count; + Protocol *proto; + + proto = @protocol(SubMethods); + testassert(proto); + + // Check required methods + count = 999; + methods = protocol_copyMethodDescriptionList(proto, YES, YES, &count); + testassert(methods); + testassert(count == 2); + testassert((isNamed(methods[0], "SubMethodInstance") && + isNamed(methods[1], "SubMethodInstance2")) + || + (isNamed(methods[1], "SubMethodInstance") && + isNamed(methods[0], "SubMethodInstance2"))); + free(methods); + + count = 999; + methods = protocol_copyMethodDescriptionList(proto, YES, NO, &count); + testassert(methods); + testassert(count == 2); + testassert((isNamed(methods[0], "SubMethodClass") && + isNamed(methods[1], "SubMethodClass2")) + || + (isNamed(methods[1], "SubMethodClass") && + isNamed(methods[0], "SubMethodClass2"))); + free(methods); + + // Check lack of optional methods + count = 999; + methods = protocol_copyMethodDescriptionList(proto, NO, YES, &count); + testassert(!methods); + testassert(count == 0); + count = 999; + methods = protocol_copyMethodDescriptionList(proto, NO, NO, &count); + testassert(!methods); + testassert(count == 0); + + + proto = @protocol(SubOptionalMethods); + testassert(proto); + + // Check optional methods + count = 999; + methods = protocol_copyMethodDescriptionList(proto, NO, YES, &count); + testassert(methods); + testassert(count == 2); + testassert((isNamed(methods[0], "SubOptMethodInstance") && + isNamed(methods[1], "SubOptMethodInstance2")) + || + (isNamed(methods[1], "SubOptMethodInstance") && + isNamed(methods[0], "SubOptMethodInstance2"))); + free(methods); + + count = 999; + methods = protocol_copyMethodDescriptionList(proto, NO, NO, &count); + testassert(methods); + testassert(count == 2); + testassert((isNamed(methods[0], "SubOptMethodClass") && + isNamed(methods[1], "SubOptMethodClass2")) + || + (isNamed(methods[1], "SubOptMethodClass") && + isNamed(methods[0], "SubOptMethodClass2"))); + free(methods); + + // Check lack of required methods + count = 999; + methods = protocol_copyMethodDescriptionList(proto, YES, YES, &count); + testassert(!methods); + testassert(count == 0); + count = 999; + methods = protocol_copyMethodDescriptionList(proto, YES, NO, &count); + testassert(!methods); + testassert(count == 0); + + + // Check NULL protocol parameter + count = 999; + methods = protocol_copyMethodDescriptionList(NULL, YES, YES, &count); + testassert(!methods); + testassert(count == 0); + count = 999; + methods = protocol_copyMethodDescriptionList(NULL, YES, NO, &count); + testassert(!methods); + testassert(count == 0); + count = 999; + methods = protocol_copyMethodDescriptionList(NULL, NO, YES, &count); + testassert(!methods); + testassert(count == 0); + count = 999; + methods = protocol_copyMethodDescriptionList(NULL, NO, NO, &count); + testassert(!methods); + testassert(count == 0); + + succeed(__FILE__); +} diff --git a/test/protocol_copyPropertyList.m b/test/protocol_copyPropertyList.m new file mode 100644 index 0000000..af03d9a --- /dev/null +++ b/test/protocol_copyPropertyList.m @@ -0,0 +1,105 @@ +#include "test.h" +#include +#include +#include + +@protocol SuperProps +@property int prop1; +@property int prop2; +@end + +@protocol SubProps +@property int prop3; +@property int prop4; +@end + + +@protocol FourProps +@property int prop1; +@property int prop2; +@property int prop3; +@property int prop4; +@end + +@protocol NoProps @end + +static int isNamed(objc_property_t p, const char *name) +{ + return (0 == strcmp(name, property_getName(p))); +} + +int main() +{ + objc_property_t *props; + unsigned int count; + Protocol *proto; + + proto = @protocol(SubProps); + testassert(proto); + + count = 100; + props = protocol_copyPropertyList(proto, &count); + testassert(props); + testassert(count == 2); + testassert(isNamed(props[0], "prop4")); + testassert(isNamed(props[1], "prop3")); + // props[] should be null-terminated + testassert(props[2] == NULL); + free(props); + + proto = @protocol(SuperProps); + testassert(proto); + + count = 100; + props = protocol_copyPropertyList(proto, &count); + testassert(props); + testassert(count == 2); + testassert(isNamed(props[0], "prop2")); + testassert(isNamed(props[1], "prop1")); + // props[] should be null-terminated + testassert(props[2] == NULL); + free(props); + + // Check null-termination - this property list block would be 16 bytes + // if it weren't for the terminator + proto = @protocol(FourProps); + testassert(proto); + + count = 100; + props = protocol_copyPropertyList(proto, &count); + testassert(props); + testassert(count == 4); + testassert(malloc_size(props) >= 5 * sizeof(objc_property_t)); + testassert(props[3] != NULL); + testassert(props[4] == NULL); + free(props); + + // Check NULL count parameter + props = protocol_copyPropertyList(proto, NULL); + testassert(props); + testassert(props[4] == NULL); + testassert(props[3] != NULL); + free(props); + + // Check NULL protocol parameter + count = 100; + props = protocol_copyPropertyList(NULL, &count); + testassert(!props); + testassert(count == 0); + + // Check NULL protocol and count + props = protocol_copyPropertyList(NULL, NULL); + testassert(!props); + + // Check protocol with no properties + proto = @protocol(NoProps); + testassert(proto); + + count = 100; + props = protocol_copyPropertyList(proto, &count); + testassert(!props); + testassert(count == 0); + + succeed(__FILE__); + return 0; +} diff --git a/test/protocol_cw.m b/test/protocol_cw.m new file mode 100644 index 0000000..a35ee7c --- /dev/null +++ b/test/protocol_cw.m @@ -0,0 +1,36 @@ +#include "test.h" + +#if __OBJC2__ + +int main() +{ + succeed(__FILE__); +} + +#else + +// rdar://4951638 + +#include +#include + +char Protocol_name[] __attribute__((section("__OBJC,__class_names"))) = "Protocol"; + +struct { + void *isa; + char *protocol_name; + void *protocol_list; + void *instance_methods; + void *class_methods; +} Foo_protocol __attribute__((section("__OBJC,__protocol"))) = { Protocol_name, "Foo", 0, 0, 0 }; + +int main() +{ + Protocol *foo = objc_getProtocol("Foo"); + + testassert(foo == (Protocol *)&Foo_protocol); + testassert(0 == strcmp("Foo", [foo name])); + succeed(__FILE__); +} + +#endif diff --git a/test/resolve.expected-stderr b/test/resolve.expected-stderr new file mode 100644 index 0000000..1eca94b --- /dev/null +++ b/test/resolve.expected-stderr @@ -0,0 +1,3 @@ +objc\[\d+\]: \+\[Sub resolveClassMethod:lyingClassMethod\] returned YES, but no new implementation of \+\[Sub lyingClassMethod\] was found +objc\[\d+\]: \+\[Sub resolveInstanceMethod:lyingInstanceMethod\] returned YES, but no new implementation of -\[Sub lyingInstanceMethod\] was found +OK: resolve\.m diff --git a/test/resolve.m b/test/resolve.m new file mode 100644 index 0000000..a590b19 --- /dev/null +++ b/test/resolve.m @@ -0,0 +1,275 @@ +/* resolve.m + * Test +resolveClassMethod: and +resolveInstanceMethod: + */ + +#include "test.h" +#include +#include +#include + +// fixme new API? +extern void _objc_flush_caches(Class cls, BOOL flushMeta); + +static int state = 0; + +@interface Super { id isa; } @end +@interface Sub : Super @end + + +@implementation Super ++class { return self; } ++(void)initialize { + if (self == [Super class]) { + testassert(state == 1); + state = 2; + } +} ++new { return class_createInstance(self, 0); } +-(void)dealloc { object_dispose(self); } +-forward:(SEL)sel :(marg_list)args +{ + if (sel == @selector(missingClassMethod)) { + testassert(state == 21 || state == 25 || state == 80); + if (state == 21) state = 22; + if (state == 25) state = 26; + if (state == 80) state = 81;; + return nil; + } else if (sel == @selector(lyingClassMethod)) { + testassert(state == 31 || state == 35); + if (state == 31) state = 32; + if (state == 35) state = 36; + return nil; + } else if (sel == @selector(missingInstanceMethod)) { + testassert(state == 61 || state == 65); + if (state == 61) state = 62; + if (state == 65) state = 66; + return nil; + } else if (sel == @selector(lyingInstanceMethod)) { + testassert(state == 71 || state == 75); + if (state == 71) state = 72; + if (state == 75) state = 76; + return nil; + } + fail("forward:: shouldn't be called (sel %s)", sel_getName(sel)); + return args; // unused +} +@end + + +static id classMethod_c(id self, SEL sel) +{ + testassert(state == 4 || state == 10); + if (state == 4) state = 5; + if (state == 10) state = 11; + self = (id)sel; // unused + return [Super class]; +} + +static id instanceMethod_c(id self, SEL sel) +{ + testassert(state == 41 || state == 50); + if (state == 41) state = 42; + if (state == 50) state = 51; + self = (id)sel; // unused + return [Sub class]; +} + + +@implementation Sub + ++(void)method2 { } ++(void)method3 { } ++(void)method4 { } ++(void)method5 { } + ++(void)initialize { + if (self == [Sub class]) { + testassert(state == 2); + state = 3; + } +} + ++(BOOL)resolveClassMethod:(SEL)sel +{ + if (sel == @selector(classMethod)) { + testassert(state == 3); + state = 4; + class_addMethod(self->isa, sel, (IMP)&classMethod_c, ""); + return YES; + } else if (sel == @selector(missingClassMethod)) { + testassert(state == 20); + state = 21; + return NO; + } else if (sel == @selector(lyingClassMethod)) { + testassert(state == 30); + state = 31; + return YES; // lie + } else { + fail("+resolveClassMethod: called incorrectly (sel %s)", + sel_getName(sel)); + return NO; + } +} + ++(BOOL)resolveInstanceMethod:(SEL)sel +{ + if (sel == @selector(instanceMethod)) { + testassert(state == 40); + state = 41; + class_addMethod(self, sel, (IMP)instanceMethod_c, ""); + return YES; + } else if (sel == @selector(missingInstanceMethod)) { + testassert(state == 60); + state = 61; + return NO; + } else if (sel == @selector(lyingInstanceMethod)) { + testassert(state == 70); + state = 71; + return YES; // lie + } else { + fail("+resolveInstanceMethod: called incorrectly (sel %s)", + sel_getName(sel)); + return NO; + } +} + +@end + +@interface Super (MissingMethods) ++missingClassMethod; +@end + +@interface Sub (ResolvedMethods) ++classMethod; +-instanceMethod; ++missingClassMethod; +-missingInstanceMethod; ++lyingClassMethod; +-lyingInstanceMethod; +@end + + +int main() +{ + Sub *s; + id ret; + Class dup = objc_duplicateClass(objc_getClass("Sub"), "Sub_copy", 0); + + // Resolve a class method + // +initialize should fire first + state = 1; + ret = [Sub classMethod]; + testassert(state == 5); + testassert(ret == [Super class]); + + // Call it again, cached + // Resolver shouldn't be called again. + state = 10; + ret = [Sub classMethod]; + testassert(state == 11); + testassert(ret == [Super class]); + + _objc_flush_caches([Sub class]->isa, NO); + + // Call a method that won't get resolved + state = 20; + ret = [Sub missingClassMethod]; + testassert(state == 22); + testassert(ret == nil); + + // Call it again, cached + // Resolver shouldn't be called again. + state = 25; + ret = [Sub missingClassMethod]; + testassert(state == 26); + testassert(ret == nil); + + _objc_flush_caches([Sub class]->isa, NO); + + // Call a method that won't get resolved but the resolver lies about it + state = 30; + ret = [Sub lyingClassMethod]; + testassert(state == 32); + testassert(ret == nil); + + // Call it again, cached + // Resolver shouldn't be called again. + state = 35; + ret = [Sub lyingClassMethod]; + testassert(state == 36); + testassert(ret == nil); + + _objc_flush_caches([Sub class]->isa, NO); + + + // Resolve an instance method + s = [Sub new]; + state = 40; + ret = [s instanceMethod]; + testassert(state == 42); + testassert(ret == [Sub class]); + + // Call it again, cached + // Resolver shouldn't be called again. + state = 50; + ret = [s instanceMethod]; + testassert(state == 51); + testassert(ret == [Sub class]); + + _objc_flush_caches([Sub class], NO); + + // Call a method that won't get resolved + state = 60; + ret = [s missingInstanceMethod]; + testassert(state == 62); + testassert(ret == nil); + + // Call it again, cached + // Resolver shouldn't be called again. + state = 65; + ret = [s missingInstanceMethod]; + testassert(state == 66); + testassert(ret == nil); + + _objc_flush_caches([Sub class], NO); + + // Call a method that won't get resolved but the resolver lies about it + state = 70; + ret = [s lyingInstanceMethod]; + testassert(state == 72); + testassert(ret == nil); + + // Call it again, cached + // Resolver shouldn't be called again. + state = 75; + ret = [s lyingInstanceMethod]; + testassert(state == 76); + testassert(ret == nil); + + _objc_flush_caches([Sub class], NO); + + // Call a missing method on a class that doesn't support resolving + state = 80; + ret = [Super missingClassMethod]; + testassert(state == 81); + testassert(ret == nil); + [s dealloc]; + + // Resolve an instance method on a class duplicated before resolving + s = [dup new]; + state = 40; + ret = [s instanceMethod]; + testassert(state == 42); + testassert(ret == [Sub class]); + + // Call it again, cached + // Resolver shouldn't be called again. + state = 50; + ret = [s instanceMethod]; + testassert(state == 51); + testassert(ret == [Sub class]); + [s dealloc]; + + succeed(__FILE__); + return 0; +} diff --git a/test/runtime.expected-stderr b/test/runtime.expected-stderr new file mode 100644 index 0000000..ad64db4 --- /dev/null +++ b/test/runtime.expected-stderr @@ -0,0 +1,2 @@ +objc\[\d+\]: class `DoesNotExist\' not linked into application +OK: runtime.m diff --git a/test/runtime.m b/test/runtime.m new file mode 100644 index 0000000..ea44936 --- /dev/null +++ b/test/runtime.m @@ -0,0 +1,83 @@ +#include "test.h" + +#include +#include +#include +#include + +@interface Super { id isa; } @end +@implementation Super ++(void)initialize { } ++class { return self; } +@end + +@interface Sub : Super { } @end +@implementation Sub @end + + +int main() +{ + Class list[100]; + unsigned int count, count0; + unsigned int i; + int foundSuper; + int foundSub; + const char **names; + Dl_info info; + + [Super class]; + + // This shouldn't touch any classes. + dladdr(&_mh_execute_header, &info); + names = objc_copyClassNamesForImage(info.dli_fname, &count); + testassert(names); + testassert(count == 2); + testassert(names[count] == NULL); + foundSuper = 0; + foundSub = 0; + for (i = 0; i < count; i++) { + if (0 == strcmp(names[i], "Super")) foundSuper++; + if (0 == strcmp(names[i], "Sub")) foundSub++; + } + testassert(foundSuper == 1); + testassert(foundSub == 1); + + + // class Sub hasn't been touched - make sure it's in the class list too + count0 = objc_getClassList(NULL, 0); + testassert(count0 >= 2 && count0 < 100); + + list[count0-1] = NULL; + count = objc_getClassList(list, count0-1); + testassert(list[count0-1] == NULL); + testassert(count == count0); + + count = objc_getClassList(list, count0); + testassert(count == count0); + foundSuper = 0; + foundSub = 0; + for (i = 0; i < count; i++) { + if (0 == strcmp(class_getName(list[i]), "Super")) foundSuper++; + if (0 == strcmp(class_getName(list[i]), "Sub")) foundSub++; + // list should be non-meta classes only + testassert(!class_isMetaClass(list[i])); + } + testassert(foundSuper == 1); + testassert(foundSub == 1); + + // fixme check class handler + testassert(objc_getClass("Super") == [Super class]); + testassert(objc_getClass("DoesNotExist") == nil); + testassert(objc_getClass(NULL) == nil); + + testassert(objc_getMetaClass("Super") == [Super class]->isa); + testassert(objc_getMetaClass("DoesNotExist") == nil); + testassert(objc_getMetaClass(NULL) == nil); + + // fixme check class no handler + testassert(objc_lookUpClass("Super") == [Super class]); + testassert(objc_lookUpClass("DoesNotExist") == nil); + testassert(objc_lookUpClass(NULL) == nil); + + succeed(__FILE__); +} diff --git a/test/sel.m b/test/sel.m new file mode 100644 index 0000000..f272f63 --- /dev/null +++ b/test/sel.m @@ -0,0 +1,32 @@ +#include "test.h" +#include +#include +#include + +int main() +{ + // Make sure @selector values are correctly fixed up + testassert(@selector(foo) == sel_registerName("foo")); + + // sel_getName recognizes the zero SEL + testassert(0 == strcmp("", sel_getName(0))); + + // sel_getName recognizes GC-ignored SELs + if (objc_collecting_enabled()) { + testassert(0 == strcmp("", + sel_getName(@selector(retain)))); + } else { + testassert(0 == strcmp("retain", + sel_getName(@selector(retain)))); + } + + // _objc_search_builtins() shouldn't crash on GC-ignored SELs + union { + SEL sel; + const char *ptr; + } u; + u.sel = @selector(retain); + testassert(@selector(retain) == sel_registerName(u.ptr)); + + succeed(__FILE__); +} diff --git a/test/setSuper.m b/test/setSuper.m new file mode 100644 index 0000000..9a859bd --- /dev/null +++ b/test/setSuper.m @@ -0,0 +1,44 @@ +#include "test.h" +#include + +@interface Super1 { id isa; } @end +@implementation Super1 ++class { return self; } ++(void)initialize { } ++(int)classMethod { return 1; } +-(int)instanceMethod { return 10000; } +@end + +@interface Super2 { id isa; } @end +@implementation Super2 ++class { return self; } ++(void)initialize { } ++(int)classMethod { return 2; } +-(int)instanceMethod { return 20000; } +@end + +@interface Sub : Super1 @end +@implementation Sub ++new { return class_createInstance(self, 0); } ++(int)classMethod { return [super classMethod] + 100; } +-(int)instanceMethod { return [super instanceMethod] + 1000000; } +@end + +int main() +{ + Class cls; + Sub *obj = [Sub new]; + + testassert(101 == [[Sub class] classMethod]); + testassert(1010000 == [obj instanceMethod]); + + cls = class_setSuperclass([Sub class], [Super2 class]); + + testassert(cls == [Super1 class]); + testassert(cls->isa == [Super1 class]->isa); + + testassert(102 == [[Sub class] classMethod]); + testassert(1020000 == [obj instanceMethod]); + + succeed(__FILE__); +} diff --git a/test/super.m b/test/super.m new file mode 100644 index 0000000..24c1c62 --- /dev/null +++ b/test/super.m @@ -0,0 +1,27 @@ +#include "test.h" +#include + +@interface Super { id isa; } @end +@implementation Super ++class { return self; } ++(void)initialize { } +@end + +@interface Sub : Super @end +@implementation Sub @end + +int main() +{ + id buf[10]; + buf[0] = [Sub class]; + + // [super ...] messages are tested in msgSend.m + + testassert(class_getSuperclass([Sub class]) == [Super class]); + testassert(class_getSuperclass([Sub class]->isa) == [Super class]->isa); + testassert(class_getSuperclass([Super class]) == Nil); + testassert(class_getSuperclass([Super class]->isa) == [Super class]); + testassert(class_getSuperclass(Nil) == Nil); + + succeed(__FILE__); +} diff --git a/test/synchronized-counter.m b/test/synchronized-counter.m new file mode 100644 index 0000000..b60c569 --- /dev/null +++ b/test/synchronized-counter.m @@ -0,0 +1,82 @@ +#include "test.h" + +#include +#include +#include +#include +#include +#include + +// synchronized stress test +// Single locked counter incremented by many threads. + +// 64 / 1024*24 test takes about 20s on 4x2.6GHz Mac Pro +#define THREADS 64 +#define COUNT 1024*24 + +static id lock; +static int count; + +static void *threadfn(void *arg) +{ + int n, d; + int depth = 1 + (int)(intptr_t)arg % 4; + + objc_registerThreadWithCollector(); + + for (n = 0; n < COUNT; n++) { + // Lock + for (d = 0; d < depth; d++) { + int err = objc_sync_enter(lock); + testassert(err == OBJC_SYNC_SUCCESS); + } + + // Increment + count++; + + // Unlock + for (d = 0; d < depth; d++) { + int err = objc_sync_exit(lock); + testassert(err == OBJC_SYNC_SUCCESS); + } + } + + // Verify lack of objc pthread data (should have used sync fast cache) + if (_pthread_has_direct_tsd()) { + testassert(! pthread_getspecific(__PTK_FRAMEWORK_OBJC_KEY5)); + } + return NULL; +} + +int main() +{ + pthread_t threads[THREADS]; + int t; + int err; + + lock = [[NSObject alloc] init]; + + // Verify objc pthread data on this thread (from +initialize) + // Worker threads shouldn't have any because of sync fast cache. + if (_pthread_has_direct_tsd()) { + testassert(pthread_getspecific(__PTK_FRAMEWORK_OBJC_KEY5)); + } + + // Start the threads + for (t = 0; t < THREADS; t++) { + pthread_create(&threads[t], NULL, &threadfn, (void*)(intptr_t)t); + } + + // Wait for threads to finish + for (t = 0; t < THREADS; t++) { + pthread_join(threads[t], NULL); + } + + // Verify lock: should be available + // Verify count: should be THREADS*COUNT + err = objc_sync_enter(lock); + testassert(err == OBJC_SYNC_SUCCESS); + testassert(count == THREADS*COUNT); + + succeed(__FILE__); +} diff --git a/test/synchronized-grid.m b/test/synchronized-grid.m new file mode 100644 index 0000000..3988306 --- /dev/null +++ b/test/synchronized-grid.m @@ -0,0 +1,104 @@ +#include "test.h" + +#include +#include +#include +#include +#include + +// synchronized stress test +// 2-D grid of counters and locks. +// Each thread increments all counters some number of times. +// To increment: +// * thread picks a target [row][col] +// * thread locks all locks [row][0] to [row][col], possibly recursively +// * thread increments counter [row][col] +// * thread unlocks all of the locks + +// 64 / 4 / 3 / 1024*8 test takes about 20s on 4x2.6GHz Mac Pro +#define THREADS 64 +#define ROWS 4 +#define COLS 3 +#define COUNT 1024*8 + +static id locks[ROWS][COLS]; +static int counts[ROWS][COLS]; + + +static void *threadfn(void *arg) +{ + int n, d; + int depth = 1 + (int)(intptr_t)arg % 4; + + objc_registerThreadWithCollector(); + + for (n = 0; n < COUNT; n++) { + int rrr = rand() % ROWS; + int ccc = rand() % COLS; + int rr, cc; + for (rr = 0; rr < ROWS; rr++) { + int r = (rrr+rr) % ROWS; + for (cc = 0; cc < COLS; cc++) { + int c = (ccc+cc) % COLS; + int l; + + // Lock [r][0..c] + // ... in that order to prevent deadlock + for (l = 0; l <= c; l++) { + for (d = 0; d < depth; d++) { + int err = objc_sync_enter(locks[r][l]); + testassert(err == OBJC_SYNC_SUCCESS); + } + } + + // Increment count [r][c] + counts[r][c]++; + + // Unlock [r][0..c] + // ... in that order to increase contention + for (l = 0; l <= c; l++) { + for (d = 0; d < depth; d++) { + int err = objc_sync_exit(locks[r][l]); + testassert(err == OBJC_SYNC_SUCCESS); + } + } + } + } + } + + return NULL; +} + +int main() +{ + pthread_t threads[THREADS]; + int r, c, t; + + for (r = 0; r < ROWS; r++) { + for (c = 0; c < COLS; c++) { + locks[r][c] = [[NSObject alloc] init]; + } + } + + // Start the threads + for (t = 0; t < THREADS; t++) { + pthread_create(&threads[t], NULL, &threadfn, (void*)(intptr_t)t); + } + + // Wait for threads to finish + for (t = 0; t < THREADS; t++) { + pthread_join(threads[t], NULL); + } + + // Verify locks: all should be available + // Verify counts: all should be THREADS*COUNT + for (r = 0; r < ROWS; r++) { + for (c = 0; c < COLS; c++) { + int err = objc_sync_enter(locks[r][c]); + testassert(err == OBJC_SYNC_SUCCESS); + testassert(counts[r][c] == THREADS*COUNT); + } + } + + succeed(__FILE__); +} diff --git a/test/synchronized.m b/test/synchronized.m new file mode 100644 index 0000000..128df3d --- /dev/null +++ b/test/synchronized.m @@ -0,0 +1,101 @@ +#include "test.h" + +#include +#include +#include +#include +#include +#include + +// Basic @synchronized tests. + + +#define WAIT_SEC 3 + +static id obj; +static semaphore_t go; +static semaphore_t stop; + +void *thread(void *arg __unused) +{ + int err; + + objc_registerThreadWithCollector(); + + // non-blocking sync_enter + err = objc_sync_enter(obj); + testassert(err == OBJC_SYNC_SUCCESS); + + semaphore_signal(go); + // main thread: sync_exit of object locked on some other thread + semaphore_wait(stop); + + err = objc_sync_exit(obj); + testassert(err == OBJC_SYNC_SUCCESS); + err = objc_sync_enter(obj); + testassert(err == OBJC_SYNC_SUCCESS); + + semaphore_signal(go); + // main thread: blocking sync_enter + testassert(WAIT_SEC/3*3 == WAIT_SEC); + sleep(WAIT_SEC/3); + // recursive enter while someone waits + err = objc_sync_enter(obj); + testassert(err == OBJC_SYNC_SUCCESS); + sleep(WAIT_SEC/3); + // recursive exit while someone waits + err = objc_sync_exit(obj); + testassert(err == OBJC_SYNC_SUCCESS); + sleep(WAIT_SEC/3); + // sync_exit while someone waits + err = objc_sync_exit(obj); + testassert(err == OBJC_SYNC_SUCCESS); + + return NULL; +} + +int main() +{ + pthread_t th; + int err; + struct timeval start, end; + + obj = [[NSObject alloc] init]; + + // sync_exit of never-locked object + err = objc_sync_exit(obj); + testassert(err == OBJC_SYNC_NOT_OWNING_THREAD_ERROR); + + semaphore_create(mach_task_self(), &go, 0, 0); + semaphore_create(mach_task_self(), &stop, 0, 0); + pthread_create(&th, NULL, &thread, NULL); + semaphore_wait(go); + + // sync_exit of object locked on some other thread + err = objc_sync_exit(obj); + testassert(err == OBJC_SYNC_NOT_OWNING_THREAD_ERROR); + + semaphore_signal(stop); + semaphore_wait(go); + + // blocking sync_enter + gettimeofday(&start, NULL); + err = objc_sync_enter(obj); + gettimeofday(&end, NULL); + testassert(err == OBJC_SYNC_SUCCESS); + // should have waited more than WAIT_SEC but less than WAIT_SEC+1 + // fixme hack: sleep(1) is ending 500 usec too early on x86_64 buildbot + testassert(end.tv_sec*1000000LL+end.tv_usec >= + start.tv_sec*1000000LL+start.tv_usec + WAIT_SEC*1000000LL + - 3*500 /*hack*/); + testassert(end.tv_sec*1000000LL+end.tv_usec < + start.tv_sec*1000000LL+start.tv_usec + (1+WAIT_SEC)*1000000LL); + + err = objc_sync_exit(obj); + testassert(err == OBJC_SYNC_SUCCESS); + + err = objc_sync_exit(obj); + testassert(err == OBJC_SYNC_NOT_OWNING_THREAD_ERROR); + + succeed(__FILE__); +} diff --git a/test/test.h b/test/test.h new file mode 100644 index 0000000..a9fa266 --- /dev/null +++ b/test/test.h @@ -0,0 +1,104 @@ +// test.h +// Common definitions for trivial test harness + + +#ifndef TEST_H +#define TEST_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static inline void succeed(const char *msg, ...) __attribute__((noreturn)); +static inline void succeed(const char *msg, ...) +{ + va_list v; + if (msg) { + fprintf(stderr, "OK: "); + va_start(v, msg); + vfprintf(stderr, msg, v); + va_end(v); + fprintf(stderr, "\n"); + } else { + fprintf(stderr, "OK\n"); + } + exit(0); +} + +static inline int fail(const char *msg, ...) __attribute__((noreturn)); +static inline int fail(const char *msg, ...) +{ + va_list v; + if (msg) { + fprintf(stderr, "BAD: "); + va_start(v, msg); + vfprintf(stderr, msg, v); + va_end(v); + fprintf(stderr, "\n"); + } else { + fprintf(stderr, "BAD\n"); + } + exit(1); +} + +#define testassert(cond) \ + ((void) ((cond) ? 0 : __testassert(#cond, __FILE__, __LINE__))) +#define __testassert(cond, file, line) \ + fail("failed assertion '%s' at %s:%u", cond, __FILE__, __LINE__) + +/* time-sensitive assertion, disabled under valgrind */ +#define timeassert(cond) \ + testassert((getenv("VALGRIND") && 0 != strcmp(getenv("VALGRIND"), "NO")) || (cond)) + +static inline void testprintf(const char *msg, ...) +{ + va_list v; + va_start(v, msg); + if (getenv("VERBOSE")) vfprintf(stderr, msg, v); + va_end(v); +} + + +/* Leak checking + Fails if total malloc memory in use at leak_check(n) + is more than n bytes above that at leak_mark(). +*/ + +static size_t _leak_start; +static inline void leak_mark(void) +{ + malloc_statistics_t stats; + if (objc_collecting_enabled()) { + objc_startCollectorThread(); + objc_collect(OBJC_EXHAUSTIVE_COLLECTION|OBJC_WAIT_UNTIL_DONE); + } + malloc_zone_statistics(NULL, &stats); + _leak_start = stats.size_in_use; +} + +#define leak_check(n) \ + do { \ + const char *_check = getenv("LEAK_CHECK"); \ + if (_check && 0 == strcmp(_check, "NO")) break; \ + if (objc_collecting_enabled()) { \ + objc_collect(OBJC_EXHAUSTIVE_COLLECTION|OBJC_WAIT_UNTIL_DONE); \ + } \ + malloc_statistics_t stats; \ + malloc_zone_statistics(NULL, &stats); \ + if (stats.size_in_use > _leak_start + n) { \ + if (getenv("HANG_ON_LEAK")) { \ + printf("leaks %d\n", getpid()); \ + while (1) sleep(1); \ + } \ + fail("%zu bytes leaked at %s:%u", \ + stats.size_in_use - _leak_start, __FILE__, __LINE__); \ + } \ + } while (0) + +#endif diff --git a/test/test.xcodeproj/project.pbxproj b/test/test.xcodeproj/project.pbxproj new file mode 100644 index 0000000..d27b516 --- /dev/null +++ b/test/test.xcodeproj/project.pbxproj @@ -0,0 +1,453 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 42; + objects = { + +/* Begin PBXBuildFile section */ + 3986128C0A534D3700C30D67 /* accessors.m in Sources */ = {isa = PBXBuildFile; fileRef = 3986128B0A534D3700C30D67 /* accessors.m */; }; + 3986128F0A534D6300C30D67 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3986128D0A534D6300C30D67 /* CoreFoundation.framework */; }; + 398612900A534D6300C30D67 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3986128E0A534D6300C30D67 /* Foundation.framework */; }; + 39B32C010A54A81100A8062E /* libobjc.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 39B32C000A54A81100A8062E /* libobjc.dylib */; }; + 39B32C020A54A81100A8062E /* libobjc.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 39B32C000A54A81100A8062E /* libobjc.dylib */; }; + 39B32C030A54A81100A8062E /* libobjc.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 39B32C000A54A81100A8062E /* libobjc.dylib */; }; + 39C8683B0A549A6300B32D32 /* layout.m in Sources */ = {isa = PBXBuildFile; fileRef = 39C8683A0A549A6300B32D32 /* layout.m */; }; + 39C868400A549A7E00B32D32 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3986128E0A534D6300C30D67 /* Foundation.framework */; }; + 39C868410A549A7F00B32D32 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3986128D0A534D6300C30D67 /* CoreFoundation.framework */; }; + 39C868820A549B8C00B32D32 /* category.m in Sources */ = {isa = PBXBuildFile; fileRef = 39C8687C0A549B6700B32D32 /* category.m */; }; + 39C868830A549B8D00B32D32 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3986128D0A534D6300C30D67 /* CoreFoundation.framework */; }; + 39C868840A549B8D00B32D32 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3986128E0A534D6300C30D67 /* Foundation.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 39481F560A54AA2A007DE311 /* testaccessors */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testaccessors; sourceTree = BUILT_PRODUCTS_DIR; }; + 3986128B0A534D3700C30D67 /* accessors.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = accessors.m; sourceTree = ""; }; + 3986128D0A534D6300C30D67 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = /System/Library/Frameworks/CoreFoundation.framework; sourceTree = ""; }; + 3986128E0A534D6300C30D67 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; + 39B32C000A54A81100A8062E /* libobjc.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libobjc.dylib; path = /usr/lib/libobjc.dylib; sourceTree = ""; }; + 39C868380A549A4F00B32D32 /* layout */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = layout; sourceTree = BUILT_PRODUCTS_DIR; }; + 39C8683A0A549A6300B32D32 /* layout.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = layout.m; sourceTree = ""; }; + 39C8687C0A549B6700B32D32 /* category.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = category.m; sourceTree = ""; }; + 39C868800A549B8400B32D32 /* category */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = category; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 39C868360A549A4F00B32D32 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 39C868400A549A7E00B32D32 /* Foundation.framework in Frameworks */, + 39C868410A549A7F00B32D32 /* CoreFoundation.framework in Frameworks */, + 39B32C020A54A81100A8062E /* libobjc.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 39C8687E0A549B8400B32D32 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 39C868830A549B8D00B32D32 /* CoreFoundation.framework in Frameworks */, + 39C868840A549B8D00B32D32 /* Foundation.framework in Frameworks */, + 39B32C030A54A81100A8062E /* libobjc.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 39D7E9B70A40E5EB007A7A47 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 3986128F0A534D6300C30D67 /* CoreFoundation.framework in Frameworks */, + 398612900A534D6300C30D67 /* Foundation.framework in Frameworks */, + 39B32C010A54A81100A8062E /* libobjc.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 08FB7794FE84155DC02AAC07 /* libobjc */ = { + isa = PBXGroup; + children = ( + 3986128B0A534D3700C30D67 /* accessors.m */, + 39C8687C0A549B6700B32D32 /* category.m */, + 39C8683A0A549A6300B32D32 /* layout.m */, + 39B32C000A54A81100A8062E /* libobjc.dylib */, + 3986128D0A534D6300C30D67 /* CoreFoundation.framework */, + 3986128E0A534D6300C30D67 /* Foundation.framework */, + 39C868380A549A4F00B32D32 /* layout */, + 39C868800A549B8400B32D32 /* category */, + 39481F560A54AA2A007DE311 /* testaccessors */, + ); + name = libobjc; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 39C868370A549A4F00B32D32 /* layout */ = { + isa = PBXNativeTarget; + buildConfigurationList = 39C8683C0A549A6300B32D32 /* Build configuration list for PBXNativeTarget "layout" */; + buildPhases = ( + 39C868350A549A4F00B32D32 /* Sources */, + 39C868360A549A4F00B32D32 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = layout; + productName = layout; + productReference = 39C868380A549A4F00B32D32 /* layout */; + productType = "com.apple.product-type.tool"; + }; + 39C8687F0A549B8400B32D32 /* category */ = { + isa = PBXNativeTarget; + buildConfigurationList = 39C868860A549BAB00B32D32 /* Build configuration list for PBXNativeTarget "category" */; + buildPhases = ( + 39C8687D0A549B8400B32D32 /* Sources */, + 39C8687E0A549B8400B32D32 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = category; + productName = category; + productReference = 39C868800A549B8400B32D32 /* category */; + productType = "com.apple.product-type.tool"; + }; + 39D7E9B80A40E5EB007A7A47 /* accessors */ = { + isa = PBXNativeTarget; + buildConfigurationList = 39D7E9C70A40E687007A7A47 /* Build configuration list for PBXNativeTarget "accessors" */; + buildPhases = ( + 39D7E9B60A40E5EB007A7A47 /* Sources */, + 39D7E9B70A40E5EB007A7A47 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = accessors; + productName = testaccessors; + productReference = 39481F560A54AA2A007DE311 /* testaccessors */; + productType = "com.apple.product-type.tool"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 08FB7793FE84155DC02AAC07 /* Project object */ = { + isa = PBXProject; + buildConfigurationList = 39DBC2AE09D8B0CD000A1C12 /* Build configuration list for PBXProject "test" */; + hasScannedForEncodings = 1; + mainGroup = 08FB7794FE84155DC02AAC07 /* libobjc */; + productRefGroup = 08FB7794FE84155DC02AAC07 /* libobjc */; + projectDirPath = ""; + targets = ( + 39D7E9B80A40E5EB007A7A47 /* accessors */, + 39C868370A549A4F00B32D32 /* layout */, + 39C8687F0A549B8400B32D32 /* category */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 39C868350A549A4F00B32D32 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 39C8683B0A549A6300B32D32 /* layout.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 39C8687D0A549B8400B32D32 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 39C868820A549B8C00B32D32 /* category.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 39D7E9B60A40E5EB007A7A47 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 3986128C0A534D3700C30D67 /* accessors.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 39C8683D0A549A6300B32D32 /* Development */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = YES; + GCC_ENABLE_OBJC_GC = YES; + GCC_ENABLE_SYMBOL_SEPARATION = NO; + GCC_GENERATE_DEBUGGING_SYMBOLS = YES; + GCC_MODEL_TUNING = G5; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PRECOMPILE_PREFIX_HEADER = NO; + INSTALL_PATH = "$(HOME)/bin"; + OTHER_LDFLAGS = ( + "-framework", + Foundation, + "-framework", + AppKit, + ); + PREBINDING = NO; + PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO; + PRODUCT_NAME = layout; + }; + name = Development; + }; + 39C8683E0A549A6300B32D32 /* Deployment */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = YES; + GCC_DYNAMIC_NO_PIC = YES; + GCC_ENABLE_OBJC_GC = YES; + GCC_ENABLE_SYMBOL_SEPARATION = NO; + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + GCC_MODEL_TUNING = G5; + GCC_PRECOMPILE_PREFIX_HEADER = NO; + INSTALL_PATH = "$(HOME)/bin"; + OTHER_LDFLAGS = ( + "-framework", + Foundation, + "-framework", + AppKit, + ); + PREBINDING = NO; + PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO; + PRODUCT_NAME = layout; + }; + name = Deployment; + }; + 39C8683F0A549A6300B32D32 /* Default */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_DYNAMIC_NO_PIC = YES; + GCC_ENABLE_OBJC_GC = YES; + GCC_ENABLE_SYMBOL_SEPARATION = NO; + GCC_MODEL_TUNING = G5; + GCC_PRECOMPILE_PREFIX_HEADER = NO; + INSTALL_PATH = "$(HOME)/bin"; + OTHER_LDFLAGS = ( + "-framework", + Foundation, + "-framework", + AppKit, + ); + PREBINDING = NO; + PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO; + PRODUCT_NAME = layout; + }; + name = Default; + }; + 39C868870A549BAB00B32D32 /* Development */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_GENERATE_DEBUGGING_SYMBOLS = YES; + GCC_MODEL_TUNING = G5; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h"; + INSTALL_PATH = "$(HOME)/bin"; + OTHER_LDFLAGS = ( + "-framework", + Foundation, + "-framework", + AppKit, + ); + PREBINDING = NO; + PRODUCT_NAME = category; + ZERO_LINK = YES; + }; + name = Development; + }; + 39C868880A549BAB00B32D32 /* Deployment */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = YES; + GCC_ENABLE_FIX_AND_CONTINUE = NO; + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + GCC_MODEL_TUNING = G5; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h"; + INSTALL_PATH = "$(HOME)/bin"; + OTHER_LDFLAGS = ( + "-framework", + Foundation, + "-framework", + AppKit, + ); + PREBINDING = NO; + PRODUCT_NAME = category; + ZERO_LINK = NO; + }; + name = Deployment; + }; + 39C868890A549BAB00B32D32 /* Default */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_MODEL_TUNING = G5; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h"; + INSTALL_PATH = "$(HOME)/bin"; + OTHER_LDFLAGS = ( + "-framework", + Foundation, + "-framework", + AppKit, + ); + PREBINDING = NO; + PRODUCT_NAME = category; + ZERO_LINK = YES; + }; + name = Default; + }; + 39D7E9C80A40E687007A7A47 /* Development */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_ENABLE_OBJC_GC = YES; + GCC_GENERATE_DEBUGGING_SYMBOLS = YES; + GCC_MODEL_TUNING = G5; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PRECOMPILE_PREFIX_HEADER = NO; + GCC_PREPROCESSOR_DEFINITIONS = TEST_ACCESSORS; + INSTALL_PATH = "$(HOME)/bin"; + OTHER_LDFLAGS = ( + "-framework", + Foundation, + "-framework", + AppKit, + ); + PREBINDING = NO; + PRODUCT_NAME = testaccessors; + ZERO_LINK = YES; + }; + name = Development; + }; + 39D7E9C90A40E687007A7A47 /* Deployment */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = YES; + GCC_ENABLE_FIX_AND_CONTINUE = NO; + GCC_ENABLE_OBJC_GC = YES; + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + GCC_MODEL_TUNING = G5; + GCC_PRECOMPILE_PREFIX_HEADER = NO; + GCC_PREPROCESSOR_DEFINITIONS = TEST_ACCESSORS; + INSTALL_PATH = "$(HOME)/bin"; + OTHER_LDFLAGS = ( + "-framework", + Foundation, + "-framework", + AppKit, + ); + PREBINDING = NO; + PRODUCT_NAME = testaccessors; + ZERO_LINK = NO; + }; + name = Deployment; + }; + 39D7E9CA0A40E687007A7A47 /* Default */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_ENABLE_OBJC_GC = YES; + GCC_MODEL_TUNING = G5; + GCC_PRECOMPILE_PREFIX_HEADER = NO; + GCC_PREPROCESSOR_DEFINITIONS = TEST_ACCESSORS; + INSTALL_PATH = "$(HOME)/bin"; + OTHER_LDFLAGS = ( + "-framework", + Foundation, + "-framework", + AppKit, + ); + PREBINDING = NO; + PRODUCT_NAME = testaccessors; + ZERO_LINK = YES; + }; + name = Default; + }; + 39DBC2AF09D8B0CD000A1C12 /* Development */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_ENABLE_OBJC_GC = YES; + }; + name = Development; + }; + 39DBC2B009D8B0CD000A1C12 /* Deployment */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_ENABLE_OBJC_GC = YES; + }; + name = Deployment; + }; + 39DBC2B109D8B0CD000A1C12 /* Default */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_ENABLE_OBJC_GC = YES; + }; + name = Default; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 39C8683C0A549A6300B32D32 /* Build configuration list for PBXNativeTarget "layout" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 39C8683D0A549A6300B32D32 /* Development */, + 39C8683E0A549A6300B32D32 /* Deployment */, + 39C8683F0A549A6300B32D32 /* Default */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Default; + }; + 39C868860A549BAB00B32D32 /* Build configuration list for PBXNativeTarget "category" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 39C868870A549BAB00B32D32 /* Development */, + 39C868880A549BAB00B32D32 /* Deployment */, + 39C868890A549BAB00B32D32 /* Default */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Default; + }; + 39D7E9C70A40E687007A7A47 /* Build configuration list for PBXNativeTarget "accessors" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 39D7E9C80A40E687007A7A47 /* Development */, + 39D7E9C90A40E687007A7A47 /* Deployment */, + 39D7E9CA0A40E687007A7A47 /* Default */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Default; + }; + 39DBC2AE09D8B0CD000A1C12 /* Build configuration list for PBXProject "test" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 39DBC2AF09D8B0CD000A1C12 /* Development */, + 39DBC2B009D8B0CD000A1C12 /* Deployment */, + 39DBC2B109D8B0CD000A1C12 /* Default */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Default; + }; +/* End XCConfigurationList section */ + }; + rootObject = 08FB7793FE84155DC02AAC07 /* Project object */; +} diff --git a/test/unload.h b/test/unload.h new file mode 100644 index 0000000..6e932ea --- /dev/null +++ b/test/unload.h @@ -0,0 +1,10 @@ +@interface SmallClass { id isa; } ++(id)new; +-(void)free; +@end + +@interface BigClass { id isa; } ++(id)new; +-(void)free; +@end + diff --git a/test/unload.m b/test/unload.m new file mode 100644 index 0000000..801f634 --- /dev/null +++ b/test/unload.m @@ -0,0 +1,126 @@ +#include "test.h" +#include +#include +#include + +#include "unload.h" + +static BOOL hasName(const char * const *names, const char *query) +{ + const char *name; + while ((name = *names++)) { + if (strstr(name, query)) return YES; + } + + return NO; +} + +void cycle(void) +{ + int i; + char buf[100]; + unsigned int imageCount, imageCount0; + const char **names; + const char *name; + + names = objc_copyImageNames(&imageCount0); + testassert(names); + free(names); + + void *bundle = dlopen("unload2.out", RTLD_LAZY); + testassert(bundle); + + names = objc_copyImageNames(&imageCount); + testassert(names); + testassert(imageCount == imageCount0 + 1); + testassert(hasName(names, "unload2.out")); + free(names); + + Class small = objc_getClass("SmallClass"); + Class big = objc_getClass("BigClass"); + testassert(small); + testassert(big); + + name = class_getImageName(small); + testassert(name); + testassert(strstr(name, "unload2.out")); + name = class_getImageName(big); + testassert(name); + testassert(strstr(name, "unload2.out")); + + id o1 = [small new]; + id o2 = [big new]; + testassert(o1); + testassert(o2); + + // give BigClass and BigClass->isa large method caches (4692641) + for (i = 0; i < 10000; i++) { + sprintf(buf, "method_%d", i); + SEL sel = sel_registerName(buf); + objc_msgSend(o2, sel); + objc_msgSend(o2->isa, sel); + } + + [o1 free]; + [o2 free]; + + if (objc_collecting_enabled()) objc_collect(OBJC_EXHAUSTIVE_COLLECTION | OBJC_WAIT_UNTIL_DONE); + + int err = dlclose(bundle); + testassert(err == 0); + err = dlclose(bundle); + testassert(err == -1); // already closed + + testassert(!objc_getClass("SmallClass")); + testassert(!objc_getClass("BigClass")); + + names = objc_copyImageNames(&imageCount); + testassert(names); + testassert(imageCount == imageCount0); + testassert(! hasName(names, "unload2.out")); + free(names); + + // these selectors came from the bundle + testassert(0 == strcmp("unload2_instance_method", sel_getName(sel_registerName("unload2_instance_method")))); + testassert(0 == strcmp("unload2_category_method", sel_getName(sel_registerName("unload2_category_method")))); +} + +int main() +{ + // fixme object_dispose() not aggressive enough? + if (objc_collecting_enabled()) succeed(__FILE__); + + int count = 100; + + cycle(); +#if __LP64__ + // fixme heap use goes up 512 bytes after the 2nd cycle only - bad or not? + cycle(); +#endif + + leak_mark(); + while (count--) { + cycle(); + } + leak_check(0); + + // 5359412 Make sure dylibs with nothing other than image_info can close + void *dylib = dlopen("unload3.out", RTLD_LAZY); + testassert(dylib); + int err = dlclose(dylib); + testassert(err == 0); + err = dlclose(dylib); + testassert(err == -1); // already closed + + // Make sure dylibs with real objc content cannot close + dylib = dlopen("unload4.out", RTLD_LAZY); + testassert(dylib); + err = dlclose(dylib); + testassert(err == 0); + err = dlclose(dylib); + testassert(err == 0); // dlopen from libobjc itself + err = dlclose(dylib); + testassert(err == -1); // already closed + + succeed(__FILE__); +} diff --git a/test/unload2.m b/test/unload2.m new file mode 100644 index 0000000..7a21d97 --- /dev/null +++ b/test/unload2.m @@ -0,0 +1,33 @@ +#include "unload.h" +#include + + +@implementation SmallClass ++(void)initialize { } ++(id)new { + return class_createInstance(self, 0); +} +-(void)free { object_dispose(self); } +-(void)unload2_instance_method { } +-(void)finalize { } +@end + + +@implementation BigClass ++(void)initialize { } ++(id)new { + return class_createInstance(self, 0); +} +-(void)free { object_dispose(self); } +-(void)finalize { } +-(void)forward:(int)a1:(int)a2 { a1 = a2; } +@end + + +@interface UnusedClass { id isa; } @end +@implementation UnusedClass @end + + +@implementation SmallClass (Category) +-(void)unload2_category_method { } +@end diff --git a/test/unload3.m b/test/unload3.m new file mode 100644 index 0000000..9f83a9b --- /dev/null +++ b/test/unload3.m @@ -0,0 +1,8 @@ +// unload3: contains imageinfo but no other objc metadata +// libobjc must not keep it open + +#if __OBJC2__ +int fake __attribute__((section("__DATA,__objc_imageinfo"))) = 0; +#else +int fake __attribute__((section("__OBJC,__image_info"))) = 0; +#endif diff --git a/test/unload4.m b/test/unload4.m new file mode 100644 index 0000000..d3361b1 --- /dev/null +++ b/test/unload4.m @@ -0,0 +1,8 @@ +// unload4: contains some objc metadata other than imageinfo +// libobjc must keep it open + +#if __OBJC2__ +int fake2 __attribute__((section("__DATA,__objc_foo"))) = 0; +#else +int fake2 __attribute__((section("__OBJC,__foo"))) = 0; +#endif diff --git a/test/unwind.m b/test/unwind.m new file mode 100644 index 0000000..85559ae --- /dev/null +++ b/test/unwind.m @@ -0,0 +1,83 @@ +#include "test.h" +#include +#include + +#if !defined(__OBJC2__) + +int main() +{ + succeed(__FILE__); +} + +#else + +static int state; + +@interface Foo : NSObject @end + +@interface Foo (Unimplemented) ++(void)method; +@end + + +@implementation Foo + +-(void)check { state++; } ++(void)check { testassert(!"caught class object, not instance"); } + +static id exc; + +static void handler(id unused __unused, void *ctx __unused) +{ + testassert(state == 3); state++; +} + ++(BOOL) resolveClassMethod:(SEL)__unused name +{ + testassert(state == 1); state++; + objc_addExceptionHandler(&handler, 0); + testassert(state == 2); state++; + exc = [Foo new]; + @throw exc; +} + + +@end + +int main() +{ + int i; + + // unwind exception and alt handler through objc_msgSend() + + NSAutoreleasePool *pool = [NSAutoreleasePool new]; + + state = 0; + for (i = 0; i < 100000; i++) { + @try { + testassert(state == 0); state++; + [Foo method]; + testassert(0); + } @catch (NSException *e) { + testassert(0); + } @catch (Foo *e) { + testassert(e == exc); + testassert(state == 4); state++; + testassert(state == 5); [e check]; // state++ + [e release]; + } @catch (id e) { + testassert(0); + } @catch (...) { + testassert(0); + } @finally { + testassert(state == 6); state++; + } + testassert(state == 7); state = 0; + } + + [pool drain]; + + succeed(__FILE__); +} + +#endif diff --git a/test/weakcopy.m b/test/weakcopy.m new file mode 100644 index 0000000..7c550b9 --- /dev/null +++ b/test/weakcopy.m @@ -0,0 +1,34 @@ +#include "test.h" +#include +#include +#include + +@interface Base { + @public + id isa; +} +@end +@implementation Base ++(void)initialize { } ++class { return self; } +@end + +@interface Weak : Base { + @public + __weak id value; +} +@end +@implementation Weak +@end + +int main() +{ + Base *value = class_createInstance([Base class], 0); + Weak *oldObject = class_createInstance([Weak class], 0); + oldObject->value = value; + Weak *newObject = object_copy(oldObject, 0); + testassert(newObject->value == oldObject->value); + newObject->value = nil; + succeed(__FILE__); + return 0; +} diff --git a/test/zone.m b/test/zone.m new file mode 100644 index 0000000..9023308 --- /dev/null +++ b/test/zone.m @@ -0,0 +1,33 @@ +#include "test.h" +#include +#include + +// Look for malloc zone "ObjC" iff OBJC_USE_INTERNAL_ZONE is set. +// This fails if objc tries to allocate before checking its own +// environment variables (rdar://6688423) + +int main() +{ + kern_return_t kr; + vm_address_t *zones; + unsigned int count, i; + BOOL has_objc = NO, want_objc = NO; + + want_objc = (getenv("OBJC_USE_INTERNAL_ZONE") != NULL) ? YES : NO; + testprintf("want objc %s\n", want_objc ? "YES" : "NO"); + + kr = malloc_get_all_zones(mach_task_self(), NULL, &zones, &count); + testassert(!kr); + for (i = 0; i < count; i++) { + const char *name = malloc_get_zone_name((malloc_zone_t *)zones[i]); + if (name) { + BOOL is_objc = (0 == strcmp(name, "ObjC")) ? YES : NO; + if (is_objc) has_objc = YES; + testprintf("zone %s\n", name); + } + } + + testassert(want_objc == has_objc); + + succeed(__FILE__); +} diff --git a/unexported_symbols b/unexported_symbols new file mode 100644 index 0000000..239bb8f --- /dev/null +++ b/unexported_symbols @@ -0,0 +1 @@ +__ZSt11lower_boundIPKmmET_S2_S2_RKT0_ -- 2.45.2