From 34188c26964dc74d5fc85b934c9ed7c2cdf39ba3 Mon Sep 17 00:00:00 2001 From: ShaharNaveh <50263213+ShaharNaveh@users.noreply.github.com> Date: Tue, 22 Jul 2025 10:56:23 +0200 Subject: [PATCH 1/6] Cleaup stat attrs for windows --- vm/src/stdlib/stat.rs | 90 ++++--------------------------------------- 1 file changed, 8 insertions(+), 82 deletions(-) diff --git a/vm/src/stdlib/stat.rs b/vm/src/stdlib/stat.rs index bd5b2e2870a..613ecf9ced6 100644 --- a/vm/src/stdlib/stat.rs +++ b/vm/src/stdlib/stat.rs @@ -393,88 +393,14 @@ mod stat { // Windows file attributes (if on Windows) #[cfg(windows)] #[pyattr] - pub const FILE_ATTRIBUTE_ARCHIVE: u32 = - windows_sys::Win32::Storage::FileSystem::FILE_ATTRIBUTE_ARCHIVE; - - #[cfg(windows)] - #[pyattr] - pub const FILE_ATTRIBUTE_COMPRESSED: u32 = - windows_sys::Win32::Storage::FileSystem::FILE_ATTRIBUTE_COMPRESSED; - - #[cfg(windows)] - #[pyattr] - pub const FILE_ATTRIBUTE_DEVICE: u32 = - windows_sys::Win32::Storage::FileSystem::FILE_ATTRIBUTE_DEVICE; - - #[cfg(windows)] - #[pyattr] - pub const FILE_ATTRIBUTE_DIRECTORY: u32 = - windows_sys::Win32::Storage::FileSystem::FILE_ATTRIBUTE_DIRECTORY; - - #[cfg(windows)] - #[pyattr] - pub const FILE_ATTRIBUTE_ENCRYPTED: u32 = - windows_sys::Win32::Storage::FileSystem::FILE_ATTRIBUTE_ENCRYPTED; - - #[cfg(windows)] - #[pyattr] - pub const FILE_ATTRIBUTE_HIDDEN: u32 = - windows_sys::Win32::Storage::FileSystem::FILE_ATTRIBUTE_HIDDEN; - - #[cfg(windows)] - #[pyattr] - pub const FILE_ATTRIBUTE_INTEGRITY_STREAM: u32 = - windows_sys::Win32::Storage::FileSystem::FILE_ATTRIBUTE_INTEGRITY_STREAM; - - #[cfg(windows)] - #[pyattr] - pub const FILE_ATTRIBUTE_NORMAL: u32 = - windows_sys::Win32::Storage::FileSystem::FILE_ATTRIBUTE_NORMAL; - - #[cfg(windows)] - #[pyattr] - pub const FILE_ATTRIBUTE_NOT_CONTENT_INDEXED: u32 = - windows_sys::Win32::Storage::FileSystem::FILE_ATTRIBUTE_NOT_CONTENT_INDEXED; - - #[cfg(windows)] - #[pyattr] - pub const FILE_ATTRIBUTE_NO_SCRUB_DATA: u32 = - windows_sys::Win32::Storage::FileSystem::FILE_ATTRIBUTE_NO_SCRUB_DATA; - - #[cfg(windows)] - #[pyattr] - pub const FILE_ATTRIBUTE_OFFLINE: u32 = - windows_sys::Win32::Storage::FileSystem::FILE_ATTRIBUTE_OFFLINE; - - #[cfg(windows)] - #[pyattr] - pub const FILE_ATTRIBUTE_READONLY: u32 = - windows_sys::Win32::Storage::FileSystem::FILE_ATTRIBUTE_READONLY; - - #[cfg(windows)] - #[pyattr] - pub const FILE_ATTRIBUTE_REPARSE_POINT: u32 = - windows_sys::Win32::Storage::FileSystem::FILE_ATTRIBUTE_REPARSE_POINT; - - #[cfg(windows)] - #[pyattr] - pub const FILE_ATTRIBUTE_SPARSE_FILE: u32 = - windows_sys::Win32::Storage::FileSystem::FILE_ATTRIBUTE_SPARSE_FILE; - - #[cfg(windows)] - #[pyattr] - pub const FILE_ATTRIBUTE_SYSTEM: u32 = - windows_sys::Win32::Storage::FileSystem::FILE_ATTRIBUTE_SYSTEM; - - #[cfg(windows)] - #[pyattr] - pub const FILE_ATTRIBUTE_TEMPORARY: u32 = - windows_sys::Win32::Storage::FileSystem::FILE_ATTRIBUTE_TEMPORARY; - - #[cfg(windows)] - #[pyattr] - pub const FILE_ATTRIBUTE_VIRTUAL: u32 = - windows_sys::Win32::Storage::FileSystem::FILE_ATTRIBUTE_VIRTUAL; + pub use windows_sys::Win32::Storage::FileSystem::{ + FILE_ATTRIBUTE_ARCHIVE, FILE_ATTRIBUTE_COMPRESSED, FILE_ATTRIBUTE_DEVICE, + FILE_ATTRIBUTE_DIRECTORY, FILE_ATTRIBUTE_ENCRYPTED, FILE_ATTRIBUTE_HIDDEN, + FILE_ATTRIBUTE_INTEGRITY_STREAM, FILE_ATTRIBUTE_NO_SCRUB_DATA, FILE_ATTRIBUTE_NORMAL, + FILE_ATTRIBUTE_NOT_CONTENT_INDEXED, FILE_ATTRIBUTE_OFFLINE, FILE_ATTRIBUTE_READONLY, + FILE_ATTRIBUTE_REPARSE_POINT, FILE_ATTRIBUTE_SPARSE_FILE, FILE_ATTRIBUTE_SYSTEM, + FILE_ATTRIBUTE_TEMPORARY, FILE_ATTRIBUTE_VIRTUAL, + }; // Unix file flags (if on Unix) #[cfg(target_os = "macos")] From a0620e00484800733da98b2f531b7033181719b7 Mon Sep 17 00:00:00 2001 From: ShaharNaveh <50263213+ShaharNaveh@users.noreply.github.com> Date: Tue, 22 Jul 2025 12:47:57 +0200 Subject: [PATCH 2/6] `unix_libc_get` macro and apply to some --- vm/src/stdlib/stat.rs | 77 +++++++++++++++++-------------------------- 1 file changed, 30 insertions(+), 47 deletions(-) diff --git a/vm/src/stdlib/stat.rs b/vm/src/stdlib/stat.rs index 613ecf9ced6..a17f6ed7c56 100644 --- a/vm/src/stdlib/stat.rs +++ b/vm/src/stdlib/stat.rs @@ -2,9 +2,6 @@ use crate::{PyRef, VirtualMachine, builtins::PyModule}; #[pymodule] mod stat { - #[cfg(unix)] - use libc; - // Use libc::mode_t for Mode to match the system's definition #[cfg(unix)] type Mode = libc::mode_t; @@ -13,72 +10,58 @@ mod stat { #[cfg(not(any(unix, windows)))] type Mode = u32; // Fallback for unknown targets - #[cfg(unix)] - #[pyattr] - pub const S_IFDIR: Mode = libc::S_IFDIR; - #[cfg(not(unix))] - #[pyattr] - pub const S_IFDIR: Mode = 0o040000; + cfg_if::cfg_if! { + if #[cfg(unix)] { + macro_rules! unix_libc_get { + ($name:ident, $val:expr) => { + libc::$name + }; + } + } else { + macro_rules! unix_libc_get { + ($name:ident, $val:expr) => { + $val + }; + } + } + } - #[cfg(unix)] - #[pyattr] - pub const S_IFCHR: Mode = libc::S_IFCHR; - #[cfg(not(unix))] #[pyattr] - pub const S_IFCHR: Mode = 0o020000; + pub const S_IFDIR: Mode = unix_libc_get!(S_IFDIR, 0o040000); - #[cfg(unix)] #[pyattr] - pub const S_IFBLK: Mode = libc::S_IFBLK; - #[cfg(not(unix))] - #[pyattr] - pub const S_IFBLK: Mode = 0o060000; + pub const S_IFCHR: Mode = unix_libc_get!(S_IFCHR, 0o020000); - #[cfg(unix)] #[pyattr] - pub const S_IFREG: Mode = libc::S_IFREG; - #[cfg(not(unix))] - #[pyattr] - pub const S_IFREG: Mode = 0o100000; + pub const S_IFBLK: Mode = unix_libc_get!(S_IFBLK, 0o060000); - #[cfg(unix)] - #[pyattr] - pub const S_IFIFO: Mode = libc::S_IFIFO; - #[cfg(not(unix))] #[pyattr] - pub const S_IFIFO: Mode = 0o010000; + pub const S_IFREG: Mode = unix_libc_get!(S_IFREG, 0o100000); - #[cfg(unix)] - #[pyattr] - pub const S_IFLNK: Mode = libc::S_IFLNK; - #[cfg(not(unix))] #[pyattr] - pub const S_IFLNK: Mode = 0o120000; + pub const S_IFIFO: Mode = unix_libc_get!(S_IFIFO, 0o010000); - #[cfg(unix)] #[pyattr] - pub const S_IFSOCK: Mode = libc::S_IFSOCK; - #[cfg(not(unix))] + pub const S_IFLNK: Mode = unix_libc_get!(S_IFLNK, 0o120000); + #[pyattr] - pub const S_IFSOCK: Mode = 0o140000; + pub const S_IFSOCK: Mode = unix_libc_get!(S_IFSOCK, 0o140000); - // TODO: RUSTPYTHON Support Solaris #[pyattr] - pub const S_IFDOOR: Mode = 0; + pub const S_IFDOOR: Mode = 0; // TODO: RUSTPYTHON Support Solaris - // TODO: RUSTPYTHON Support Solaris #[pyattr] - pub const S_IFPORT: Mode = 0; + pub const S_IFPORT: Mode = 0; // TODO: RUSTPYTHON Support Solaris // TODO: RUSTPYTHON Support BSD // https://man.freebsd.org/cgi/man.cgi?stat(2) - #[cfg(target_os = "macos")] - #[pyattr] - pub const S_IFWHT: Mode = 0o160000; - #[cfg(not(target_os = "macos"))] #[pyattr] - pub const S_IFWHT: Mode = 0; + pub const S_IFWHT: Mode = if cfg!(target_os = "macos") { + 0o160000 + } else { + 0 + }; // Permission bits #[cfg(unix)] From a975e96869c44b7b84609030c498ac35df2942ab Mon Sep 17 00:00:00 2001 From: ShaharNaveh <50263213+ShaharNaveh@users.noreply.github.com> Date: Tue, 22 Jul 2025 13:19:43 +0200 Subject: [PATCH 3/6] Cleanup permission bits --- vm/src/stdlib/stat.rs | 132 ++++++++++++------------------------------ 1 file changed, 37 insertions(+), 95 deletions(-) diff --git a/vm/src/stdlib/stat.rs b/vm/src/stdlib/stat.rs index a17f6ed7c56..558476cd945 100644 --- a/vm/src/stdlib/stat.rs +++ b/vm/src/stdlib/stat.rs @@ -64,140 +64,82 @@ mod stat { }; // Permission bits - #[cfg(unix)] - #[pyattr] - pub const S_ISUID: Mode = libc::S_ISUID; - #[cfg(not(unix))] - #[pyattr] - pub const S_ISUID: Mode = 0o4000; - #[cfg(unix)] - #[pyattr] - pub const S_ISGID: Mode = libc::S_ISGID; - #[cfg(not(unix))] #[pyattr] - pub const S_ISGID: Mode = 0o2000; + pub const S_ISUID: Mode = unix_libc_get!(S_ISUID, 0o4000); - #[cfg(unix)] #[pyattr] - pub const S_ENFMT: Mode = libc::S_ISGID; - #[cfg(not(unix))] - #[pyattr] - pub const S_ENFMT: Mode = 0o2000; + pub const S_ISGID: Mode = unix_libc_get!(S_ISGID, 0o2000); - #[cfg(unix)] - #[pyattr] - pub const S_ISVTX: Mode = libc::S_ISVTX; - #[cfg(not(unix))] #[pyattr] - pub const S_ISVTX: Mode = 0o1000; + pub const S_ENFMT: Mode = unix_libc_get!(S_ISGID, 0o2000); - #[cfg(unix)] - #[pyattr] - pub const S_IRWXU: Mode = libc::S_IRWXU; - #[cfg(not(unix))] #[pyattr] - pub const S_IRWXU: Mode = 0o0700; + pub const S_ISVTX: Mode = unix_libc_get!(S_ISVTX, 0o1000); - #[cfg(unix)] - #[pyattr] - pub const S_IRUSR: Mode = libc::S_IRUSR; - #[cfg(not(unix))] #[pyattr] - pub const S_IRUSR: Mode = 0o0400; + pub const S_IRWXU: Mode = unix_libc_get!(S_IRWXU, 0o0700); - #[cfg(unix)] #[pyattr] - pub const S_IREAD: Mode = libc::S_IRUSR; - #[cfg(not(unix))] - #[pyattr] - pub const S_IREAD: Mode = 0o0400; + pub const S_IRUSR: Mode = unix_libc_get!(S_IRUSR, 0o0400); - #[cfg(unix)] - #[pyattr] - pub const S_IWUSR: Mode = libc::S_IWUSR; - #[cfg(not(unix))] #[pyattr] - pub const S_IWUSR: Mode = 0o0200; + pub const S_IREAD: Mode = unix_libc_get!(S_IRUSR, 0o0400); - #[cfg(all(unix, not(target_os = "android"), not(target_os = "redox")))] #[pyattr] - pub const S_IWRITE: Mode = libc::S_IWRITE; - #[cfg(any(not(unix), target_os = "android", target_os = "redox"))] - #[pyattr] - pub const S_IWRITE: Mode = 0o0200; + pub const S_IWUSR: Mode = unix_libc_get!(S_IWUSR, 0o0200); - #[cfg(unix)] - #[pyattr] - pub const S_IXUSR: Mode = libc::S_IXUSR; - #[cfg(not(unix))] #[pyattr] - pub const S_IXUSR: Mode = 0o0100; + pub const S_IXUSR: Mode = unix_libc_get!(S_IXUSR, 0o0100); - #[cfg(all(unix, not(target_os = "android"), not(target_os = "redox")))] #[pyattr] - pub const S_IEXEC: Mode = libc::S_IEXEC; - #[cfg(any(not(unix), target_os = "android", target_os = "redox"))] - #[pyattr] - pub const S_IEXEC: Mode = 0o0100; + pub const S_IRWXG: Mode = unix_libc_get!(S_IRWXG, 0o0070); - #[cfg(unix)] #[pyattr] - pub const S_IRWXG: Mode = libc::S_IRWXG; - #[cfg(not(unix))] - #[pyattr] - pub const S_IRWXG: Mode = 0o0070; + pub const S_IRGRP: Mode = unix_libc_get!(S_IRGRP, 0o0040); - #[cfg(unix)] - #[pyattr] - pub const S_IRGRP: Mode = libc::S_IRGRP; - #[cfg(not(unix))] #[pyattr] - pub const S_IRGRP: Mode = 0o0040; + pub const S_IWGRP: Mode = unix_libc_get!(S_IWGRP, 0o0020); - #[cfg(unix)] - #[pyattr] - pub const S_IWGRP: Mode = libc::S_IWGRP; - #[cfg(not(unix))] #[pyattr] - pub const S_IWGRP: Mode = 0o0020; + pub const S_IXGRP: Mode = unix_libc_get!(S_IXGRP, 0o0010); - #[cfg(unix)] #[pyattr] - pub const S_IXGRP: Mode = libc::S_IXGRP; - #[cfg(not(unix))] - #[pyattr] - pub const S_IXGRP: Mode = 0o0010; + pub const S_IRWXO: Mode = unix_libc_get!(S_IRWXO, 0o0007); - #[cfg(unix)] - #[pyattr] - pub const S_IRWXO: Mode = libc::S_IRWXO; - #[cfg(not(unix))] #[pyattr] - pub const S_IRWXO: Mode = 0o0007; + pub const S_IROTH: Mode = unix_libc_get!(S_IROTH, 0o0004); - #[cfg(unix)] - #[pyattr] - pub const S_IROTH: Mode = libc::S_IROTH; - #[cfg(not(unix))] #[pyattr] - pub const S_IROTH: Mode = 0o0004; + pub const S_IWOTH: Mode = unix_libc_get!(S_IWOTH, 0o0002); - #[cfg(unix)] - #[pyattr] - pub const S_IWOTH: Mode = libc::S_IWOTH; - #[cfg(not(unix))] #[pyattr] - pub const S_IWOTH: Mode = 0o0002; + pub const S_IXOTH: Mode = unix_libc_get!(S_IXOTH, 0o0001); - #[cfg(unix)] #[pyattr] - pub const S_IXOTH: Mode = libc::S_IXOTH; - #[cfg(not(unix))] + pub const S_IWRITE: Mode = { + cfg_if::cfg_if! { + if #[cfg(all(unix, not(target_os = "android"), not(target_os = "redox")))] { + libc::S_IWRITE + } else { + 0o0200 + } + } + }; + #[pyattr] - pub const S_IXOTH: Mode = 0o0001; + pub const S_IEXEC: Mode = { + cfg_if::cfg_if! { + if #[cfg(all(unix, not(target_os = "android"), not(target_os = "redox")))] { + libc::S_IEXEC + } else { + 0o0100 + } + } + }; // Stat result indices + #[pyattr] pub const ST_MODE: u32 = 0; From c11cd6e0f362c3c72553b9e445aad29c321b7678 Mon Sep 17 00:00:00 2001 From: ShaharNaveh <50263213+ShaharNaveh@users.noreply.github.com> Date: Tue, 22 Jul 2025 13:33:38 +0200 Subject: [PATCH 4/6] Cleanup MacOS attrs --- vm/src/stdlib/stat.rs | 91 +++++++++++++++++++------------------------ 1 file changed, 39 insertions(+), 52 deletions(-) diff --git a/vm/src/stdlib/stat.rs b/vm/src/stdlib/stat.rs index 558476cd945..2a8db803ef4 100644 --- a/vm/src/stdlib/stat.rs +++ b/vm/src/stdlib/stat.rs @@ -10,6 +10,7 @@ mod stat { #[cfg(not(any(unix, windows)))] type Mode = u32; // Fallback for unknown targets + // unix_libc_get cfg_if::cfg_if! { if #[cfg(unix)] { macro_rules! unix_libc_get { @@ -24,6 +25,24 @@ mod stat { }; } } + + } + + // macos_libc_get + cfg_if::cfg_if! { + if #[cfg(target_os = "macos")] { + macro_rules! macos_libc_get { + ($name:ident, $val:expr) => { + libc::$name + }; + } + } else { + macro_rules! macos_libc_get { + ($name:ident, $val:expr) => { + $val + }; + } + } } #[pyattr] @@ -316,6 +335,7 @@ mod stat { } // Windows file attributes (if on Windows) + #[cfg(windows)] #[pyattr] pub use windows_sys::Win32::Storage::FileSystem::{ @@ -328,71 +348,43 @@ mod stat { }; // Unix file flags (if on Unix) - #[cfg(target_os = "macos")] - #[pyattr] - pub const UF_NODUMP: u32 = libc::UF_NODUMP; - #[cfg(not(target_os = "macos"))] - #[pyattr] - pub const UF_NODUMP: u32 = 0x00000001; - #[cfg(target_os = "macos")] - #[pyattr] - pub const UF_IMMUTABLE: u32 = libc::UF_IMMUTABLE; - #[cfg(not(target_os = "macos"))] #[pyattr] - pub const UF_IMMUTABLE: u32 = 0x00000002; + pub const UF_NODUMP: u32 = macos_libc_get!(UF_NODUMP, 0x00000001); - #[cfg(target_os = "macos")] - #[pyattr] - pub const UF_APPEND: u32 = libc::UF_APPEND; - #[cfg(not(target_os = "macos"))] #[pyattr] - pub const UF_APPEND: u32 = 0x00000004; + pub const UF_IMMUTABLE: u32 = macos_libc_get!(UF_IMMUTABLE, 0x00000002); - #[cfg(target_os = "macos")] - #[pyattr] - pub const UF_OPAQUE: u32 = libc::UF_OPAQUE; - #[cfg(not(target_os = "macos"))] #[pyattr] - pub const UF_OPAQUE: u32 = 0x00000008; + pub const UF_APPEND: u32 = macos_libc_get!(UF_APPEND, 0x00000004); #[pyattr] - pub const UF_NOUNLINK: u32 = 0x00000010; + pub const UF_OPAQUE: u32 = macos_libc_get!(UF_OPAQUE, 0x00000008); - #[cfg(target_os = "macos")] - #[pyattr] - pub const UF_COMPRESSED: u32 = libc::UF_COMPRESSED; - #[cfg(not(target_os = "macos"))] #[pyattr] - pub const UF_COMPRESSED: u32 = 0x00000020; + pub const UF_COMPRESSED: u32 = macos_libc_get!(UF_COMPRESSED, 0x00000020); - #[cfg(target_os = "macos")] #[pyattr] - pub const UF_HIDDEN: u32 = libc::UF_HIDDEN; - #[cfg(not(target_os = "macos"))] - #[pyattr] - pub const UF_HIDDEN: u32 = 0x00008000; + pub const UF_HIDDEN: u32 = macos_libc_get!(UF_HIDDEN, 0x00008000); - #[cfg(target_os = "macos")] - #[pyattr] - pub const SF_ARCHIVED: u32 = libc::SF_ARCHIVED; - #[cfg(not(target_os = "macos"))] #[pyattr] - pub const SF_ARCHIVED: u32 = 0x00010000; + pub const SF_ARCHIVED: u32 = macos_libc_get!(SF_ARCHIVED, 0x00010000); - #[cfg(target_os = "macos")] #[pyattr] - pub const SF_IMMUTABLE: u32 = libc::SF_IMMUTABLE; - #[cfg(not(target_os = "macos"))] + pub const SF_IMMUTABLE: u32 = macos_libc_get!(SF_IMMUTABLE, 0x00020000); + #[pyattr] - pub const SF_IMMUTABLE: u32 = 0x00020000; + pub const SF_APPEND: u32 = macos_libc_get!(SF_APPEND, 0x00040000); - #[cfg(target_os = "macos")] #[pyattr] - pub const SF_APPEND: u32 = libc::SF_APPEND; - #[cfg(not(target_os = "macos"))] + pub const SF_SETTABLE: u32 = if cfg!(target_os = "macos") { + 0x3fff0000 + } else { + 0xffff0000 + }; + #[pyattr] - pub const SF_APPEND: u32 = 0x00040000; + pub const UF_NOUNLINK: u32 = 0x00000010; #[pyattr] pub const SF_NOUNLINK: u32 = 0x00100000; @@ -406,16 +398,11 @@ mod stat { #[pyattr] pub const SF_DATALESS: u32 = 0x40000000; - #[cfg(target_os = "macos")] - #[pyattr] - pub const SF_SUPPORTED: u32 = 0x009f0000; + // MacOS specific #[cfg(target_os = "macos")] #[pyattr] - pub const SF_SETTABLE: u32 = 0x3fff0000; - #[cfg(not(target_os = "macos"))] - #[pyattr] - pub const SF_SETTABLE: u32 = 0xffff0000; + pub const SF_SUPPORTED: u32 = 0x009f0000; #[cfg(target_os = "macos")] #[pyattr] From 116beaa5515fca47cc34708234920910f6701530 Mon Sep 17 00:00:00 2001 From: ShaharNaveh <50263213+ShaharNaveh@users.noreply.github.com> Date: Tue, 22 Jul 2025 13:35:22 +0200 Subject: [PATCH 5/6] Move stat result indices to thr bottom --- vm/src/stdlib/stat.rs | 148 +++++++++++++++++++++--------------------- 1 file changed, 74 insertions(+), 74 deletions(-) diff --git a/vm/src/stdlib/stat.rs b/vm/src/stdlib/stat.rs index 2a8db803ef4..f4a65c7c7d0 100644 --- a/vm/src/stdlib/stat.rs +++ b/vm/src/stdlib/stat.rs @@ -157,6 +157,80 @@ mod stat { } }; + // Windows file attributes (if on Windows) + + #[cfg(windows)] + #[pyattr] + pub use windows_sys::Win32::Storage::FileSystem::{ + FILE_ATTRIBUTE_ARCHIVE, FILE_ATTRIBUTE_COMPRESSED, FILE_ATTRIBUTE_DEVICE, + FILE_ATTRIBUTE_DIRECTORY, FILE_ATTRIBUTE_ENCRYPTED, FILE_ATTRIBUTE_HIDDEN, + FILE_ATTRIBUTE_INTEGRITY_STREAM, FILE_ATTRIBUTE_NO_SCRUB_DATA, FILE_ATTRIBUTE_NORMAL, + FILE_ATTRIBUTE_NOT_CONTENT_INDEXED, FILE_ATTRIBUTE_OFFLINE, FILE_ATTRIBUTE_READONLY, + FILE_ATTRIBUTE_REPARSE_POINT, FILE_ATTRIBUTE_SPARSE_FILE, FILE_ATTRIBUTE_SYSTEM, + FILE_ATTRIBUTE_TEMPORARY, FILE_ATTRIBUTE_VIRTUAL, + }; + + // Unix file flags (if on Unix) + + #[pyattr] + pub const UF_NODUMP: u32 = macos_libc_get!(UF_NODUMP, 0x00000001); + + #[pyattr] + pub const UF_IMMUTABLE: u32 = macos_libc_get!(UF_IMMUTABLE, 0x00000002); + + #[pyattr] + pub const UF_APPEND: u32 = macos_libc_get!(UF_APPEND, 0x00000004); + + #[pyattr] + pub const UF_OPAQUE: u32 = macos_libc_get!(UF_OPAQUE, 0x00000008); + + #[pyattr] + pub const UF_COMPRESSED: u32 = macos_libc_get!(UF_COMPRESSED, 0x00000020); + + #[pyattr] + pub const UF_HIDDEN: u32 = macos_libc_get!(UF_HIDDEN, 0x00008000); + + #[pyattr] + pub const SF_ARCHIVED: u32 = macos_libc_get!(SF_ARCHIVED, 0x00010000); + + #[pyattr] + pub const SF_IMMUTABLE: u32 = macos_libc_get!(SF_IMMUTABLE, 0x00020000); + + #[pyattr] + pub const SF_APPEND: u32 = macos_libc_get!(SF_APPEND, 0x00040000); + + #[pyattr] + pub const SF_SETTABLE: u32 = if cfg!(target_os = "macos") { + 0x3fff0000 + } else { + 0xffff0000 + }; + + #[pyattr] + pub const UF_NOUNLINK: u32 = 0x00000010; + + #[pyattr] + pub const SF_NOUNLINK: u32 = 0x00100000; + + #[pyattr] + pub const SF_SNAPSHOT: u32 = 0x00200000; + + #[pyattr] + pub const SF_FIRMLINK: u32 = 0x00800000; + + #[pyattr] + pub const SF_DATALESS: u32 = 0x40000000; + + // MacOS specific + + #[cfg(target_os = "macos")] + #[pyattr] + pub const SF_SUPPORTED: u32 = 0x009f0000; + + #[cfg(target_os = "macos")] + #[pyattr] + pub const SF_SYNTHETIC: u32 = 0xc0000000; + // Stat result indices #[pyattr] @@ -333,80 +407,6 @@ mod stat { result } - - // Windows file attributes (if on Windows) - - #[cfg(windows)] - #[pyattr] - pub use windows_sys::Win32::Storage::FileSystem::{ - FILE_ATTRIBUTE_ARCHIVE, FILE_ATTRIBUTE_COMPRESSED, FILE_ATTRIBUTE_DEVICE, - FILE_ATTRIBUTE_DIRECTORY, FILE_ATTRIBUTE_ENCRYPTED, FILE_ATTRIBUTE_HIDDEN, - FILE_ATTRIBUTE_INTEGRITY_STREAM, FILE_ATTRIBUTE_NO_SCRUB_DATA, FILE_ATTRIBUTE_NORMAL, - FILE_ATTRIBUTE_NOT_CONTENT_INDEXED, FILE_ATTRIBUTE_OFFLINE, FILE_ATTRIBUTE_READONLY, - FILE_ATTRIBUTE_REPARSE_POINT, FILE_ATTRIBUTE_SPARSE_FILE, FILE_ATTRIBUTE_SYSTEM, - FILE_ATTRIBUTE_TEMPORARY, FILE_ATTRIBUTE_VIRTUAL, - }; - - // Unix file flags (if on Unix) - - #[pyattr] - pub const UF_NODUMP: u32 = macos_libc_get!(UF_NODUMP, 0x00000001); - - #[pyattr] - pub const UF_IMMUTABLE: u32 = macos_libc_get!(UF_IMMUTABLE, 0x00000002); - - #[pyattr] - pub const UF_APPEND: u32 = macos_libc_get!(UF_APPEND, 0x00000004); - - #[pyattr] - pub const UF_OPAQUE: u32 = macos_libc_get!(UF_OPAQUE, 0x00000008); - - #[pyattr] - pub const UF_COMPRESSED: u32 = macos_libc_get!(UF_COMPRESSED, 0x00000020); - - #[pyattr] - pub const UF_HIDDEN: u32 = macos_libc_get!(UF_HIDDEN, 0x00008000); - - #[pyattr] - pub const SF_ARCHIVED: u32 = macos_libc_get!(SF_ARCHIVED, 0x00010000); - - #[pyattr] - pub const SF_IMMUTABLE: u32 = macos_libc_get!(SF_IMMUTABLE, 0x00020000); - - #[pyattr] - pub const SF_APPEND: u32 = macos_libc_get!(SF_APPEND, 0x00040000); - - #[pyattr] - pub const SF_SETTABLE: u32 = if cfg!(target_os = "macos") { - 0x3fff0000 - } else { - 0xffff0000 - }; - - #[pyattr] - pub const UF_NOUNLINK: u32 = 0x00000010; - - #[pyattr] - pub const SF_NOUNLINK: u32 = 0x00100000; - - #[pyattr] - pub const SF_SNAPSHOT: u32 = 0x00200000; - - #[pyattr] - pub const SF_FIRMLINK: u32 = 0x00800000; - - #[pyattr] - pub const SF_DATALESS: u32 = 0x40000000; - - // MacOS specific - - #[cfg(target_os = "macos")] - #[pyattr] - pub const SF_SUPPORTED: u32 = 0x009f0000; - - #[cfg(target_os = "macos")] - #[pyattr] - pub const SF_SYNTHETIC: u32 = 0xc0000000; } pub fn make_module(vm: &VirtualMachine) -> PyRef { From 8842db8a7c141480b53974530affbf02a3d15094 Mon Sep 17 00:00:00 2001 From: Jeong YunWon Date: Wed, 23 Jul 2025 13:54:59 +0900 Subject: [PATCH 6/6] libc_const! --- vm/src/stdlib/stat.rs | 267 +++++++++++++++++++++++++++++------------- 1 file changed, 185 insertions(+), 82 deletions(-) diff --git a/vm/src/stdlib/stat.rs b/vm/src/stdlib/stat.rs index f4a65c7c7d0..f7b3abb4325 100644 --- a/vm/src/stdlib/stat.rs +++ b/vm/src/stdlib/stat.rs @@ -10,61 +10,68 @@ mod stat { #[cfg(not(any(unix, windows)))] type Mode = u32; // Fallback for unknown targets - // unix_libc_get - cfg_if::cfg_if! { - if #[cfg(unix)] { - macro_rules! unix_libc_get { - ($name:ident, $val:expr) => { - libc::$name - }; + // libc_const macro for conditional compilation + macro_rules! libc_const { + (#[cfg($cfg:meta)] $name:ident, $fallback:expr) => {{ + #[cfg($cfg)] + { + libc::$name } - } else { - macro_rules! unix_libc_get { - ($name:ident, $val:expr) => { - $val - }; + #[cfg(not($cfg))] + { + $fallback } - } - - } - - // macos_libc_get - cfg_if::cfg_if! { - if #[cfg(target_os = "macos")] { - macro_rules! macos_libc_get { - ($name:ident, $val:expr) => { - libc::$name - }; - } - } else { - macro_rules! macos_libc_get { - ($name:ident, $val:expr) => { - $val - }; - } - } + }}; } #[pyattr] - pub const S_IFDIR: Mode = unix_libc_get!(S_IFDIR, 0o040000); + pub const S_IFDIR: Mode = libc_const!( + #[cfg(unix)] + S_IFDIR, + 0o040000 + ); #[pyattr] - pub const S_IFCHR: Mode = unix_libc_get!(S_IFCHR, 0o020000); + pub const S_IFCHR: Mode = libc_const!( + #[cfg(unix)] + S_IFCHR, + 0o020000 + ); #[pyattr] - pub const S_IFBLK: Mode = unix_libc_get!(S_IFBLK, 0o060000); + pub const S_IFBLK: Mode = libc_const!( + #[cfg(unix)] + S_IFBLK, + 0o060000 + ); #[pyattr] - pub const S_IFREG: Mode = unix_libc_get!(S_IFREG, 0o100000); + pub const S_IFREG: Mode = libc_const!( + #[cfg(unix)] + S_IFREG, + 0o100000 + ); #[pyattr] - pub const S_IFIFO: Mode = unix_libc_get!(S_IFIFO, 0o010000); + pub const S_IFIFO: Mode = libc_const!( + #[cfg(unix)] + S_IFIFO, + 0o010000 + ); #[pyattr] - pub const S_IFLNK: Mode = unix_libc_get!(S_IFLNK, 0o120000); + pub const S_IFLNK: Mode = libc_const!( + #[cfg(unix)] + S_IFLNK, + 0o120000 + ); #[pyattr] - pub const S_IFSOCK: Mode = unix_libc_get!(S_IFSOCK, 0o140000); + pub const S_IFSOCK: Mode = libc_const!( + #[cfg(unix)] + S_IFSOCK, + 0o140000 + ); #[pyattr] pub const S_IFDOOR: Mode = 0; // TODO: RUSTPYTHON Support Solaris @@ -85,77 +92,137 @@ mod stat { // Permission bits #[pyattr] - pub const S_ISUID: Mode = unix_libc_get!(S_ISUID, 0o4000); + pub const S_ISUID: Mode = libc_const!( + #[cfg(unix)] + S_ISUID, + 0o4000 + ); #[pyattr] - pub const S_ISGID: Mode = unix_libc_get!(S_ISGID, 0o2000); + pub const S_ISGID: Mode = libc_const!( + #[cfg(unix)] + S_ISGID, + 0o2000 + ); #[pyattr] - pub const S_ENFMT: Mode = unix_libc_get!(S_ISGID, 0o2000); + pub const S_ENFMT: Mode = libc_const!( + #[cfg(unix)] + S_ISGID, + 0o2000 + ); #[pyattr] - pub const S_ISVTX: Mode = unix_libc_get!(S_ISVTX, 0o1000); + pub const S_ISVTX: Mode = libc_const!( + #[cfg(unix)] + S_ISVTX, + 0o1000 + ); #[pyattr] - pub const S_IRWXU: Mode = unix_libc_get!(S_IRWXU, 0o0700); + pub const S_IRWXU: Mode = libc_const!( + #[cfg(unix)] + S_IRWXU, + 0o0700 + ); #[pyattr] - pub const S_IRUSR: Mode = unix_libc_get!(S_IRUSR, 0o0400); + pub const S_IRUSR: Mode = libc_const!( + #[cfg(unix)] + S_IRUSR, + 0o0400 + ); #[pyattr] - pub const S_IREAD: Mode = unix_libc_get!(S_IRUSR, 0o0400); + pub const S_IREAD: Mode = libc_const!( + #[cfg(unix)] + S_IRUSR, + 0o0400 + ); #[pyattr] - pub const S_IWUSR: Mode = unix_libc_get!(S_IWUSR, 0o0200); + pub const S_IWUSR: Mode = libc_const!( + #[cfg(unix)] + S_IWUSR, + 0o0200 + ); #[pyattr] - pub const S_IXUSR: Mode = unix_libc_get!(S_IXUSR, 0o0100); + pub const S_IXUSR: Mode = libc_const!( + #[cfg(unix)] + S_IXUSR, + 0o0100 + ); #[pyattr] - pub const S_IRWXG: Mode = unix_libc_get!(S_IRWXG, 0o0070); + pub const S_IRWXG: Mode = libc_const!( + #[cfg(unix)] + S_IRWXG, + 0o0070 + ); #[pyattr] - pub const S_IRGRP: Mode = unix_libc_get!(S_IRGRP, 0o0040); + pub const S_IRGRP: Mode = libc_const!( + #[cfg(unix)] + S_IRGRP, + 0o0040 + ); #[pyattr] - pub const S_IWGRP: Mode = unix_libc_get!(S_IWGRP, 0o0020); + pub const S_IWGRP: Mode = libc_const!( + #[cfg(unix)] + S_IWGRP, + 0o0020 + ); #[pyattr] - pub const S_IXGRP: Mode = unix_libc_get!(S_IXGRP, 0o0010); + pub const S_IXGRP: Mode = libc_const!( + #[cfg(unix)] + S_IXGRP, + 0o0010 + ); #[pyattr] - pub const S_IRWXO: Mode = unix_libc_get!(S_IRWXO, 0o0007); + pub const S_IRWXO: Mode = libc_const!( + #[cfg(unix)] + S_IRWXO, + 0o0007 + ); #[pyattr] - pub const S_IROTH: Mode = unix_libc_get!(S_IROTH, 0o0004); + pub const S_IROTH: Mode = libc_const!( + #[cfg(unix)] + S_IROTH, + 0o0004 + ); #[pyattr] - pub const S_IWOTH: Mode = unix_libc_get!(S_IWOTH, 0o0002); + pub const S_IWOTH: Mode = libc_const!( + #[cfg(unix)] + S_IWOTH, + 0o0002 + ); #[pyattr] - pub const S_IXOTH: Mode = unix_libc_get!(S_IXOTH, 0o0001); + pub const S_IXOTH: Mode = libc_const!( + #[cfg(unix)] + S_IXOTH, + 0o0001 + ); #[pyattr] - pub const S_IWRITE: Mode = { - cfg_if::cfg_if! { - if #[cfg(all(unix, not(target_os = "android"), not(target_os = "redox")))] { - libc::S_IWRITE - } else { - 0o0200 - } - } - }; + pub const S_IWRITE: Mode = libc_const!( + #[cfg(all(unix, not(target_os = "android"), not(target_os = "redox")))] + S_IWRITE, + 0o0200 + ); #[pyattr] - pub const S_IEXEC: Mode = { - cfg_if::cfg_if! { - if #[cfg(all(unix, not(target_os = "android"), not(target_os = "redox")))] { - libc::S_IEXEC - } else { - 0o0100 - } - } - }; + pub const S_IEXEC: Mode = libc_const!( + #[cfg(all(unix, not(target_os = "android"), not(target_os = "redox")))] + S_IEXEC, + 0o0100 + ); // Windows file attributes (if on Windows) @@ -173,31 +240,67 @@ mod stat { // Unix file flags (if on Unix) #[pyattr] - pub const UF_NODUMP: u32 = macos_libc_get!(UF_NODUMP, 0x00000001); + pub const UF_NODUMP: u32 = libc_const!( + #[cfg(target_os = "macos")] + UF_NODUMP, + 0x00000001 + ); #[pyattr] - pub const UF_IMMUTABLE: u32 = macos_libc_get!(UF_IMMUTABLE, 0x00000002); + pub const UF_IMMUTABLE: u32 = libc_const!( + #[cfg(target_os = "macos")] + UF_IMMUTABLE, + 0x00000002 + ); #[pyattr] - pub const UF_APPEND: u32 = macos_libc_get!(UF_APPEND, 0x00000004); + pub const UF_APPEND: u32 = libc_const!( + #[cfg(target_os = "macos")] + UF_APPEND, + 0x00000004 + ); #[pyattr] - pub const UF_OPAQUE: u32 = macos_libc_get!(UF_OPAQUE, 0x00000008); + pub const UF_OPAQUE: u32 = libc_const!( + #[cfg(target_os = "macos")] + UF_OPAQUE, + 0x00000008 + ); #[pyattr] - pub const UF_COMPRESSED: u32 = macos_libc_get!(UF_COMPRESSED, 0x00000020); + pub const UF_COMPRESSED: u32 = libc_const!( + #[cfg(target_os = "macos")] + UF_COMPRESSED, + 0x00000020 + ); #[pyattr] - pub const UF_HIDDEN: u32 = macos_libc_get!(UF_HIDDEN, 0x00008000); + pub const UF_HIDDEN: u32 = libc_const!( + #[cfg(target_os = "macos")] + UF_HIDDEN, + 0x00008000 + ); #[pyattr] - pub const SF_ARCHIVED: u32 = macos_libc_get!(SF_ARCHIVED, 0x00010000); + pub const SF_ARCHIVED: u32 = libc_const!( + #[cfg(target_os = "macos")] + SF_ARCHIVED, + 0x00010000 + ); #[pyattr] - pub const SF_IMMUTABLE: u32 = macos_libc_get!(SF_IMMUTABLE, 0x00020000); + pub const SF_IMMUTABLE: u32 = libc_const!( + #[cfg(target_os = "macos")] + SF_IMMUTABLE, + 0x00020000 + ); #[pyattr] - pub const SF_APPEND: u32 = macos_libc_get!(SF_APPEND, 0x00040000); + pub const SF_APPEND: u32 = libc_const!( + #[cfg(target_os = "macos")] + SF_APPEND, + 0x00040000 + ); #[pyattr] pub const SF_SETTABLE: u32 = if cfg!(target_os = "macos") {