Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Introduce restricted-std feature.
  • Loading branch information
ehuss committed Jul 15, 2020
1 parent 9e58908 commit 6e9a1de
Show file tree
Hide file tree
Showing 35 changed files with 266 additions and 109 deletions.
2 changes: 1 addition & 1 deletion src/libpanic_unwind/lib.rs
Expand Up @@ -41,7 +41,7 @@ cfg_if::cfg_if! {
if #[cfg(target_os = "emscripten")] {
#[path = "emcc.rs"]
mod real_imp;
} else if #[cfg(target_arch = "wasm32")] {
} else if #[cfg(any(target_arch = "wasm32", target_os = "none"))] {
#[path = "dummy.rs"]
mod real_imp;
} else if #[cfg(target_os = "hermit")] {
Expand Down
1 change: 1 addition & 0 deletions src/libproc_macro/lib.rs
Expand Up @@ -26,6 +26,7 @@
#![feature(in_band_lifetimes)]
#![feature(negative_impls)]
#![feature(optin_builtin_traits)]
#![feature(restricted_std)]
#![feature(rustc_attrs)]
#![feature(min_specialization)]
#![recursion_limit = "256"]
Expand Down
3 changes: 2 additions & 1 deletion src/librustc_passes/stability.rs
Expand Up @@ -502,7 +502,8 @@ impl Visitor<'tcx> for Checker<'tcx> {
match item.kind {
hir::ItemKind::ExternCrate(_) => {
// compiler-generated `extern crate` items have a dummy span.
if item.span.is_dummy() {
// `std` is still checked for the `restricted-std` feature.
if item.span.is_dummy() && item.ident.as_str() != "std" {
return;
}

Expand Down
3 changes: 3 additions & 0 deletions src/libstd/build.rs
Expand Up @@ -64,4 +64,7 @@ fn main() {
println!("cargo:rustc-link-lib=compiler_rt");
}
println!("cargo:rustc-env=STD_ENV_ARCH={}", env::var("CARGO_CFG_TARGET_ARCH").unwrap());
if target.contains("-none") || target.contains("nvptx") {
println!("cargo:rustc-cfg=feature=\"restricted-std\"");
}
}
9 changes: 8 additions & 1 deletion src/libstd/lib.rs
Expand Up @@ -197,7 +197,8 @@
//! [primitive types]: ../book/ch03-02-data-types.html
//! [rust-discord]: https://discord.gg/rust-lang

#![stable(feature = "rust1", since = "1.0.0")]
#![cfg_attr(not(feature = "restricted-std"), stable(feature = "rust1", since = "1.0.0"))]
#![cfg_attr(feature = "restricted-std", unstable(feature = "restricted_std", issue = "none"))]
#![doc(
html_root_url = "https://doc.rust-lang.org/nightly/",
html_playground_url = "https://play.rust-lang.org/",
Expand Down Expand Up @@ -552,3 +553,9 @@ include!("primitive_docs.rs");
// the rustdoc documentation for the existing keywords. Using `include!`
// because rustdoc only looks for these modules at the crate level.
include!("keyword_docs.rs");

// This is required to avoid an unstable error when `restricted-std` is not
// enabled. The use of #![feature(restricted_std)] in rustc-std-workspace-std
// is unconditional, so the unstable feature needs to be defined somewhere.
#[cfg_attr(not(feature = "restricted-std"), unstable(feature = "restricted_std", issue = "none"))]
mod __restricted_std_workaround {}
3 changes: 2 additions & 1 deletion src/libstd/sys/mod.rs
Expand Up @@ -48,7 +48,8 @@ cfg_if::cfg_if! {
mod sgx;
pub use self::sgx::*;
} else {
compile_error!("libstd doesn't compile for this platform yet");
mod unsupported;
pub use self::unsupported::*;
}
}

Expand Down
22 changes: 22 additions & 0 deletions src/libstd/sys/unsupported/alloc.rs
@@ -0,0 +1,22 @@
use crate::alloc::{GlobalAlloc, Layout, System};

#[stable(feature = "alloc_system_type", since = "1.28.0")]
unsafe impl GlobalAlloc for System {
#[inline]
unsafe fn alloc(&self, _layout: Layout) -> *mut u8 {
0 as *mut u8
}

#[inline]
unsafe fn alloc_zeroed(&self, _layout: Layout) -> *mut u8 {
0 as *mut u8
}

#[inline]
unsafe fn dealloc(&self, _ptr: *mut u8, _layout: Layout) {}

#[inline]
unsafe fn realloc(&self, _ptr: *mut u8, _layout: Layout, _new_size: usize) -> *mut u8 {
0 as *mut u8
}
}
38 changes: 38 additions & 0 deletions src/libstd/sys/unsupported/args.rs
@@ -0,0 +1,38 @@
use crate::ffi::OsString;

pub unsafe fn init(_argc: isize, _argv: *const *const u8) {}
pub unsafe fn cleanup() {}

pub struct Args {}

pub fn args() -> Args {
Args {}
}

impl Args {
pub fn inner_debug(&self) -> &[OsString] {
&[]
}
}

impl Iterator for Args {
type Item = OsString;
fn next(&mut self) -> Option<OsString> {
None
}
fn size_hint(&self) -> (usize, Option<usize>) {
(0, Some(0))
}
}

impl ExactSizeIterator for Args {
fn len(&self) -> usize {
0
}
}

impl DoubleEndedIterator for Args {
fn next_back(&mut self) -> Option<OsString> {
None
}
}
File renamed without changes.
48 changes: 48 additions & 0 deletions src/libstd/sys/unsupported/common.rs
@@ -0,0 +1,48 @@
use crate::io as std_io;

pub mod memchr {
pub use core::slice::memchr::{memchr, memrchr};
}

pub use crate::sys_common::os_str_bytes as os_str;

// This is not necessarily correct. May want to consider making it part of the
// spec definition?
use crate::os::raw::c_char;

#[cfg(not(test))]
pub fn init() {}

pub fn unsupported<T>() -> std_io::Result<T> {
Err(unsupported_err())
}

pub fn unsupported_err() -> std_io::Error {
std_io::Error::new(std_io::ErrorKind::Other, "operation not supported on this platform")
}

pub fn decode_error_kind(_code: i32) -> crate::io::ErrorKind {
crate::io::ErrorKind::Other
}

pub fn abort_internal() -> ! {
core::intrinsics::abort();
}

pub fn hashmap_random_keys() -> (u64, u64) {
(1, 2)
}

// This enum is used as the storage for a bunch of types which can't actually
// exist.
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Hash)]
pub enum Void {}

