Skip to content

Commit 0e91936

Browse files
authored
Merge pull request #1518 from SwiftJava/master
2 parents 59a3792 + df28468 commit 0e91936

File tree

17 files changed

+57
-45
lines changed

17 files changed

+57
-45
lines changed

CoreFoundation/Base.subproj/CFInternal.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ extern void __CFGenericValidateType_(CFTypeRef cf, CFTypeID type, const char *fu
216216
#define __CFBitfield64GetValue(V, N1, N2) (((V) & __CFBitfield64Mask(N1, N2)) >> (N2))
217217
#define __CFBitfield64SetValue(V, N1, N2, X) ((V) = ((V) & ~__CFBitfield64Mask(N1, N2)) | ((((uint64_t)X) << (N2)) & __CFBitfield64Mask(N1, N2)))
218218

219-
#if __LP64__
219+
#if __LP64__ || DEPLOYMENT_TARGET_ANDROID
220220
typedef uint64_t __CFInfoType;
221221
#define __CFInfoMask(N1, N2) __CFBitfield64Mask(N1, N2)
222222
#else

CoreFoundation/Base.subproj/CFKnownLocations.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ CFURLRef _Nullable _CFKnownLocationCreatePreferencesURLForUser(CFKnownLocationUs
4545
}
4646

4747
}
48-
#elif !DEPLOYMENT_RUNTIME_OBJC && !DEPLOYMENT_TARGET_WINDOWS
48+
#elif !DEPLOYMENT_RUNTIME_OBJC && !DEPLOYMENT_TARGET_WINDOWS && !DEPLOYMENT_TARGET_ANDROID
4949

