mirror of
https://github.com/gnustep/libs-base.git
synced 2025-05-30 16:30:41 +00:00
Tidying optimisation stuff.
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@7938 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
3f7fe730db
commit
f4817879df
19 changed files with 165 additions and 139 deletions
27
ChangeLog
27
ChangeLog
|
@ -3,7 +3,32 @@
|
||||||
* Headers/gnustep/base/NSGString.h:
|
* Headers/gnustep/base/NSGString.h:
|
||||||
* Headers/gnustep/base/NSGCString.h:
|
* Headers/gnustep/base/NSGCString.h:
|
||||||
* Source/NSGString.m:
|
* Source/NSGString.m:
|
||||||
* Source/NSGCString.m: Removed classes - no loinger used.
|
* Source/NSGCString.m: Removed classes - no longer used.
|
||||||
|
* Headers/gnustep/base/NSObjCRuntime.h:
|
||||||
|
* Headers/gnustep/base/fast.x:
|
||||||
|
* Source/GSString.m:
|
||||||
|
* Source/Makefile.postamble:
|
||||||
|
* Source/NSArchiver.m:
|
||||||
|
* Source/NSCTemplateValue.m:
|
||||||
|
* Source/NSConcreteValue.m:
|
||||||
|
* Source/NSCountedSet.m:
|
||||||
|
* Source/NSDate.m:
|
||||||
|
* Source/NSDictionary.m:
|
||||||
|
* Source/NSDistantObject.m:
|
||||||
|
* Source/NSGSet.m:
|
||||||
|
* Source/NSNumber.m:
|
||||||
|
* Source/NSObject.m:
|
||||||
|
* Source/NSScanner.m:
|
||||||
|
* Source/NSSerializer.m:
|
||||||
|
* Source/NSSet.m:
|
||||||
|
* Source/NSUnarchiver.m:
|
||||||
|
Changed calls to 'fastClass()' to use 'GSObjCClassOfObject()' and
|
||||||
|
added that to NSObjCRuntime.h. Removed central class and
|
||||||
|
implementation caching from NSObject.m and fast.x since it was not
|
||||||
|
being effectively used. New intention to do removal of fast.x and
|
||||||
|
add similar functionality to NSObjCRuntime.h - intention being to
|
||||||
|
combine functionality of fast access to the runtime, and hiding both
|
||||||
|
GNU and Apple runtime behind a single interface.
|
||||||
|
|
||||||
2000-10-30 Richard Frith-Macdonald <rfm@gnu.org>
|
2000-10-30 Richard Frith-Macdonald <rfm@gnu.org>
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Interface to ObjC runtime for GNUStep
|
/* Interface to ObjC runtime for GNUStep
|
||||||
Copyright (C) 1995, 1997 Free Software Foundation, Inc.
|
Copyright (C) 1995, 1997, 2000 Free Software Foundation, Inc.
|
||||||
|
|
||||||
Written by: Andrew Kachites McCallum <mccallum@gnu.ai.mit.edu>
|
Written by: Andrew Kachites McCallum <mccallum@gnu.ai.mit.edu>
|
||||||
Date: 1995
|
Date: 1995
|
||||||
|
@ -38,21 +38,22 @@
|
||||||
|
|
||||||
@class NSString;
|
@class NSString;
|
||||||
|
|
||||||
GS_EXPORT NSString *NSStringFromSelector(SEL aSelector);
|
GS_EXPORT NSString *NSStringFromSelector(SEL aSelector);
|
||||||
GS_EXPORT SEL NSSelectorFromString(NSString *aSelectorName);
|
GS_EXPORT SEL NSSelectorFromString(NSString *aSelectorName);
|
||||||
GS_EXPORT Class NSClassFromString(NSString *aClassName);
|
GS_EXPORT Class NSClassFromString(NSString *aClassName);
|
||||||
GS_EXPORT NSString *NSStringFromClass(Class aClass);
|
GS_EXPORT NSString *NSStringFromClass(Class aClass);
|
||||||
GS_EXPORT const char *NSGetSizeAndAlignment(const char *typePtr, unsigned int *sizep, unsigned int *alignp);
|
GS_EXPORT const char *NSGetSizeAndAlignment(const char *typePtr,
|
||||||
|
unsigned int *sizep, unsigned int *alignp);
|
||||||
|
|
||||||
/* Logging */
|
/* Logging */
|
||||||
/* OpenStep spec states that log messages go to stderr, but just in case
|
/* OpenStep spec states that log messages go to stderr, but just in case
|
||||||
someone wants them to go somewhere else, they can implement a function
|
someone wants them to go somewhere else, they can implement a function
|
||||||
like this */
|
like this */
|
||||||
typedef void NSLog_printf_handler (NSString* message);
|
typedef void NSLog_printf_handler (NSString* message);
|
||||||
GS_EXPORT NSLog_printf_handler *_NSLog_printf_handler;
|
GS_EXPORT NSLog_printf_handler *_NSLog_printf_handler;
|
||||||
|
|
||||||
GS_EXPORT void NSLog (NSString* format, ...);
|
GS_EXPORT void NSLog (NSString* format, ...);
|
||||||
GS_EXPORT void NSLogv (NSString* format, va_list args);
|
GS_EXPORT void NSLogv (NSString* format, va_list args);
|
||||||
|
|
||||||
#ifndef YES
|
#ifndef YES
|
||||||
#define YES 1
|
#define YES 1
|
||||||
|
@ -64,12 +65,23 @@ GS_EXPORT void NSLogv (NSString* format, va_list args);
|
||||||
#define nil 0
|
#define nil 0
|
||||||
#endif nil
|
#endif nil
|
||||||
|
|
||||||
#ifndef NO_GNUSTEP
|
|
||||||
GS_EXPORT BOOL GSGetInstanceVariable(id obj, NSString *name, void* data);
|
|
||||||
GS_EXPORT BOOL GSSetInstanceVariable(id obj, NSString *name, const void* data);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define FOUNDATION_EXPORT
|
#define FOUNDATION_EXPORT
|
||||||
#define FOUNDATION_STATIC_INLINE static inline
|
#define FOUNDATION_STATIC_INLINE static inline
|
||||||
|
|
||||||
|
#ifndef NO_GNUSTEP
|
||||||
|
GS_EXPORT BOOL GSGetInstanceVariable(id obj, NSString *name, void* data);
|
||||||
|
GS_EXPORT BOOL GSSetInstanceVariable(id obj, NSString *name, const void* data);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* GSObjCClassOfInstance() return the class of an instance.
|
||||||
|
* The argument to this function must NOT be nil.
|
||||||
|
*/
|
||||||
|
FOUNDATION_STATIC_INLINE Class
|
||||||
|
GSObjCClassOfObject(id obj)
|
||||||
|
{
|
||||||
|
return obj->class_pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* __NSObjCRuntime_h_GNUSTEP_BASE_INCLUDE */
|
#endif /* __NSObjCRuntime_h_GNUSTEP_BASE_INCLUDE */
|
||||||
|
|
|
@ -36,61 +36,15 @@
|
||||||
* This file is all to do with improving performance by avoiding the
|
* This file is all to do with improving performance by avoiding the
|
||||||
* Objective-C messaging overhead in time-critical code.
|
* Objective-C messaging overhead in time-critical code.
|
||||||
*
|
*
|
||||||
* The motiviation behind it is to keep all the information needed to
|
* THIS STUFF IS GOING AWAY!
|
||||||
* do that in one place (using a single mechanism), so that optimization
|
|
||||||
* attempts can be kept track of.
|
|
||||||
*
|
*
|
||||||
* The optimisations are of three sorts -
|
* The intention is to provide similar functionality in NSObjCRuntime.h
|
||||||
*
|
* There will be GNUstep specific (mostly inline) functions added to
|
||||||
* 1. inline functions
|
* the header to provide direct access to runtime functinality and the
|
||||||
* There are many operations that can be speeded up by using inline
|
* internals of objects. Hopefully a simple configuration option will
|
||||||
* code to examine objects rather than sending messages to them to
|
* let us build for either the GNU or the Apple runtime.
|
||||||
* ask them about themselves. Often, the objc runtime provides
|
|
||||||
* functions to do this, but these sometimes perform unnecessary
|
|
||||||
* checks. Here we attempt to provide some basics.
|
|
||||||
*
|
|
||||||
* 2. class comparison
|
|
||||||
* It is often necessary to check the class of objects - instead of
|
|
||||||
* using [+class] method, we can cache certain classes in a global
|
|
||||||
* structure (The [NSObject +initialize] method does the caching)
|
|
||||||
* and refer to the structure elements directly.
|
|
||||||
*
|
|
||||||
* 3. direct method despatch
|
|
||||||
* A common techique is to obtain the method implementation for a
|
|
||||||
* specific message sent to a particular class of object, and call
|
|
||||||
* the implementation directly to avoid repeated lookup within the
|
|
||||||
* objc runtime.
|
|
||||||
* While there is no huge speed advantage to caching the method
|
|
||||||
* implementations, it does make it easy to search the source for
|
|
||||||
* code that is using this technique and referring to a cached
|
|
||||||
* method implementation.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
|
||||||
* Structure to cache class information.
|
|
||||||
* By convention, the name of the structure element is the name of the
|
|
||||||
* class with an underscore prepended.
|
|
||||||
*/
|
|
||||||
typedef struct {
|
|
||||||
Class _NSArray;
|
|
||||||
Class _NSMutableArray;
|
|
||||||
Class _NSDictionary;
|
|
||||||
Class _NSMutableDictionary;
|
|
||||||
Class _NSDataMalloc;
|
|
||||||
Class _NSMutableDataMalloc;
|
|
||||||
} fastCls;
|
|
||||||
GS_EXPORT fastCls _fastCls; /* Populated by _fastBuildCache() */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The '_fastBuildCache()' function is called to populate the cache
|
|
||||||
* structures. This is (at present) called in [NSObject +initialize]
|
|
||||||
* but you may call it explicitly later to repopulate the cache after
|
|
||||||
* changes have been made to the runtime by loading of categories or
|
|
||||||
* by classes posing as other classes.
|
|
||||||
*/
|
|
||||||
GS_EXPORT void _fastBuildCache();
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The '_fastMallocBuffer()' function is called to get a chunk of
|
* The '_fastMallocBuffer()' function is called to get a chunk of
|
||||||
* memory that will automatically be released when the current
|
* memory that will automatically be released when the current
|
||||||
|
@ -100,9 +54,6 @@ GS_EXPORT void *_fastMallocBuffer(unsigned size);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Fast access to class info - DON'T pass nil to these!
|
* Fast access to class info - DON'T pass nil to these!
|
||||||
* These should really do different things conditional upon the objc
|
|
||||||
* runtime in use, but we will probably only ever want to support the
|
|
||||||
* latest GNU runtime, so I haven't bothered about that.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static INLINE BOOL
|
static INLINE BOOL
|
||||||
|
|
|
@ -43,6 +43,7 @@
|
||||||
#include <Foundation/NSRange.h>
|
#include <Foundation/NSRange.h>
|
||||||
#include <Foundation/NSException.h>
|
#include <Foundation/NSException.h>
|
||||||
#include <Foundation/NSValue.h>
|
#include <Foundation/NSValue.h>
|
||||||
|
#include <Foundation/NSObjCRuntime.h>
|
||||||
#include <base/behavior.h>
|
#include <base/behavior.h>
|
||||||
/* memcpy(), strlen(), strcmp() are gcc builtin's */
|
/* memcpy(), strlen(), strcmp() are gcc builtin's */
|
||||||
|
|
||||||
|
@ -359,7 +360,7 @@ compare_c(ivars self, NSString *aString, unsigned mask, NSRange aRange)
|
||||||
if (fastIsInstance(aString) == NO)
|
if (fastIsInstance(aString) == NO)
|
||||||
return strCompCsNs((id)self, aString, mask, aRange);
|
return strCompCsNs((id)self, aString, mask, aRange);
|
||||||
|
|
||||||
c = fastClass(aString);
|
c = GSObjCClassOfObject(aString);
|
||||||
if (fastClassIsKindOfClass(c, GSUStringClass) == YES
|
if (fastClassIsKindOfClass(c, GSUStringClass) == YES
|
||||||
|| (c == GSMStringClass && ((ivars)aString)->_flags.wide == 1))
|
|| (c == GSMStringClass && ((ivars)aString)->_flags.wide == 1))
|
||||||
return strCompCsUs((id)self, aString, mask, aRange);
|
return strCompCsUs((id)self, aString, mask, aRange);
|
||||||
|
@ -381,7 +382,7 @@ compare_u(ivars self, NSString *aString, unsigned mask, NSRange aRange)
|
||||||
if (fastIsInstance(aString) == NO)
|
if (fastIsInstance(aString) == NO)
|
||||||
return strCompUsNs((id)self, aString, mask, aRange);
|
return strCompUsNs((id)self, aString, mask, aRange);
|
||||||
|
|
||||||
c = fastClass(aString);
|
c = GSObjCClassOfObject(aString);
|
||||||
if (fastClassIsKindOfClass(c, GSUStringClass)
|
if (fastClassIsKindOfClass(c, GSUStringClass)
|
||||||
|| (c == GSMStringClass && ((ivars)aString)->_flags.wide == 1))
|
|| (c == GSMStringClass && ((ivars)aString)->_flags.wide == 1))
|
||||||
return strCompUsUs((id)self, aString, mask, aRange);
|
return strCompUsUs((id)self, aString, mask, aRange);
|
||||||
|
@ -1057,7 +1058,7 @@ rangeOfString_c(ivars self, NSString *aString, unsigned mask, NSRange aRange)
|
||||||
if (fastIsInstance(aString) == NO)
|
if (fastIsInstance(aString) == NO)
|
||||||
return strRangeCsNs((id)self, aString, mask, aRange);
|
return strRangeCsNs((id)self, aString, mask, aRange);
|
||||||
|
|
||||||
c = fastClass(aString);
|
c = GSObjCClassOfObject(aString);
|
||||||
if (fastClassIsKindOfClass(c, GSUStringClass) == YES
|
if (fastClassIsKindOfClass(c, GSUStringClass) == YES
|
||||||
|| (c == GSMStringClass && ((ivars)aString)->_flags.wide == 1))
|
|| (c == GSMStringClass && ((ivars)aString)->_flags.wide == 1))
|
||||||
return strRangeCsUs((id)self, aString, mask, aRange);
|
return strRangeCsUs((id)self, aString, mask, aRange);
|
||||||
|
@ -1079,7 +1080,7 @@ rangeOfString_u(ivars self, NSString *aString, unsigned mask, NSRange aRange)
|
||||||
if (fastIsInstance(aString) == NO)
|
if (fastIsInstance(aString) == NO)
|
||||||
return strRangeUsNs((id)self, aString, mask, aRange);
|
return strRangeUsNs((id)self, aString, mask, aRange);
|
||||||
|
|
||||||
c = fastClass(aString);
|
c = GSObjCClassOfObject(aString);
|
||||||
if (fastClassIsKindOfClass(c, GSUStringClass) == YES
|
if (fastClassIsKindOfClass(c, GSUStringClass) == YES
|
||||||
|| (c == GSMStringClass && ((ivars)aString)->_flags.wide == 1))
|
|| (c == GSMStringClass && ((ivars)aString)->_flags.wide == 1))
|
||||||
return strRangeUsUs((id)self, aString, mask, aRange);
|
return strRangeUsUs((id)self, aString, mask, aRange);
|
||||||
|
@ -1137,7 +1138,7 @@ transmute(ivars self, NSString *aString)
|
||||||
{
|
{
|
||||||
ivars other;
|
ivars other;
|
||||||
BOOL transmute;
|
BOOL transmute;
|
||||||
Class c = fastClass(aString);
|
Class c = GSObjCClassOfObject(aString); // NB aString must not be nil
|
||||||
|
|
||||||
other = (ivars)aString;
|
other = (ivars)aString;
|
||||||
transmute = YES;
|
transmute = YES;
|
||||||
|
@ -2202,6 +2203,12 @@ transmute(ivars self, NSString *aString)
|
||||||
unsigned length;
|
unsigned length;
|
||||||
|
|
||||||
GS_RANGE_CHECK(aRange, _count);
|
GS_RANGE_CHECK(aRange, _count);
|
||||||
|
if (aString == nil)
|
||||||
|
[NSException raise: NSInvalidArgumentException
|
||||||
|
format: @"replace characters with nil string"];
|
||||||
|
if (fastIsInstance(aString) == NO)
|
||||||
|
[NSException raise: NSInvalidArgumentException
|
||||||
|
format: @"replace characters with non-string"];
|
||||||
|
|
||||||
length = (aString == nil) ? 0 : [aString length];
|
length = (aString == nil) ? 0 : [aString length];
|
||||||
offset = length - aRange.length;
|
offset = length - aRange.length;
|
||||||
|
|
|
@ -244,6 +244,22 @@ $(GNUSTEP_OBJ_DIR)/NSString.o \
|
||||||
$(GNUSTEP_OBJ_DIR)/NSUnarchiver.o \
|
$(GNUSTEP_OBJ_DIR)/NSUnarchiver.o \
|
||||||
: $(HEADER_DIR)/fast.x
|
: $(HEADER_DIR)/fast.x
|
||||||
|
|
||||||
|
#
|
||||||
|
# Files that include NSObjCRuntime.h will need a rebuild if it is changed.
|
||||||
|
#
|
||||||
|
$(GNUSTEP_OBJ_DIR)/GSString.o \
|
||||||
|
$(GNUSTEP_OBJ_DIR)/NSArchiver.o \
|
||||||
|
$(GNUSTEP_OBJ_DIR)/NSArray.o \
|
||||||
|
$(GNUSTEP_OBJ_DIR)/NSData.o \
|
||||||
|
$(GNUSTEP_OBJ_DIR)/NSGDictionary.o \
|
||||||
|
$(GNUSTEP_OBJ_DIR)/NSInvocation.o \
|
||||||
|
$(GNUSTEP_OBJ_DIR)/NSObjCRuntime.o \
|
||||||
|
$(GNUSTEP_OBJ_DIR)/NSObject.o \
|
||||||
|
$(GNUSTEP_OBJ_DIR)/NSSerializer.o \
|
||||||
|
$(GNUSTEP_OBJ_DIR)/NSString.o \
|
||||||
|
$(GNUSTEP_OBJ_DIR)/NSUnarchiver.o \
|
||||||
|
: $(HEADER_DIR)/NSObjCRuntime.h
|
||||||
|
|
||||||
#
|
#
|
||||||
# Files that include GSeq.h will need a rebuild if it is changed.
|
# Files that include GSeq.h will need a rebuild if it is changed.
|
||||||
#
|
#
|
||||||
|
|
|
@ -60,6 +60,9 @@ static SEL xRefSel;
|
||||||
static SEL eObjSel;
|
static SEL eObjSel;
|
||||||
static SEL eValSel;
|
static SEL eValSel;
|
||||||
|
|
||||||
|
@class NSMutableDataMalloc;
|
||||||
|
static Class NSMutableDataMallocClass;
|
||||||
|
|
||||||
+ (void) initialize
|
+ (void) initialize
|
||||||
{
|
{
|
||||||
if (self == [NSArchiver class])
|
if (self == [NSArchiver class])
|
||||||
|
@ -69,6 +72,7 @@ static SEL eValSel;
|
||||||
xRefSel = @selector(serializeTypeTag:andCrossRef:);
|
xRefSel = @selector(serializeTypeTag:andCrossRef:);
|
||||||
eObjSel = @selector(encodeObject:);
|
eObjSel = @selector(encodeObject:);
|
||||||
eValSel = @selector(encodeValueOfObjCType:at:);
|
eValSel = @selector(encodeValueOfObjCType:at:);
|
||||||
|
NSMutableDataMallocClass = [NSMutableDataMalloc class];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -76,7 +80,7 @@ static SEL eValSel;
|
||||||
{
|
{
|
||||||
NSMutableData *d;
|
NSMutableData *d;
|
||||||
|
|
||||||
d = [[_fastCls._NSMutableDataMalloc allocWithZone: fastZone(self)] init];
|
d = [[NSMutableDataMallocClass allocWithZone: fastZone(self)] init];
|
||||||
self = [self initForWritingWithMutableData: d];
|
self = [self initForWritingWithMutableData: d];
|
||||||
RELEASE(d);
|
RELEASE(d);
|
||||||
return self;
|
return self;
|
||||||
|
@ -162,7 +166,7 @@ static SEL eValSel;
|
||||||
id d;
|
id d;
|
||||||
NSZone *z = NSDefaultMallocZone();
|
NSZone *z = NSDefaultMallocZone();
|
||||||
|
|
||||||
d = [[_fastCls._NSMutableDataMalloc allocWithZone: z] initWithCapacity: 0];
|
d = [[NSMutableDataMallocClass allocWithZone: z] initWithCapacity: 0];
|
||||||
if (d == nil)
|
if (d == nil)
|
||||||
{
|
{
|
||||||
return nil;
|
return nil;
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
#include <Foundation/NSString.h>
|
#include <Foundation/NSString.h>
|
||||||
#include <Foundation/NSException.h>
|
#include <Foundation/NSException.h>
|
||||||
#include <Foundation/NSCoder.h>
|
#include <Foundation/NSCoder.h>
|
||||||
|
#include <Foundation/NSObjCRuntime.h>
|
||||||
#include <base/preface.h>
|
#include <base/preface.h>
|
||||||
#include <base/fast.x>
|
#include <base/fast.x>
|
||||||
|
|
||||||
|
@ -81,7 +82,8 @@
|
||||||
|
|
||||||
- (BOOL) isEqual: (id)other
|
- (BOOL) isEqual: (id)other
|
||||||
{
|
{
|
||||||
if (other != nil && fastInstanceIsKindOfClass(other, fastClass(self)))
|
if (other != nil
|
||||||
|
&& fastInstanceIsKindOfClass(other, GSObjCClassOfObject(self)))
|
||||||
{
|
{
|
||||||
return [self isEqualToValue: other];
|
return [self isEqualToValue: other];
|
||||||
}
|
}
|
||||||
|
@ -92,7 +94,8 @@
|
||||||
{
|
{
|
||||||
typedef __typeof__(data) _dt;
|
typedef __typeof__(data) _dt;
|
||||||
|
|
||||||
if (aValue != nil && fastInstanceIsKindOfClass(aValue, fastClass(self)))
|
if (aValue != nil
|
||||||
|
&& fastInstanceIsKindOfClass(aValue, GSObjCClassOfObject(self)))
|
||||||
{
|
{
|
||||||
_dt val = [aValue TYPE_METHOD];
|
_dt val = [aValue TYPE_METHOD];
|
||||||
#if TYPE_ORDER == 0
|
#if TYPE_ORDER == 0
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
#include <Foundation/NSException.h>
|
#include <Foundation/NSException.h>
|
||||||
#include <Foundation/NSCoder.h>
|
#include <Foundation/NSCoder.h>
|
||||||
#include <Foundation/NSZone.h>
|
#include <Foundation/NSZone.h>
|
||||||
|
#include <Foundation/NSObjCRuntime.h>
|
||||||
#include <base/preface.h>
|
#include <base/preface.h>
|
||||||
#include <base/fast.x>
|
#include <base/fast.x>
|
||||||
|
|
||||||
|
@ -104,7 +105,7 @@
|
||||||
|
|
||||||
- (BOOL) isEqualToValue: (NSValue*)aValue
|
- (BOOL) isEqualToValue: (NSValue*)aValue
|
||||||
{
|
{
|
||||||
if (fastClass(aValue) != fastClass(self))
|
if (GSObjCClassOfObject(aValue) != GSObjCClassOfObject(self))
|
||||||
return NO;
|
return NO;
|
||||||
if (strcmp(objctype, ((NSConcreteValue*)aValue)->objctype) != 0)
|
if (strcmp(objctype, ((NSConcreteValue*)aValue)->objctype) != 0)
|
||||||
return NO;
|
return NO;
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
#include <Foundation/NSLock.h>
|
#include <Foundation/NSLock.h>
|
||||||
#include <Foundation/NSNotification.h>
|
#include <Foundation/NSNotification.h>
|
||||||
#include <Foundation/NSThread.h>
|
#include <Foundation/NSThread.h>
|
||||||
|
#include <Foundation/NSObjCRuntime.h>
|
||||||
|
|
||||||
@class NSSetNonCore;
|
@class NSSetNonCore;
|
||||||
@class NSMutableSetNonCore;
|
@class NSMutableSetNonCore;
|
||||||
|
@ -110,7 +111,7 @@ static Class NSCountedSet_concrete_class;
|
||||||
- (id) initWithCoder: (NSCoder*)aCoder
|
- (id) initWithCoder: (NSCoder*)aCoder
|
||||||
{
|
{
|
||||||
unsigned count;
|
unsigned count;
|
||||||
Class c = fastClass(self);
|
Class c = GSObjCClassOfObject(self);
|
||||||
|
|
||||||
if (c == NSCountedSet_abstract_class)
|
if (c == NSCountedSet_abstract_class)
|
||||||
{
|
{
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
#include <Foundation/NSUserDefaults.h>
|
#include <Foundation/NSUserDefaults.h>
|
||||||
#include <Foundation/NSCharacterSet.h>
|
#include <Foundation/NSCharacterSet.h>
|
||||||
#include <Foundation/NSScanner.h>
|
#include <Foundation/NSScanner.h>
|
||||||
|
#include <Foundation/NSObjCRuntime.h>
|
||||||
#include <base/preface.h>
|
#include <base/preface.h>
|
||||||
#include <base/behavior.h>
|
#include <base/behavior.h>
|
||||||
#include <base/fast.x>
|
#include <base/fast.x>
|
||||||
|
@ -97,8 +98,13 @@ findInArray(NSArray *array, unsigned pos, NSString *str)
|
||||||
static inline NSTimeInterval
|
static inline NSTimeInterval
|
||||||
otherTime(NSDate* other)
|
otherTime(NSDate* other)
|
||||||
{
|
{
|
||||||
Class c = fastClass(other);
|
Class c;
|
||||||
|
|
||||||
|
if (other == nil)
|
||||||
|
[NSException raise: NSInvalidArgumentException format: @"other time nil"];
|
||||||
|
if (fastIsInstance(other) == NO)
|
||||||
|
[NSException raise: NSInvalidArgumentException format: @"other time bad"];
|
||||||
|
c = GSObjCClassOfObject(other);
|
||||||
if (c == concreteClass || c == calendarClass)
|
if (c == concreteClass || c == calendarClass)
|
||||||
return ((NSGDate*)other)->_seconds_since_ref;
|
return ((NSGDate*)other)->_seconds_since_ref;
|
||||||
else
|
else
|
||||||
|
|
|
@ -35,6 +35,7 @@
|
||||||
#include <Foundation/NSUserDefaults.h>
|
#include <Foundation/NSUserDefaults.h>
|
||||||
#include <Foundation/NSCoder.h>
|
#include <Foundation/NSCoder.h>
|
||||||
#include <Foundation/NSDebug.h>
|
#include <Foundation/NSDebug.h>
|
||||||
|
#include <Foundation/NSObjCRuntime.h>
|
||||||
|
|
||||||
@interface NSDictionaryNonCore : NSDictionary
|
@interface NSDictionaryNonCore : NSDictionary
|
||||||
@end
|
@end
|
||||||
|
@ -779,14 +780,14 @@ static NSString *indentStrings[] = {
|
||||||
|
|
||||||
for (i = 0; i < numKeys; i++)
|
for (i = 0; i < numKeys; i++)
|
||||||
{
|
{
|
||||||
if (fastClass(keys[i]) == lastClass)
|
if (GSObjCClassOfObject(keys[i]) == lastClass)
|
||||||
continue;
|
continue;
|
||||||
if ([keys[i] respondsToSelector: @selector(compare:)] == NO)
|
if ([keys[i] respondsToSelector: @selector(compare:)] == NO)
|
||||||
{
|
{
|
||||||
canCompare = NO;
|
canCompare = NO;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
lastClass = fastClass(keys[i]);
|
lastClass = GSObjCClassOfObject(keys[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (canCompare == YES)
|
if (canCompare == YES)
|
||||||
|
@ -830,7 +831,7 @@ static NSString *indentStrings[] = {
|
||||||
Class x;
|
Class x;
|
||||||
NSComparisonResult r;
|
NSComparisonResult r;
|
||||||
|
|
||||||
x = fastClass(a);
|
x = GSObjCClassOfObject(a);
|
||||||
if (x != lastClass)
|
if (x != lastClass)
|
||||||
{
|
{
|
||||||
lastClass = x;
|
lastClass = x;
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
#include <Foundation/NSPort.h>
|
#include <Foundation/NSPort.h>
|
||||||
#include <Foundation/NSMethodSignature.h>
|
#include <Foundation/NSMethodSignature.h>
|
||||||
#include <Foundation/NSException.h>
|
#include <Foundation/NSException.h>
|
||||||
|
#include <Foundation/NSObjCRuntime.h>
|
||||||
|
|
||||||
static int debug_proxy = 0;
|
static int debug_proxy = 0;
|
||||||
static Class placeHolder = 0;
|
static Class placeHolder = 0;
|
||||||
|
@ -742,7 +743,7 @@ enum
|
||||||
|
|
||||||
- (IMP) methodForSelector: (SEL)aSelector
|
- (IMP) methodForSelector: (SEL)aSelector
|
||||||
{
|
{
|
||||||
return get_imp(fastClass((id)self), aSelector);
|
return get_imp(GSObjCClassOfObject((id)self), aSelector);
|
||||||
}
|
}
|
||||||
|
|
||||||
- (NSMethodSignature*) methodSignatureForSelector: (SEL)aSelector
|
- (NSMethodSignature*) methodSignatureForSelector: (SEL)aSelector
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
#include <Foundation/NSString.h>
|
#include <Foundation/NSString.h>
|
||||||
#include <Foundation/NSPortCoder.h>
|
#include <Foundation/NSPortCoder.h>
|
||||||
#include <Foundation/NSDebug.h>
|
#include <Foundation/NSDebug.h>
|
||||||
|
#include <Foundation/NSObjCRuntime.h>
|
||||||
|
|
||||||
#define GSI_MAP_HAS_VALUE 0
|
#define GSI_MAP_HAS_VALUE 0
|
||||||
#define GSI_MAP_KTYPES GSUNION_OBJ
|
#define GSI_MAP_KTYPES GSUNION_OBJ
|
||||||
|
@ -249,7 +250,7 @@ static Class mutableSetClass;
|
||||||
return NO;
|
return NO;
|
||||||
|
|
||||||
// Loop for all members in otherSet
|
// Loop for all members in otherSet
|
||||||
c = fastClass(otherSet);
|
c = GSObjCClassOfObject(otherSet);
|
||||||
if (c == setClass || c == mutableSetClass)
|
if (c == setClass || c == mutableSetClass)
|
||||||
{
|
{
|
||||||
GSIMapNode node = ((NSGSet*)otherSet)->map.firstNode;
|
GSIMapNode node = ((NSGSet*)otherSet)->map.firstNode;
|
||||||
|
@ -319,7 +320,7 @@ static Class mutableSetClass;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Class c = fastClass(other);
|
Class c = GSObjCClassOfObject(other);
|
||||||
|
|
||||||
if (c == setClass || c == mutableSetClass)
|
if (c == setClass || c == mutableSetClass)
|
||||||
{
|
{
|
||||||
|
|
|
@ -36,6 +36,7 @@
|
||||||
#include <Foundation/NSThread.h>
|
#include <Foundation/NSThread.h>
|
||||||
#include <Foundation/NSCoder.h>
|
#include <Foundation/NSCoder.h>
|
||||||
#include <Foundation/NSPortCoder.h>
|
#include <Foundation/NSPortCoder.h>
|
||||||
|
#include <Foundation/NSObjCRuntime.h>
|
||||||
|
|
||||||
@implementation NSNumber
|
@implementation NSNumber
|
||||||
|
|
||||||
|
@ -56,7 +57,9 @@ GSNumberInfoFromObject(NSNumber *o)
|
||||||
Class c;
|
Class c;
|
||||||
GSNumberInfo *info;
|
GSNumberInfo *info;
|
||||||
|
|
||||||
c = fastClass(o);
|
if (o == nil)
|
||||||
|
return nil;
|
||||||
|
c = GSObjCClassOfObject(o);
|
||||||
info = (GSNumberInfo*)NSMapGet (numberMap, (void*)c);
|
info = (GSNumberInfo*)NSMapGet (numberMap, (void*)c);
|
||||||
if (info == 0)
|
if (info == 0)
|
||||||
{
|
{
|
||||||
|
@ -664,7 +667,7 @@ static Class doubleNumberClass;
|
||||||
|
|
||||||
- (NSString*) descriptionWithLocale: (NSDictionary*)locale
|
- (NSString*) descriptionWithLocale: (NSDictionary*)locale
|
||||||
{
|
{
|
||||||
if (fastClass(self) == abstractClass)
|
if (GSObjCClassOfObject(self) == abstractClass)
|
||||||
{
|
{
|
||||||
[NSException raise: NSInternalInconsistencyException
|
[NSException raise: NSInternalInconsistencyException
|
||||||
format: @"descriptionWithLocale: for abstract NSNumber"];
|
format: @"descriptionWithLocale: for abstract NSNumber"];
|
||||||
|
@ -725,7 +728,7 @@ static Class doubleNumberClass;
|
||||||
/* All the rest of these methods must be implemented by a subclass */
|
/* All the rest of these methods must be implemented by a subclass */
|
||||||
- (BOOL) boolValue
|
- (BOOL) boolValue
|
||||||
{
|
{
|
||||||
if (fastClass(self) == abstractClass)
|
if (GSObjCClassOfObject(self) == abstractClass)
|
||||||
[NSException raise: NSInternalInconsistencyException
|
[NSException raise: NSInternalInconsistencyException
|
||||||
format: @"get boolValue from abstract NSNumber"];
|
format: @"get boolValue from abstract NSNumber"];
|
||||||
else
|
else
|
||||||
|
@ -835,7 +838,7 @@ static Class doubleNumberClass;
|
||||||
|
|
||||||
- (signed char) charValue
|
- (signed char) charValue
|
||||||
{
|
{
|
||||||
if (fastClass(self) == abstractClass)
|
if (GSObjCClassOfObject(self) == abstractClass)
|
||||||
[NSException raise: NSInternalInconsistencyException
|
[NSException raise: NSInternalInconsistencyException
|
||||||
format: @"get charValue from abstract NSNumber"];
|
format: @"get charValue from abstract NSNumber"];
|
||||||
else
|
else
|
||||||
|
@ -945,7 +948,7 @@ static Class doubleNumberClass;
|
||||||
|
|
||||||
- (double) doubleValue
|
- (double) doubleValue
|
||||||
{
|
{
|
||||||
if (fastClass(self) == abstractClass)
|
if (GSObjCClassOfObject(self) == abstractClass)
|
||||||
[NSException raise: NSInternalInconsistencyException
|
[NSException raise: NSInternalInconsistencyException
|
||||||
format: @"get doubleValue from abstract NSNumber"];
|
format: @"get doubleValue from abstract NSNumber"];
|
||||||
else
|
else
|
||||||
|
@ -1055,7 +1058,7 @@ static Class doubleNumberClass;
|
||||||
|
|
||||||
- (float) floatValue
|
- (float) floatValue
|
||||||
{
|
{
|
||||||
if (fastClass(self) == abstractClass)
|
if (GSObjCClassOfObject(self) == abstractClass)
|
||||||
[NSException raise: NSInternalInconsistencyException
|
[NSException raise: NSInternalInconsistencyException
|
||||||
format: @"get floatValue from abstract NSNumber"];
|
format: @"get floatValue from abstract NSNumber"];
|
||||||
else
|
else
|
||||||
|
@ -1165,7 +1168,7 @@ static Class doubleNumberClass;
|
||||||
|
|
||||||
- (signed int) intValue
|
- (signed int) intValue
|
||||||
{
|
{
|
||||||
if (fastClass(self) == abstractClass)
|
if (GSObjCClassOfObject(self) == abstractClass)
|
||||||
[NSException raise: NSInternalInconsistencyException
|
[NSException raise: NSInternalInconsistencyException
|
||||||
format: @"get intValue from abstract NSNumber"];
|
format: @"get intValue from abstract NSNumber"];
|
||||||
else
|
else
|
||||||
|
@ -1275,7 +1278,7 @@ static Class doubleNumberClass;
|
||||||
|
|
||||||
- (signed long long) longLongValue
|
- (signed long long) longLongValue
|
||||||
{
|
{
|
||||||
if (fastClass(self) == abstractClass)
|
if (GSObjCClassOfObject(self) == abstractClass)
|
||||||
[NSException raise: NSInternalInconsistencyException
|
[NSException raise: NSInternalInconsistencyException
|
||||||
format: @"get longLongValue from abstract NSNumber"];
|
format: @"get longLongValue from abstract NSNumber"];
|
||||||
else
|
else
|
||||||
|
@ -1385,7 +1388,7 @@ static Class doubleNumberClass;
|
||||||
|
|
||||||
- (signed long) longValue
|
- (signed long) longValue
|
||||||
{
|
{
|
||||||
if (fastClass(self) == abstractClass)
|
if (GSObjCClassOfObject(self) == abstractClass)
|
||||||
[NSException raise: NSInternalInconsistencyException
|
[NSException raise: NSInternalInconsistencyException
|
||||||
format: @"get longValue from abstract NSNumber"];
|
format: @"get longValue from abstract NSNumber"];
|
||||||
else
|
else
|
||||||
|
@ -1495,7 +1498,7 @@ static Class doubleNumberClass;
|
||||||
|
|
||||||
- (signed short) shortValue
|
- (signed short) shortValue
|
||||||
{
|
{
|
||||||
if (fastClass(self) == abstractClass)
|
if (GSObjCClassOfObject(self) == abstractClass)
|
||||||
[NSException raise: NSInternalInconsistencyException
|
[NSException raise: NSInternalInconsistencyException
|
||||||
format: @"get shortValue from abstract NSNumber"];
|
format: @"get shortValue from abstract NSNumber"];
|
||||||
else
|
else
|
||||||
|
@ -1610,7 +1613,7 @@ static Class doubleNumberClass;
|
||||||
|
|
||||||
- (unsigned char) unsignedCharValue
|
- (unsigned char) unsignedCharValue
|
||||||
{
|
{
|
||||||
if (fastClass(self) == abstractClass)
|
if (GSObjCClassOfObject(self) == abstractClass)
|
||||||
[NSException raise: NSInternalInconsistencyException
|
[NSException raise: NSInternalInconsistencyException
|
||||||
format: @"get unsignedCharrValue from abstract NSNumber"];
|
format: @"get unsignedCharrValue from abstract NSNumber"];
|
||||||
else
|
else
|
||||||
|
@ -1720,7 +1723,7 @@ static Class doubleNumberClass;
|
||||||
|
|
||||||
- (unsigned int) unsignedIntValue
|
- (unsigned int) unsignedIntValue
|
||||||
{
|
{
|
||||||
if (fastClass(self) == abstractClass)
|
if (GSObjCClassOfObject(self) == abstractClass)
|
||||||
[NSException raise: NSInternalInconsistencyException
|
[NSException raise: NSInternalInconsistencyException
|
||||||
format: @"get unsignedIntValue from abstract NSNumber"];
|
format: @"get unsignedIntValue from abstract NSNumber"];
|
||||||
else
|
else
|
||||||
|
@ -1830,7 +1833,7 @@ static Class doubleNumberClass;
|
||||||
|
|
||||||
- (unsigned long long) unsignedLongLongValue
|
- (unsigned long long) unsignedLongLongValue
|
||||||
{
|
{
|
||||||
if (fastClass(self) == abstractClass)
|
if (GSObjCClassOfObject(self) == abstractClass)
|
||||||
[NSException raise: NSInternalInconsistencyException
|
[NSException raise: NSInternalInconsistencyException
|
||||||
format: @"get unsignedLongLongValue from abstract NSNumber"];
|
format: @"get unsignedLongLongValue from abstract NSNumber"];
|
||||||
else
|
else
|
||||||
|
@ -1940,7 +1943,7 @@ static Class doubleNumberClass;
|
||||||
|
|
||||||
- (unsigned long) unsignedLongValue
|
- (unsigned long) unsignedLongValue
|
||||||
{
|
{
|
||||||
if (fastClass(self) == abstractClass)
|
if (GSObjCClassOfObject(self) == abstractClass)
|
||||||
[NSException raise: NSInternalInconsistencyException
|
[NSException raise: NSInternalInconsistencyException
|
||||||
format: @"get unsignedLongValue from abstract NSNumber"];
|
format: @"get unsignedLongValue from abstract NSNumber"];
|
||||||
else
|
else
|
||||||
|
@ -2050,7 +2053,7 @@ static Class doubleNumberClass;
|
||||||
|
|
||||||
- (unsigned short) unsignedShortValue
|
- (unsigned short) unsignedShortValue
|
||||||
{
|
{
|
||||||
if (fastClass(self) == abstractClass)
|
if (GSObjCClassOfObject(self) == abstractClass)
|
||||||
[NSException raise: NSInternalInconsistencyException
|
[NSException raise: NSInternalInconsistencyException
|
||||||
format: @"get unsignedShortValue from abstract NSNumber"];
|
format: @"get unsignedShortValue from abstract NSNumber"];
|
||||||
else
|
else
|
||||||
|
|
|
@ -40,14 +40,13 @@
|
||||||
#include <Foundation/NSDebug.h>
|
#include <Foundation/NSDebug.h>
|
||||||
#include <Foundation/NSThread.h>
|
#include <Foundation/NSThread.h>
|
||||||
#include <Foundation/NSNotification.h>
|
#include <Foundation/NSNotification.h>
|
||||||
|
#include <Foundation/NSObjCRuntime.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
|
|
||||||
#include <base/fast.x>
|
#include <base/fast.x>
|
||||||
|
|
||||||
extern BOOL __objc_responds_to(id, SEL);
|
extern BOOL __objc_responds_to(id, SEL);
|
||||||
|
|
||||||
fastCls _fastCls; /* Structure to cache classes. */
|
|
||||||
|
|
||||||
@class _FastMallocBuffer;
|
@class _FastMallocBuffer;
|
||||||
static Class fastMallocClass;
|
static Class fastMallocClass;
|
||||||
static unsigned fastMallocOffset;
|
static unsigned fastMallocOffset;
|
||||||
|
@ -57,20 +56,6 @@ static Class NXConstantStringClass;
|
||||||
@class NSDataMalloc;
|
@class NSDataMalloc;
|
||||||
@class NSMutableDataMalloc;
|
@class NSMutableDataMalloc;
|
||||||
|
|
||||||
void _fastBuildCache()
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Cache some classes for quick access later.
|
|
||||||
*/
|
|
||||||
|
|
||||||
_fastCls._NSArray = [NSArray class];
|
|
||||||
_fastCls._NSMutableArray = [NSMutableArray class];
|
|
||||||
_fastCls._NSDictionary = [NSDictionary class];
|
|
||||||
_fastCls._NSMutableDictionary = [NSMutableDictionary class];
|
|
||||||
_fastCls._NSDataMalloc = [NSDataMalloc class];
|
|
||||||
_fastCls._NSMutableDataMalloc = [NSMutableDataMalloc class];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Reference count and memory management
|
* Reference count and memory management
|
||||||
|
@ -424,7 +409,7 @@ NSDeallocateObject(NSObject *anObject)
|
||||||
inline NSZone *
|
inline NSZone *
|
||||||
fastZone(NSObject *object)
|
fastZone(NSObject *object)
|
||||||
{
|
{
|
||||||
if (fastClass(object) == NXConstantStringClass)
|
if (GSObjCClassOfObject(object) == NXConstantStringClass)
|
||||||
return NSDefaultMallocZone();
|
return NSDefaultMallocZone();
|
||||||
return ((obj)object)[-1].zone;
|
return ((obj)object)[-1].zone;
|
||||||
}
|
}
|
||||||
|
@ -434,7 +419,7 @@ fastZone(NSObject *object)
|
||||||
inline NSZone *
|
inline NSZone *
|
||||||
fastZone(NSObject *object)
|
fastZone(NSObject *object)
|
||||||
{
|
{
|
||||||
if (fastClass(object) == NXConstantStringClass)
|
if (GSObjCClassOfObject(object) == NXConstantStringClass)
|
||||||
return NSDefaultMallocZone();
|
return NSDefaultMallocZone();
|
||||||
return NSZoneFromPointer(&((obj)object)[-1]);
|
return NSZoneFromPointer(&((obj)object)[-1]);
|
||||||
}
|
}
|
||||||
|
@ -495,7 +480,7 @@ NSDeallocateObject(NSObject *anObject)
|
||||||
inline NSZone *
|
inline NSZone *
|
||||||
fastZone(NSObject *object)
|
fastZone(NSObject *object)
|
||||||
{
|
{
|
||||||
if (fastClass(object) == NXConstantStringClass)
|
if (GSObjCClassOfObject(object) == NXConstantStringClass)
|
||||||
return NSDefaultMallocZone();
|
return NSDefaultMallocZone();
|
||||||
return NSZoneFromPointer(object);
|
return NSZoneFromPointer(object);
|
||||||
}
|
}
|
||||||
|
@ -622,7 +607,6 @@ static BOOL double_release_check_enabled = NO;
|
||||||
fastMallocOffset = 0;
|
fastMallocOffset = 0;
|
||||||
#endif
|
#endif
|
||||||
NXConstantStringClass = [NXConstantString class];
|
NXConstantStringClass = [NXConstantString class];
|
||||||
_fastBuildCache();
|
|
||||||
GSBuildStrings();
|
GSBuildStrings();
|
||||||
[[NSNotificationCenter defaultCenter]
|
[[NSNotificationCenter defaultCenter]
|
||||||
addObserver: self
|
addObserver: self
|
||||||
|
@ -754,12 +738,12 @@ static BOOL deallocNotifications = NO;
|
||||||
- (IMP) methodForSelector: (SEL)aSelector
|
- (IMP) methodForSelector: (SEL)aSelector
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* If 'self' is an instance, fastClass() will get the class,
|
* If 'self' is an instance, GSObjCClassOfObject() will get the class,
|
||||||
* and get_imp() will get the instance method.
|
* and get_imp() will get the instance method.
|
||||||
* If 'self' is a class, fastClass() will get the meta-class,
|
* If 'self' is a class, GSObjCClassOfObject() will get the meta-class,
|
||||||
* and get_imp() will get the class method.
|
* and get_imp() will get the class method.
|
||||||
*/
|
*/
|
||||||
return get_imp(fastClass(self), aSelector);
|
return get_imp(GSObjCClassOfObject(self), aSelector);
|
||||||
}
|
}
|
||||||
|
|
||||||
+ (NSMethodSignature*) instanceMethodSignatureForSelector: (SEL)aSelector
|
+ (NSMethodSignature*) instanceMethodSignatureForSelector: (SEL)aSelector
|
||||||
|
@ -843,7 +827,6 @@ static BOOL deallocNotifications = NO;
|
||||||
* We may have replaced a class in the cache, or may have replaced one
|
* We may have replaced a class in the cache, or may have replaced one
|
||||||
* which had cached methods, so we must rebuild the cache.
|
* which had cached methods, so we must rebuild the cache.
|
||||||
*/
|
*/
|
||||||
_fastBuildCache();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) doesNotRecognizeSelector: (SEL)aSelector
|
- (void) doesNotRecognizeSelector: (SEL)aSelector
|
||||||
|
@ -911,7 +894,7 @@ static BOOL deallocNotifications = NO;
|
||||||
* use get_imp() because NSDistantObject doesn't implement
|
* use get_imp() because NSDistantObject doesn't implement
|
||||||
* methodForSelector:
|
* methodForSelector:
|
||||||
*/
|
*/
|
||||||
proxyImp = get_imp(fastClass((id)proxyClass),
|
proxyImp = get_imp(GSObjCClassOfObject((id)proxyClass),
|
||||||
@selector(proxyWithLocal:connection:));
|
@selector(proxyWithLocal:connection:));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1025,7 +1008,7 @@ static BOOL deallocNotifications = NO;
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
msg = get_imp(fastClass(self), aSelector);
|
msg = get_imp(GSObjCClassOfObject(self), aSelector);
|
||||||
if (!msg)
|
if (!msg)
|
||||||
{
|
{
|
||||||
[NSException raise: NSGenericException
|
[NSException raise: NSGenericException
|
||||||
|
@ -1046,7 +1029,7 @@ static BOOL deallocNotifications = NO;
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
msg = get_imp(fastClass(self), aSelector);
|
msg = get_imp(GSObjCClassOfObject(self), aSelector);
|
||||||
if (!msg)
|
if (!msg)
|
||||||
{
|
{
|
||||||
[NSException raise: NSGenericException
|
[NSException raise: NSGenericException
|
||||||
|
@ -1070,7 +1053,7 @@ static BOOL deallocNotifications = NO;
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
msg = get_imp(fastClass(self), aSelector);
|
msg = get_imp(GSObjCClassOfObject(self), aSelector);
|
||||||
if (!msg)
|
if (!msg)
|
||||||
{
|
{
|
||||||
[NSException raise: NSGenericException
|
[NSException raise: NSGenericException
|
||||||
|
@ -1113,9 +1096,9 @@ static BOOL deallocNotifications = NO;
|
||||||
{
|
{
|
||||||
#if 0
|
#if 0
|
||||||
if (fastIsInstance(self))
|
if (fastIsInstance(self))
|
||||||
return (class_get_instance_method(fastClass(self), aSelector)!=METHOD_NULL);
|
return (class_get_instance_method(GSObjCClassOfObject(self), aSelector)!=METHOD_NULL);
|
||||||
else
|
else
|
||||||
return (class_get_class_method(fastClass(self), aSelector)!=METHOD_NULL);
|
return (class_get_class_method(GSObjCClassOfObject(self), aSelector)!=METHOD_NULL);
|
||||||
#else
|
#else
|
||||||
return __objc_responds_to(self, aSelector);
|
return __objc_responds_to(self, aSelector);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
#include <Foundation/NSScanner.h>
|
#include <Foundation/NSScanner.h>
|
||||||
#include <Foundation/NSException.h>
|
#include <Foundation/NSException.h>
|
||||||
#include <Foundation/NSUserDefaults.h>
|
#include <Foundation/NSUserDefaults.h>
|
||||||
|
#include <Foundation/NSObjCRuntime.h>
|
||||||
#include <float.h>
|
#include <float.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
@ -126,7 +127,7 @@ typedef struct {
|
||||||
aString = @"";
|
aString = @"";
|
||||||
}
|
}
|
||||||
|
|
||||||
c = fastClass(aString);
|
c = GSObjCClassOfObject(aString);
|
||||||
if (c == GSUString_class)
|
if (c == GSUString_class)
|
||||||
{
|
{
|
||||||
_isUnicode = YES;
|
_isUnicode = YES;
|
||||||
|
|
|
@ -34,6 +34,7 @@
|
||||||
#include <Foundation/NSSet.h>
|
#include <Foundation/NSSet.h>
|
||||||
#include <Foundation/NSThread.h>
|
#include <Foundation/NSThread.h>
|
||||||
#include <Foundation/NSNotificationQueue.h>
|
#include <Foundation/NSNotificationQueue.h>
|
||||||
|
#include <Foundation/NSObjCRuntime.h>
|
||||||
|
|
||||||
#include <base/NSGArray.h>
|
#include <base/NSGArray.h>
|
||||||
|
|
||||||
|
@ -133,8 +134,9 @@ static SEL setSel;
|
||||||
static void
|
static void
|
||||||
initSerializerInfo(_NSSerializerInfo* info, NSMutableData *d, BOOL u)
|
initSerializerInfo(_NSSerializerInfo* info, NSMutableData *d, BOOL u)
|
||||||
{
|
{
|
||||||
Class c = fastClass(d);
|
Class c;
|
||||||
|
|
||||||
|
c = GSObjCClassOfObject(d);
|
||||||
info->data = d;
|
info->data = d;
|
||||||
info->appImp = (void (*)())get_imp(c, appSel);
|
info->appImp = (void (*)())get_imp(c, appSel);
|
||||||
info->datImp = (void* (*)())get_imp(c, datSel);
|
info->datImp = (void* (*)())get_imp(c, datSel);
|
||||||
|
@ -160,8 +162,9 @@ endSerializerInfo(_NSSerializerInfo* info)
|
||||||
static void
|
static void
|
||||||
serializeToInfo(id object, _NSSerializerInfo* info)
|
serializeToInfo(id object, _NSSerializerInfo* info)
|
||||||
{
|
{
|
||||||
Class c = fastClass(object);
|
Class c;
|
||||||
|
|
||||||
|
c = GSObjCClassOfObject(object);
|
||||||
if (fastIsClass(c) == NO)
|
if (fastIsClass(c) == NO)
|
||||||
{
|
{
|
||||||
[NSException raise: NSInvalidArgumentException
|
[NSException raise: NSInvalidArgumentException
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
#include <Foundation/NSUtilities.h>
|
#include <Foundation/NSUtilities.h>
|
||||||
#include <Foundation/NSString.h>
|
#include <Foundation/NSString.h>
|
||||||
#include <Foundation/NSException.h>
|
#include <Foundation/NSException.h>
|
||||||
|
#include <Foundation/NSObjCRuntime.h>
|
||||||
|
|
||||||
@interface NSSetNonCore : NSSet
|
@interface NSSetNonCore : NSSet
|
||||||
@end
|
@end
|
||||||
|
@ -120,8 +121,9 @@ static Class NSMutableSet_concrete_class;
|
||||||
- (id) initWithCoder: (NSCoder*)aCoder
|
- (id) initWithCoder: (NSCoder*)aCoder
|
||||||
{
|
{
|
||||||
unsigned count;
|
unsigned count;
|
||||||
Class c = fastClass(self);
|
Class c;
|
||||||
|
|
||||||
|
c = GSObjCClassOfObject(self);
|
||||||
if (c == NSSet_abstract_class)
|
if (c == NSSet_abstract_class)
|
||||||
{
|
{
|
||||||
RELEASE(self);
|
RELEASE(self);
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
#include <Foundation/NSZone.h>
|
#include <Foundation/NSZone.h>
|
||||||
#include <Foundation/NSException.h>
|
#include <Foundation/NSException.h>
|
||||||
#include <Foundation/NSByteOrder.h>
|
#include <Foundation/NSByteOrder.h>
|
||||||
|
#include <Foundation/NSObjCRuntime.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Setup for inline operation of arrays.
|
* Setup for inline operation of arrays.
|
||||||
|
@ -294,6 +295,9 @@ mapClassName(NSUnarchiverObjectInfo *info)
|
||||||
|
|
||||||
@implementation NSUnarchiver
|
@implementation NSUnarchiver
|
||||||
|
|
||||||
|
@class NSDataMalloc;
|
||||||
|
static Class NSDataMallocClass;
|
||||||
|
|
||||||
+ (void) initialize
|
+ (void) initialize
|
||||||
{
|
{
|
||||||
if ([self class] == [NSUnarchiver class])
|
if ([self class] == [NSUnarchiver class])
|
||||||
|
@ -302,6 +306,7 @@ mapClassName(NSUnarchiverObjectInfo *info)
|
||||||
tagSel = @selector(deserializeTypeTag:andCrossRef:atCursor:);
|
tagSel = @selector(deserializeTypeTag:andCrossRef:atCursor:);
|
||||||
dValSel = @selector(decodeValueOfObjCType:at:);
|
dValSel = @selector(decodeValueOfObjCType:at:);
|
||||||
clsDict = [[NSMutableDictionary alloc] initWithCapacity: 200];
|
clsDict = [[NSMutableDictionary alloc] initWithCapacity: 200];
|
||||||
|
NSDataMallocClass = [NSDataMalloc class];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -328,7 +333,7 @@ mapClassName(NSUnarchiverObjectInfo *info)
|
||||||
|
|
||||||
+ (id) unarchiveObjectWithFile: (NSString*)path
|
+ (id) unarchiveObjectWithFile: (NSString*)path
|
||||||
{
|
{
|
||||||
NSData *d = [_fastCls._NSDataMalloc dataWithContentsOfFile: path];
|
NSData *d = [NSDataMallocClass dataWithContentsOfFile: path];
|
||||||
|
|
||||||
if (d != nil)
|
if (d != nil)
|
||||||
{
|
{
|
||||||
|
@ -1144,7 +1149,7 @@ mapClassName(NSUnarchiverObjectInfo *info)
|
||||||
|
|
||||||
TEST_RELEASE(data);
|
TEST_RELEASE(data);
|
||||||
data = RETAIN(anObject);
|
data = RETAIN(anObject);
|
||||||
c = fastClass(data);
|
c = GSObjCClassOfObject(data);
|
||||||
if (src != self)
|
if (src != self)
|
||||||
{
|
{
|
||||||
src = data;
|
src = data;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue