-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Android: add better nullability checks for nullability annotations added in NDK 26 #4850
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -741,32 +741,38 @@ extension FileManager { | |
if rmdir(fsRep) == 0 { | ||
return | ||
} else if errno == ENOTEMPTY { | ||
#if os(Android) | ||
let ps = UnsafeMutablePointer<UnsafeMutablePointer<Int8>>.allocate(capacity: 2) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Do we really need to duplicate this or can we get away with a rebinding of the memory? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. No longer needed after your swiftlang/swift#74829, so removed in #5010. |
||
ps.initialize(to: UnsafeMutablePointer(mutating: fsRep)) | ||
ps.advanced(by: 1).initialize(to: unsafeBitCast(0, to: UnsafeMutablePointer<Int8>.self)) | ||
#else | ||
let ps = UnsafeMutablePointer<UnsafeMutablePointer<Int8>?>.allocate(capacity: 2) | ||
ps.initialize(to: UnsafeMutablePointer(mutating: fsRep)) | ||
ps.advanced(by: 1).initialize(to: nil) | ||
#endif | ||
let stream = fts_open(ps, FTS_PHYSICAL | FTS_XDEV | FTS_NOCHDIR | FTS_NOSTAT, nil) | ||
ps.deinitialize(count: 2) | ||
ps.deallocate() | ||
|
||
if stream != nil { | ||
if let openStream = stream { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Why not simply There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. |
||
defer { | ||
fts_close(stream) | ||
fts_close(openStream) | ||
} | ||
|
||
while let current = fts_read(stream)?.pointee { | ||
let itemPath = string(withFileSystemRepresentation: current.fts_path, length: Int(current.fts_pathlen)) | ||
while let current = fts_read(openStream)?.pointee, let current_path = current.fts_path { | ||
let itemPath = string(withFileSystemRepresentation: current_path, length: Int(current.fts_pathlen)) | ||
guard alreadyConfirmed || shouldRemoveItemAtPath(itemPath, isURL: isURL) else { | ||
continue | ||
} | ||
|
||
do { | ||
switch Int32(current.fts_info) { | ||
case FTS_DEFAULT, FTS_F, FTS_NSOK, FTS_SL, FTS_SLNONE: | ||
if unlink(current.fts_path) == -1 { | ||
if unlink(current_path) == -1 { | ||
throw _NSErrorWithErrno(errno, reading: false, path: itemPath) | ||
} | ||
case FTS_DP: | ||
if rmdir(current.fts_path) == -1 { | ||
if rmdir(current_path) == -1 { | ||
throw _NSErrorWithErrno(errno, reading: false, path: itemPath) | ||
} | ||
case FTS_DNR, FTS_ERR, FTS_NS: | ||
|
@@ -1085,10 +1091,18 @@ extension FileManager { | |
do { | ||
guard fm.fileExists(atPath: _url.path) else { throw _NSErrorWithErrno(ENOENT, reading: true, url: url) } | ||
_stream = try FileManager.default._fileSystemRepresentation(withPath: _url.path) { fsRep in | ||
#if os(Android) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Similarly here, can we do this by converting the type somehow at the call to There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Maybe there is, I just don't know how to do it. This is simply the best I came up with after seeing these Swift type-casting issues for the first time, and I wanted to ask if there was a better way. @glbrntt, you recently added similar code to NIO, wdyt? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. NIO wraps all of the syscalls and does any platform-specific shenanigans within the wrapper. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. OK, but that will still require adapting these types for nullability annotations: see my recent patch of your new NIO code for Android. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. re: your patch, does using an implicitly unwrapped optional work for both cases? e.g. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I get the following error with Swift 5.9.2 on Android AArch64 if I add that to the type signature of
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @glbrntt, is that type what you had in mind, or simply unwrapping the arguments when they are passed in inside There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think that I approached it similarly to what was being suggested - rebinding the memory around the call site. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. These |
||
let ps = UnsafeMutablePointer<UnsafeMutablePointer<Int8>>.allocate(capacity: 2) | ||
#else | ||
let ps = UnsafeMutablePointer<UnsafeMutablePointer<Int8>?>.allocate(capacity: 2) | ||
#endif | ||
defer { ps.deallocate() } | ||
ps.initialize(to: UnsafeMutablePointer(mutating: fsRep)) | ||
#if os(Android) | ||
ps.advanced(by: 1).initialize(to: unsafeBitCast(0, to: UnsafeMutablePointer<Int8>.self)) | ||
#else | ||
ps.advanced(by: 1).initialize(to: nil) | ||
#endif | ||
return fts_open(ps, FTS_PHYSICAL | FTS_XDEV | FTS_NOCHDIR | FTS_NOSTAT, nil) | ||
} | ||
if _stream == nil { | ||
|
@@ -1135,14 +1149,14 @@ extension FileManager { | |
} | ||
|
||
_current = fts_read(stream) | ||
while let current = _current { | ||
let filename = FileManager.default.string(withFileSystemRepresentation: current.pointee.fts_path, length: Int(current.pointee.fts_pathlen)) | ||
while let current = _current, let current_path = current.pointee.fts_path { | ||
let filename = FileManager.default.string(withFileSystemRepresentation: current_path, length: Int(current.pointee.fts_pathlen)) | ||
|
||
switch Int32(current.pointee.fts_info) { | ||
case FTS_D: | ||
let (showFile, skipDescendants) = match(filename: filename, to: _options, isDir: true) | ||
if skipDescendants { | ||
fts_set(_stream, _current, FTS_SKIP) | ||
fts_set(stream, current, FTS_SKIP) | ||
} | ||
if showFile { | ||
return URL(fileURLWithPath: filename, isDirectory: true) | ||
|
@@ -1315,7 +1329,7 @@ extension FileManager { | |
let finalErrno = originalItemURL.withUnsafeFileSystemRepresentation { (originalFS) -> Int32? in | ||
return newItemURL.withUnsafeFileSystemRepresentation { (newItemFS) -> Int32? in | ||
// This is an atomic operation in many OSes, but is not guaranteed to be atomic by the standard. | ||
if rename(newItemFS, originalFS) == 0 { | ||
if let newFS = newItemFS, let origFS = originalFS, rename(newFS, origFS) == 0 { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Why not simply force unwrap? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. |
||
return nil | ||
} else { | ||
return errno | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -25,7 +25,8 @@ import WinSDK | |
|
||
// getnameinfo uses size_t for its 4th and 6th arguments. | ||
private func getnameinfo(_ addr: UnsafePointer<sockaddr>?, _ addrlen: socklen_t, _ host: UnsafeMutablePointer<Int8>?, _ hostlen: socklen_t, _ serv: UnsafeMutablePointer<Int8>?, _ servlen: socklen_t, _ flags: Int32) -> Int32 { | ||
return Glibc.getnameinfo(addr, addrlen, host, Int(hostlen), serv, Int(servlen), flags) | ||
guard let saddr = addr else { return -1 } | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think that I prefer my approach of changing the signature of the private func. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Sorry about the delay, been meaning to get to this, hopefully this week. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. |
||
return Glibc.getnameinfo(saddr, addrlen, host, Int(hostlen), serv, Int(servlen), flags) | ||
} | ||
|
||
// getifaddrs and freeifaddrs are not available in Android 6.0 or earlier, so call these functions dynamically. | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@parkera, is this the change you had in mind?