5050
/*
5151
Building for an OS that uses the FHS, BSD's hier(7), and/or the XDG specification for paths:

CoreFoundation/Base.subproj/CFPlatform.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,9 @@ CF_EXPORT CFStringRef CFCopyFullUserName(void) {
297297
uid_t euid;
298298
__CFGetUGIDs(&euid, NULL);
299299
struct passwd *upwd = getpwuid(euid ? euid : getuid());
300+
#if DEPLOYMENT_TARGET_ANDROID
301+
#define pw_gecos pw_name
302+
#endif
300303
if (upwd && upwd->pw_gecos) {
301304
result = CFStringCreateWithCString(kCFAllocatorSystemDefault, upwd->pw_gecos, kCFPlatformInterfaceStringEncoding);
302305
}

CoreFoundation/Base.subproj/CFUtilities.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1000,6 +1000,7 @@ void CFLog1(CFLogLevel lev, CFStringRef message) {
10001000
CFStringGetCString(message, buffer, maxLength, encoding);
10011001

10021002
__android_log_print(priority, tag, "%s", buffer);
1003+
fprintf(stderr, "%s\n", buffer);
10031004

10041005
if (buffer != &stack_buffer[0]) free(buffer);
10051006
#else

CoreFoundation/Base.subproj/ForSwiftFoundationOnly.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -403,6 +403,8 @@ static inline _Bool _withStackOrHeapBuffer(size_t amount, void (__attribute__((n
403403
static inline int _direntNameLength(struct dirent *entry) {
404404
#ifdef _D_EXACT_NAMLEN // defined on Linux
405405
return _D_EXACT_NAMLEN(entry);
406+
#elif DEPLOYMENT_TARGET_ANDROID
407+
return strlen(entry->d_name);
406408
#else
407409
return entry->d_namlen;
408410
#endif

CoreFoundation/NumberDate.subproj/CFTimeZone.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -813,6 +813,15 @@ static CFTimeZoneRef __CFTimeZoneCreateSystem(void) {
813813
CFRelease(name);
814814
if (result) return result;
815815
}
816+
#if DEPLOYMENT_TARGET_ANDROID
817+
// Timezone database by name not available on Android.
818+
// Approximate with gmtoff - could be general default.
819+
struct tm info;
820+
time_t now = time(NULL);
821+
if (NULL != localtime_r(&now, &info)) {
822+
return CFTimeZoneCreateWithTimeIntervalFromGMT(kCFAllocatorSystemDefault, info.tm_gmtoff);
823+
}
824+
#endif
816825
return CFTimeZoneCreateWithTimeIntervalFromGMT(kCFAllocatorSystemDefault, 0.0);
817826
}
818827

CoreFoundation/PlugIn.subproj/CFBundle.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ static void _CFBundleEnsureBundlesExistForImagePaths(CFArrayRef imagePaths);
137137

138138
#pragma mark -
139139

140-
#if !DEPLOYMENT_RUNTIME_OBJC && !DEPLOYMENT_TARGET_WINDOWS
140+
#if !DEPLOYMENT_RUNTIME_OBJC && !DEPLOYMENT_TARGET_WINDOWS && !DEPLOYMENT_TARGET_ANDROID
141141

142142
// Functions and constants for FHS bundles:
143143
#define _CFBundleFHSDirectory_share CFSTR("share")
@@ -162,10 +162,10 @@ static Boolean _CFBundleURLIsForFHSInstalledBundle(CFURLRef bundleURL) {
162162

163163
return isFHSBundle;
164164
}
165-
#endif // !DEPLOYMENT_RUNTIME_OBJC && !DEPLOYMENT_TARGET_WINDOWS
165+
#endif // !DEPLOYMENT_RUNTIME_OBJC && !DEPLOYMENT_TARGET_WINDOWS && !DEPLOYMENT_TARGET_ANDROID
166166

167167
Boolean _CFBundleSupportsFHSBundles() {
168-
#if !DEPLOYMENT_RUNTIME_OBJC && !DEPLOYMENT_TARGET_WINDOWS
168+
#if !DEPLOYMENT_RUNTIME_OBJC && !DEPLOYMENT_TARGET_WINDOWS && !DEPLOYMENT_TARGET_ANDROID
169169
return true;
170170
#else
171171
return false;
@@ -714,7 +714,7 @@ static CFBundleRef _CFBundleCreate(CFAllocatorRef allocator, CFURLRef bundleURL,
714714

715715
bundle->_url = newURL;
716716

717-
#if !DEPLOYMENT_RUNTIME_OBJC && !DEPLOYMENT_TARGET_WINDOWS
717+
#if !DEPLOYMENT_RUNTIME_OBJC && !DEPLOYMENT_TARGET_WINDOWS && !DEPLOYMENT_TARGET_ANDROID
718718
bundle->_isFHSInstalledBundle = _CFBundleURLIsForFHSInstalledBundle(newURL);
719719
#endif
720720

CoreFoundation/PlugIn.subproj/CFBundle_Executable.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
#include <dlfcn.h>
1616
#endif
1717

18-
#if !DEPLOYMENT_RUNTIME_OBJC && !DEPLOYMENT_TARGET_WINDOWS
18+
#if !DEPLOYMENT_RUNTIME_OBJC && !DEPLOYMENT_TARGET_WINDOWS && !DEPLOYMENT_TARGET_ANDROID
1919

2020
#if DEPLOYMENT_TARGET_LINUX
2121
#if __LP64__
@@ -48,7 +48,7 @@
4848
_kCFBundleFHSDirectory_lib
4949
#endif // DEPLOYMENT_TARGET_LINUX
5050

51-
#endif // !DEPLOYMENT_RUNTIME_OBJC && !DEPLOYMENT_TARGET_WINDOWS
51+
#endif // !DEPLOYMENT_RUNTIME_OBJC && !DEPLOYMENT_TARGET_WINDOWS && !DEPLOYMENT_TARGET_ANDROID
5252

5353
// This is here because on iPhoneOS with the dyld shared cache, we remove binaries from their
5454
// original locations on disk, so checking whether a binary's path exists is no longer sufficient.
@@ -73,7 +73,7 @@ static CFURLRef _CFBundleCopyExecutableURLRaw(CFURLRef urlPath, CFStringRef exeN
7373
CFURLRef executableURL = NULL;
7474
if (!urlPath || !exeName) return NULL;
7575

76-
#if !DEPLOYMENT_RUNTIME_OBJC && !DEPLOYMENT_TARGET_WINDOWS
76+
#if !DEPLOYMENT_RUNTIME_OBJC && !DEPLOYMENT_TARGET_WINDOWS && !DEPLOYMENT_TARGET_ANDROID
7777
if (!executableURL) {
7878
executableURL = CFURLCreateWithFileSystemPathRelativeToBase(kCFAllocatorSystemDefault, exeName, kCFURLPOSIXPathStyle, false, urlPath);
7979
if (!_binaryLoadable(executableURL)) {
@@ -203,7 +203,7 @@ static CFURLRef _CFBundleCopyExecutableURLInDirectory2(CFBundleRef bundle, CFURL
203203
Boolean doExecSearch = true;
204204
#endif
205205

206-
#if !DEPLOYMENT_RUNTIME_OBJC && !DEPLOYMENT_TARGET_WINDOWS
206+
#if !DEPLOYMENT_RUNTIME_OBJC && !DEPLOYMENT_TARGET_WINDOWS && !DEPLOYMENT_TARGET_ANDROID
207207
if (lookupMainExe && bundle && bundle->_isFHSInstalledBundle) {
208208
// For a FHS installed bundle, the URL points to share/Bundle.resources, and the binary is in:
209209

@@ -227,13 +227,13 @@ static CFURLRef _CFBundleCopyExecutableURLInDirectory2(CFBundleRef bundle, CFURL
227227

228228
CFRelease(prefixPath);
229229
}
230-
#endif // !DEPLOYMENT_RUNTIME_OBJC && !DEPLOYMENT_TARGET_WINDOWS
230+
#endif // !DEPLOYMENT_RUNTIME_OBJC && !DEPLOYMENT_TARGET_WINDOWS && !DEPLOYMENT_TARGET_ANDROID
231231

232232
// Now, look for the executable inside the bundle.
233233
if (!foundIt && doExecSearch && 0 != version) {
234234
CFURLRef exeDirURL = NULL;
235235

236-
#if !DEPLOYMENT_RUNTIME_OBJC && !DEPLOYMENT_TARGET_WINDOWS
236+
#if !DEPLOYMENT_RUNTIME_OBJC && !DEPLOYMENT_TARGET_WINDOWS && !DEPLOYMENT_TARGET_ANDROID
237237
if (bundle && bundle->_isFHSInstalledBundle) {
238238
CFURLRef withoutExtension = CFURLCreateCopyDeletingPathExtension(kCFAllocatorSystemDefault, url);
239239
CFStringRef lastPathComponent = CFURLCopyLastPathComponent(withoutExtension);
@@ -248,7 +248,7 @@ static CFURLRef _CFBundleCopyExecutableURLInDirectory2(CFBundleRef bundle, CFURL
248248
CFRelease(libexec);
249249
CFRelease(exeDirName);
250250
} else
251-
#endif // !DEPLOYMENT_RUNTIME_OBJC && !DEPLOYMENT_TARGET_WINDOWS
251+
#endif // !DEPLOYMENT_RUNTIME_OBJC && !DEPLOYMENT_TARGET_WINDOWS && !DEPLOYMENT_TARGET_ANDROID
252252
if (1 == version) {
253253
exeDirURL = CFURLCreateWithString(kCFAllocatorSystemDefault, _CFBundleExecutablesURLFromBase1, url);
254254
} else if (2 == version) {

CoreFoundation/PlugIn.subproj/CFBundle_Internal.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ CF_EXTERN_C_BEGIN
3131
#endif
3232

3333
// FHS bundles are supported on the Swift and C runtimes, except on Windows.
34-
#if !DEPLOYMENT_RUNTIME_OBJC && !DEPLOYMENT_TARGET_WINDOWS
34+
#if !DEPLOYMENT_RUNTIME_OBJC && !DEPLOYMENT_TARGET_WINDOWS && !DEPLOYMENT_TARGET_ANDROID
3535

3636
#if DEPLOYMENT_TARGET_LINUX || DEPLOYMENT_TARGET_FREEBSD
3737
#define _CFBundleFHSSharedLibraryFilenamePrefix CFSTR("lib")
@@ -43,7 +43,7 @@ CF_EXTERN_C_BEGIN
4343
#error Disable FHS bundles or specify shared library prefixes and suffixes for this platform.
4444
#endif // DEPLOYMENT_TARGET_…
4545

46-
#endif // !DEPLOYMENT_RUNTIME_OBJC && !DEPLOYMENT_TARGET_WINDOWS
46+
#endif // !DEPLOYMENT_RUNTIME_OBJC && !DEPLOYMENT_TARGET_WINDOWS && !DEPLOYMENT_TARGET_ANDROID
4747

4848
#define CFBundleExecutableNotFoundError 4
4949
#define CFBundleExecutableNotLoadableError 3584

CoreFoundation/URL.subproj/CFURL.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@
2525
#include <unistd.h>
2626
#include <sys/stat.h>
2727
#include <sys/types.h>
28-
#if __has_include(<sys/syslog.h>)
29-
#include <sys/syslog.h>
30-
#elif __has_include(<syslog.h>)
28+
#if __has_include(<syslog.h>)
3129
#include <syslog.h>
30+
#else
31+
#include <sys/syslog.h>
3232
#endif
3333
#include <CoreFoundation/CFURLPriv.h>
3434
#endif

Foundation/Bundle.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,10 @@ open class Bundle: NSObject {
5353
self.init(path: url.path)
5454
}
5555

56-
public init(for aClass: AnyClass) { NSUnimplemented() }
57-
56+
public init(for aClass: AnyClass) {
57+
NSUnimplemented()
58+
}
59+
5860
public init?(identifier: String) {
5961
super.init()
6062

Foundation/FileManager.swift

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -376,10 +376,13 @@ open class FileManager : NSObject {
376376

377377
This method replaces fileSystemAttributesAtPath:.
378378
*/
379+
#if os(Android)
380+
@available(*, unavailable, message: "Unsuppported on this platform")
381+
open func attributesOfFileSystem(forPath path: String) throws -> [FileAttributeKey : Any] {
382+
NSUnsupported()
383+
}
384+
#else
379385
open func attributesOfFileSystem(forPath path: String) throws -> [FileAttributeKey : Any] {
380-
#if os(Android)
381-
NSUnimplemented()
382-
#else
383386
// statvfs(2) doesn't support 64bit inode on Darwin (apfs), fallback to statfs(2)
384387
#if os(macOS) || os(iOS)
385388
var s = statfs()
@@ -408,8 +411,8 @@ open class FileManager : NSObject {
408411
result[.systemFreeNodes] = NSNumber(value: UInt64(s.f_ffree))
409412

410413
return result
411-
#endif
412414
}
415+
#endif
413416

414417
/* createSymbolicLinkAtPath:withDestination:error: returns YES if the symbolic link that point at 'destPath' was able to be created at the location specified by 'path'. If this method returns NO, the link was unable to be created and an NSError will be returned by reference in the 'error' parameter. This method does not traverse a terminal symlink.
415418

Foundation/NSCFString.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,8 @@ internal final class _NSCFConstantString : _NSCFString {
7171
// FIXME: Split expression as a work-around for slow type
7272
// checking (tracked by SR-5322).
7373
let offTemp1 = MemoryLayout<OpaquePointer>.size + MemoryLayout<uintptr_t>.size
74-
let offTemp2 = MemoryLayout<_CFInfo>.size
75-
return offTemp1 + offTemp2 + MemoryLayout<UnsafePointer<UInt8>>.size
74+
let offset = offTemp1 + MemoryLayout<_CFInfo>.size
75+
return offset + MemoryLayout<UnsafePointer<UInt8>>.size
7676
}
7777

7878
private var _lenPtr : UnsafeMutableRawPointer {

Foundation/NSTimeZone.swift

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -179,14 +179,6 @@ open class NSTimeZone : NSObject, NSCopying, NSSecureCoding, NSCoding {
179179
extension NSTimeZone {
180180

181181
open class var system: TimeZone {
182-
#if os(Android)
183-
var now = time(nil), info = tm()
184-
if localtime_r(&now, &info) != nil {
185-
// NOTE: this is not a real time zone but a fixed offset from GMT.
186-
// It will be incorrect outside the current daylight saving period.
187-
return TimeZone(reference: NSTimeZone(forSecondsFromGMT: info.tm_gmtoff))
188-
}
189-
#endif
190182
return CFTimeZoneCopySystem()._swiftObject
191183
}
192184

TestFoundation/TestFileManager.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,7 @@ class TestFileManager : XCTestCase {
268268
}
269269

270270
func test_fileSystemAttributes() {
271+
#if !os(Android)
271272
let fm = FileManager.default
272273
let path = NSTemporaryDirectory()
273274

@@ -299,6 +300,7 @@ class TestFileManager : XCTestCase {
299300
} catch let err {
300301
XCTFail("\(err)")
301302
}
303+
#endif
302304
}
303305

304306
func test_setFileAttributes() {

TestFoundation/TestNSAttributedString.swift

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -181,10 +181,6 @@ class TestNSAttributedString : XCTestCase {
181181
}
182182

183183
func test_enumerateAttributes() {
184-
#if os(Android)
185-
// Invalid dictionary returned by CFAttributedStringGetAttributesAndLongestEffectiveRange
186-
XCTFail("Intermittent failures on Android")
187-
#else
188184
let string = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus consectetur et sem vitae consectetur. Nam venenatis lectus a laoreet blandit."
189185

190186
let attrKey1 = NSAttributedStringKey("attribute.placeholder.key1")
@@ -243,7 +239,6 @@ class TestNSAttributedString : XCTestCase {
243239
}
244240
XCTAssertEqual(rangeDescriptionString, "(0,10)")
245241
XCTAssertEqual(attrsDescriptionString, "[attribute.placeholder.key1:attribute.placeholder.value1]")
246-
#endif
247242
}
248243

249244
func test_copy() {

TestFoundation/TestNSNumber.swift

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1073,37 +1073,40 @@ class TestNSNumber : XCTestCase {
10731073

10741074
func test_stringValue() {
10751075

1076+
// The following casts on subtraction are required for an Android compile
1077+
// https://bugs.swift.org/browse/SR-7469
1078+
10761079
if UInt.max == UInt32.max {
10771080
XCTAssertEqual(NSNumber(value: UInt.min).stringValue, "0")
10781081
XCTAssertEqual(NSNumber(value: UInt.min + 1).stringValue, "1")
10791082
XCTAssertEqual(NSNumber(value: UInt.max).stringValue, "4294967295")
1080-
XCTAssertEqual(NSNumber(value: UInt.max - 1).stringValue, "4294967294")
1083+
XCTAssertEqual(NSNumber(value: UInt.max - 1 as UInt).stringValue, "4294967294")
10811084
} else if UInt.max == UInt64.max {
10821085
XCTAssertEqual(NSNumber(value: UInt.min).stringValue, "0")
10831086
XCTAssertEqual(NSNumber(value: UInt.min + 1).stringValue, "1")
10841087
XCTAssertEqual(NSNumber(value: UInt.max).stringValue, "18446744073709551615")
1085-
XCTAssertEqual(NSNumber(value: UInt.max - 1).stringValue, "18446744073709551614")
1088+
XCTAssertEqual(NSNumber(value: UInt.max - 1 as UInt).stringValue, "18446744073709551614")
10861089
}
10871090

10881091
XCTAssertEqual(NSNumber(value: UInt8.min).stringValue, "0")
10891092
XCTAssertEqual(NSNumber(value: UInt8.min + 1).stringValue, "1")
10901093
XCTAssertEqual(NSNumber(value: UInt8.max).stringValue, "255")
1091-
XCTAssertEqual(NSNumber(value: UInt8.max - 1).stringValue, "254")
1094+
XCTAssertEqual(NSNumber(value: UInt8.max - 1 as UInt8).stringValue, "254")
10921095

10931096
XCTAssertEqual(NSNumber(value: UInt16.min).stringValue, "0")
10941097
XCTAssertEqual(NSNumber(value: UInt16.min + 1).stringValue, "1")
10951098
XCTAssertEqual(NSNumber(value: UInt16.max).stringValue, "65535")
1096-
XCTAssertEqual(NSNumber(value: UInt16.max - 1).stringValue, "65534")
1099+
XCTAssertEqual(NSNumber(value: UInt16.max - 1 as UInt16).stringValue, "65534")
10971100

10981101
XCTAssertEqual(NSNumber(value: UInt32.min).stringValue, "0")
10991102
XCTAssertEqual(NSNumber(value: UInt32.min + 1).stringValue, "1")
11001103
XCTAssertEqual(NSNumber(value: UInt32.max).stringValue, "4294967295")
1101-
XCTAssertEqual(NSNumber(value: UInt32.max - 1).stringValue, "4294967294")
1104+
XCTAssertEqual(NSNumber(value: UInt32.max - 1 as UInt32).stringValue, "4294967294")
11021105

11031106
XCTAssertEqual(NSNumber(value: UInt64.min).stringValue, "0")
11041107
XCTAssertEqual(NSNumber(value: UInt64.min + 1).stringValue, "1")
11051108
XCTAssertEqual(NSNumber(value: UInt64.max).stringValue, "18446744073709551615")
1106-
XCTAssertEqual(NSNumber(value: UInt64.max - 1).stringValue, "18446744073709551614")
1109+
XCTAssertEqual(NSNumber(value: UInt64.max - 1 as UInt64).stringValue, "18446744073709551614")
11071110

11081111
if Int.max == Int32.max {
11091112
XCTAssertEqual(NSNumber(value: Int.min).stringValue, "-2147483648")

0 commit comments

Comments
 (0)