pub unsafe fn strlen(mut s: *const c_char) -> usize {
let mut n = 0;
while *s != 0 {
n += 1;
s = s.offset(1);
}
return n;
}
Expand Up @@ -18,11 +18,11 @@ impl Condvar {
pub unsafe fn notify_all(&self) {}

pub unsafe fn wait(&self, _mutex: &Mutex) {
panic!("can't block with web assembly")
panic!("condvar wait not supported")
}

pub unsafe fn wait_timeout(&self, _mutex: &Mutex, _dur: Duration) -> bool {
panic!("can't block with web assembly");
panic!("condvar wait not supported");
}

#[inline]
Expand Down
9 changes: 9 additions & 0 deletions src/libstd/sys/unsupported/env.rs
@@ -0,0 +1,9 @@
pub mod os {
pub const FAMILY: &str = "";
pub const OS: &str = "";
pub const DLL_PREFIX: &str = "";
pub const DLL_SUFFIX: &str = "";
pub const DLL_EXTENSION: &str = "";
pub const EXE_SUFFIX: &str = "";
pub const EXE_EXTENSION: &str = "";
}
File renamed without changes.
File renamed without changes.
24 changes: 24 additions & 0 deletions src/libstd/sys/unsupported/mod.rs
@@ -0,0 +1,24 @@
pub mod alloc;
pub mod args;
pub mod cmath;
pub mod condvar;
pub mod env;
pub mod fs;
pub mod io;
pub mod mutex;
pub mod net;
pub mod os;
pub mod path;
pub mod pipe;
pub mod process;
pub mod rwlock;
pub mod stack_overflow;
pub mod stdio;
pub mod thread;
#[cfg(target_thread_local)]
pub mod thread_local_dtor;
pub mod thread_local_key;
pub mod time;

mod common;
pub use common::*;
Expand Up @@ -5,9 +5,10 @@ pub struct Mutex {
}

unsafe impl Send for Mutex {}
unsafe impl Sync for Mutex {} // no threads on wasm
unsafe impl Sync for Mutex {} // no threads on this platform

impl Mutex {
#[rustc_const_stable(feature = "const_sys_mutex_new", since = "1.0.0")]
pub const fn new() -> Mutex {
Mutex { locked: UnsafeCell::new(false) }
}
Expand Down Expand Up @@ -42,8 +43,8 @@ impl Mutex {
pub unsafe fn destroy(&self) {}
}

// All empty stubs because wasm has no threads yet, so lock acquisition always
// succeeds.
// All empty stubs because this platform does not yet support threads, so lock
// acquisition always succeeds.
pub struct ReentrantMutex {}

impl ReentrantMutex {
Expand Down
File renamed without changes.
21 changes: 9 additions & 12 deletions src/libstd/sys/wasm/os.rs → src/libstd/sys/unsupported/os.rs
@@ -1,10 +1,9 @@
use super::{unsupported, Void};
use crate::error::Error as StdError;
use crate::ffi::{OsStr, OsString};
use crate::fmt;
use crate::io;
use crate::path::{self, PathBuf};
use crate::str;
use crate::sys::{unsupported, Void};

pub fn errno() -> i32 {
0
Expand Down Expand Up @@ -48,14 +47,14 @@ where

impl fmt::Display for JoinPathsError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
"not supported on wasm yet".fmt(f)
"not supported on this platform yet".fmt(f)
}
}

impl StdError for JoinPathsError {
#[allow(deprecated)]
fn description(&self) -> &str {
"not supported on wasm yet"
"not supported on this platform yet"
}
}

Expand All @@ -73,35 +72,33 @@ impl Iterator for Env {
}

pub fn env() -> Env {
panic!("not supported on web assembly")
panic!("not supported on this platform")
}

pub fn getenv(_: &OsStr) -> io::Result<Option<OsString>> {
Ok(None)
}

pub fn setenv(_: &OsStr, _: &OsStr) -> io::Result<()> {
Err(io::Error::new(io::ErrorKind::Other, "cannot set env vars on wasm32-unknown-unknown"))
Err(io::Error::new(io::ErrorKind::Other, "cannot set env vars on this platform"))
}

pub fn unsetenv(_: &OsStr) -> io::Result<()> {
Err(io::Error::new(io::ErrorKind::Other, "cannot unset env vars on wasm32-unknown-unknown"))
Err(io::Error::new(io::ErrorKind::Other, "cannot unset env vars on this platform"))
}

pub fn temp_dir() -> PathBuf {
panic!("no filesystem on wasm")
panic!("no filesystem on this platform")
}

pub fn home_dir() -> Option<PathBuf> {
None
}

pub fn exit(_code: i32) -> ! {
unsafe {
crate::arch::wasm32::unreachable();
}
crate::intrinsics::abort()
}

pub fn getpid() -> u32 {
panic!("no pids on wasm")
panic!("no pids on this platform")
}
File renamed without changes.
File renamed without changes.
File renamed without changes.
Expand Up @@ -5,7 +5,7 @@ pub struct RWLock {
}

unsafe impl Send for RWLock {}
unsafe impl Sync for RWLock {} // no threads on wasm
unsafe impl Sync for RWLock {} // no threads on this platform

impl RWLock {
pub const fn new() -> RWLock {
Expand Down
File renamed without changes.
File renamed without changes.
41 changes: 41 additions & 0 deletions src/libstd/sys/unsupported/thread.rs
@@ -0,0 +1,41 @@
use super::{unsupported, Void};
use crate::ffi::CStr;
use crate::io;
use crate::time::Duration;

pub struct Thread(Void);

pub const DEFAULT_MIN_STACK_SIZE: usize = 4096;

impl Thread {
// unsafe: see thread::Builder::spawn_unchecked for safety requirements
pub unsafe fn new(_stack: usize, _p: Box<dyn FnOnce()>) -> io::Result<Thread> {
unsupported()
}

pub fn yield_now() {
// do nothing
}

pub fn set_name(_name: &CStr) {
// nope
}

pub fn sleep(_dur: Duration) {
panic!("can't sleep");
}

pub fn join(self) {
match self.0 {}
}
}

pub mod guard {
pub type Guard = !;
pub unsafe fn current() -> Option<Guard> {
None
}
pub unsafe fn init() -> Option<Guard> {
None
}
}
File renamed without changes.

0 comments on commit 6e9a1de

Please sign in to comment.