Revert "Implement NSDate as a small object (tagged pointer) - clang/libobjc2 only (#451)" because of GUI breakage: apps hang when loading NSMenu

This reverts commit 8fd2c06ddd.
This commit is contained in:
Riccardo Mottola 2024-10-31 02:13:24 +01:00 committed by rfm
parent d53a732576
commit fab621bb2d
6 changed files with 315 additions and 710 deletions

View file

@ -15,22 +15,7 @@
* Source/NSFileManager.m: Create an NSError object when we fail to
copy because the destination item already exists.
2024-10-10: Hugo Melder <hugo@algoriddim.com>
* Source/NSDate.m:
* Source/NSDatePrivate.h:
NSDate is now a small object in slot 6, when configuring GNUstep with the
clang/libobjc2 toolchain. This is done by compressing the binary64 fp
holding the seconds since reference date (because someone at Apple thought
it would be a good idea to represent a time interval as a fp). Note that
this assumes that IEEE 754 is used.
* Source/NSCalendarDate.m:
Remove access to the NSDate private concrete Class
and implement -timeIntervalSinceReferenceDate instead.
Previously, all methods of the concrete date class were
added to NSCalendarDate via GSObjCAddClassBehavior.
2024-23-09: Hugo Melder <hugo@algoriddim.com>
2024-09-23: Hugo Melder <hugo@algoriddim.com>
* Headers/Foundation/NSThread.h:
* Source/NSString.m:

View file

@ -58,6 +58,9 @@
@class GSAbsTimeZone;
@interface GSAbsTimeZone : NSObject // Help the compiler
@end
@class NSGDate;
@interface NSGDate : NSObject // Help the compiler
@end
#define DISTANT_FUTURE 63113990400.0
@ -393,6 +396,7 @@ GSPrivateTimeNow(void)
absAbrIMP = (NSString* (*)(id,SEL,id))
[absClass instanceMethodForSelector: abrSEL];
GSObjCAddClassBehavior(self, [NSGDate class]);
[pool release];
}
}
@ -459,11 +463,6 @@ GSPrivateTimeNow(void)
return AUTORELEASE(d);
}
- (NSTimeInterval) timeIntervalSinceReferenceDate
{
return _seconds_since_ref;
}
/**
* Creates and returns a new NSCalendarDate object by taking the
* value of the receiver and adding the interval in seconds specified.

File diff suppressed because it is too large Load diff

View file

@ -1,41 +0,0 @@
/** NSDate Private Interface
Copyright (C) 2024 Free Software Foundation, Inc.
Written by: Hugo Melder <hugo@algoriddim.com>
This file is part of the GNUstep Base Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110 USA.
*/
#import <Foundation/NSDate.h>
#if defined(OBJC_SMALL_OBJECT_SHIFT) && (OBJC_SMALL_OBJECT_SHIFT == 3)
#define USE_SMALL_DATE 1
#define DATE_CONCRETE_CLASS_NAME GSSmallDate
#else
#define USE_SMALL_DATE 0
#define DATE_CONCRETE_CLASS_NAME NSGDate
#endif
@interface DATE_CONCRETE_CLASS_NAME : NSDate
#if USE_SMALL_DATE == 0
{
@public
NSTimeInterval _seconds_since_ref;
}
#endif
@end

View file

@ -35,8 +35,9 @@
#import "Foundation/NSRunLoop.h"
#import "Foundation/NSInvocation.h"
#import "NSDatePrivate.h"
@class NSGDate;
@interface NSGDate : NSObject // Help the compiler
@end
static Class NSDate_class;
/**
@ -57,7 +58,7 @@ static Class NSDate_class;
{
if (self == [NSTimer class])
{
NSDate_class = [DATE_CONCRETE_CLASS_NAME class];
NSDate_class = [NSGDate class];
}
}

View file

@ -12,7 +12,7 @@
#ifdef EQ
#undef EQ
#endif
#define EPSILON (DBL_EPSILON*100)
#define EPSILON (FLT_EPSILON*100)
#define EQ(x,y) ((x >= y - EPSILON) && (x <= y + EPSILON))
@interface MyHandler : NSObject
@ -204,7 +204,6 @@ int main()
NSTimeInterval ot, nt;
ot = [[oa fileCreationDate] timeIntervalSinceReferenceDate];
nt = [[na fileCreationDate] timeIntervalSinceReferenceDate];
NSLog(@"ot = %f, nt = %f", ot, nt);
PASS(EQ(ot, nt), "copy creation date equals original")
ot = [[oa fileModificationDate] timeIntervalSinceReferenceDate];
nt = [[na fileModificationDate] timeIntervalSinceReferenceDate];