This repository was archived by the owner on Aug 25, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 16 additions & 15 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -50,12 +50,9 @@ infrastructure. Nevertheless, `wee_alloc` is also usable with `std`.
// We aren't using the standard library.
#![no_std]

// Required to replace the global allocator.
#![feature(global_allocator)]

// Required to use the `alloc` crate and its types, the `abort` intrinsic, and a
// custom panic handler.
#![feature(alloc, core_intrinsics, lang_items)]
#![feature(alloc, core_intrinsics, panic_implementation, lang_items)]

extern crate alloc;
extern crate wee_alloc;
Expand All@@ -64,18 +61,22 @@ extern crate wee_alloc;
#[global_allocator]
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;

// Need to provide a tiny `panic_fmt` lang-item implementation for `#![no_std]`.
// This implementation will translate panics into traps in the resulting
// WebAssembly.
#[lang = "panic_fmt"]
extern "C" fn panic_fmt(
_args: ::core::fmt::Arguments,
_file: &'static str,
_line: u32
) -> ! {
use core::intrinsics;
// Need to provide a tiny `panic` implementation for `#![no_std]`.
// This translates into an `unreachable` instruction that will
// raise a `trap` the WebAssembly execution if we panic at runtime.
#[panic_implementation]
fn panic(_info: &::core::panic::PanicInfo) -> ! {
unsafe {
::core::intrinsics::abort();
}
}

// Need to provide a tiny `oom` lang-item implementation for
// `#![no_std]`.
#[lang = "oom"]
extern "C" fn oom() -> ! {
unsafe {
intrinsics::abort();
::core::intrinsics::abort();
}
}

Expand Down
10 changes: 5 additions & 5 deletions example/src/lib.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,7 +6,7 @@
// We aren't using the standard library.
#![no_std]
// Replacing the allocator and using the `alloc` crate are still unstable.
#![feature(alloc, core_intrinsics, global_allocator, lang_items)]
#![feature(alloc, core_intrinsics, panic_implementation, lang_items)]

extern crate alloc;
extern crate wee_alloc;
Expand All@@ -15,11 +15,11 @@ extern crate wee_alloc;
#[global_allocator]
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;

// Need to provide a tiny `panic_fmt` lang-item implementation for
// `#![no_std]`. This translates into an `unreachable` instruction that will
// Need to provide a tiny `panic` implementation for `#![no_std]`.
// This translates into an `unreachable` instruction that will
// raise a `trap` the WebAssembly execution if we panic at runtime.
#[lang = "panic_fmt"]
extern "C" fn panic_fmt(_args: ::core::fmt::Arguments, _file: &'static str, _line: u32) -> ! {
#[panic_implementation]
fn panic(_info: &::core::panic::PanicInfo) -> ! {
unsafe {
::core::intrinsics::abort();
}
Expand Down
5 changes: 2 additions & 3 deletions test/src/lib.rs
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
#![feature(alloc, allocator_api)]

extern crate alloc;
extern crate histo;
#[macro_use]
extern crate quickcheck;
Expand All@@ -9,7 +8,7 @@ extern crate cfg_if;
extern crate rand;
extern crate wee_alloc;

use alloc::heap::{Alloc, Layout};
use std::alloc::{Alloc, Layout};
use quickcheck::{Arbitrary, Gen};
use std::f64;
use std::fs;
Expand DownExpand Up@@ -374,7 +373,7 @@ quickcheck! {
let align = ALIGNS[align % ALIGNS.len()];

let mut w = &wee_alloc::WeeAlloc::INIT;
let layout = alloc::heap::Layout::from_size_align(size, align).unwrap();
let layout = Layout::from_size_align(size, align).unwrap();
let _ = unsafe { w.alloc(layout) };
}
}
Expand Down
2 changes: 0 additions & 2 deletions test/tests/global.rs
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
// Adopted from
// https://github.com/alexcrichton/dlmalloc-rs/blob/master/tests/global.rs

#![feature(global_allocator)]

extern crate wee_alloc;

use std::collections::HashMap;
Expand Down
6 changes: 3 additions & 3 deletions wee_alloc/src/imp_static_array.rs
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
use const_init::ConstInit;
use core::alloc::{AllocErr, Opaque};
use core::alloc::AllocErr;
#[cfg(feature = "extra_assertions")]
use core::cell::Cell;
use core::ptr::NonNull;
Expand All@@ -10,12 +10,12 @@ const SCRATCH_LEN_BYTES: usize = include!(concat!(env!("OUT_DIR"), "/wee_alloc_s
static mut SCRATCH_HEAP: [u8; SCRATCH_LEN_BYTES] = [0; SCRATCH_LEN_BYTES];
static mut OFFSET: Mutex<usize> = Mutex::new(0);

pub(crate) unsafe fn alloc_pages(pages: Pages) -> Result<NonNull<Opaque>, AllocErr> {
pub(crate) unsafe fn alloc_pages(pages: Pages) -> Result<NonNull<u8>, AllocErr> {
let bytes: Bytes = pages.into();
let mut offset = OFFSET.lock();
let end = bytes.0 + *offset;
if end < SCRATCH_LEN_BYTES {
let ptr = SCRATCH_HEAP[*offset..end].as_mut_ptr() as *mut u8 as *mut Opaque;
let ptr = SCRATCH_HEAP[*offset..end].as_mut_ptr() as *mut u8;
*offset = end;
NonNull::new(ptr).ok_or_else(|| AllocErr)
} else {
Expand Down
6 changes: 3 additions & 3 deletions wee_alloc/src/imp_unix.rs
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
use const_init::ConstInit;
use core::alloc::{AllocErr, Opaque};
use core::alloc::AllocErr;
use core::cell::UnsafeCell;
use core::ptr::NonNull;
use libc;
use memory_units::{Bytes, Pages};

pub(crate) fn alloc_pages(pages: Pages) -> Result<NonNull<Opaque>, AllocErr> {
pub(crate) fn alloc_pages(pages: Pages) -> Result<NonNull<u8>, AllocErr> {
unsafe {
let bytes: Bytes = pages.into();
let addr = libc::mmap(
Expand All@@ -19,7 +19,7 @@ pub(crate) fn alloc_pages(pages: Pages) -> Result<NonNull<Opaque>, AllocErr> {
if addr == libc::MAP_FAILED {
Err(AllocErr)
} else {
NonNull::new(addr as *mut Opaque).ok_or(AllocErr)
NonNull::new(addr as *mut u8).ok_or(AllocErr)
}
}
}
Expand Down
6 changes: 3 additions & 3 deletions wee_alloc/src/imp_wasm32.rs
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
use super::{assert_is_word_aligned, PAGE_SIZE, unchecked_unwrap};
use const_init::ConstInit;
use core::alloc::{AllocErr, Opaque};
use core::alloc::AllocErr;
use core::cell::UnsafeCell;
use core::ptr::NonNull;
use memory_units::Pages;
Expand All@@ -10,10 +10,10 @@ extern "C" {
fn grow_memory(pages: usize) -> i32;
}

pub(crate) unsafe fn alloc_pages(n: Pages) -> Result<NonNull<Opaque>, AllocErr> {
pub(crate) unsafe fn alloc_pages(n: Pages) -> Result<NonNull<u8>, AllocErr> {
let ptr = grow_memory(n.0);
if -1 != ptr {
let ptr = (ptr as usize * PAGE_SIZE.0) as *mut Opaque;
let ptr = (ptr as usize * PAGE_SIZE.0) as *mut u8;
assert_is_word_aligned(ptr as *mut u8);
Ok(unchecked_unwrap(NonNull::new(ptr)))
} else {
Expand Down
6 changes: 3 additions & 3 deletions wee_alloc/src/imp_windows.rs
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
use const_init::ConstInit;
use core::alloc::{AllocErr, Opaque};
use core::alloc::AllocErr;
use core::cell::UnsafeCell;
use core::ptr::NonNull;
use memory_units::{Bytes, Pages};
Expand All@@ -12,10 +12,10 @@ use winapi::um::synchapi::{CreateMutexW, ReleaseMutex, WaitForSingleObject};
use winapi::um::winbase::{WAIT_OBJECT_0, INFINITE};
use winapi::um::winnt::{HANDLE, MEM_COMMIT, PAGE_READWRITE};

pub(crate) fn alloc_pages(pages: Pages) -> Result<NonNull<Opaque>, AllocErr> {
pub(crate) fn alloc_pages(pages: Pages) -> Result<NonNull<u8>, AllocErr> {
let bytes: Bytes = pages.into();
let ptr = unsafe { VirtualAlloc(NULL, bytes.0, MEM_COMMIT, PAGE_READWRITE) };
NonNull::new(ptr as *mut Opaque).ok_or(AllocErr)
NonNull::new(ptr as *mut u8).ok_or(AllocErr)
}

// Align to the cache line size on an i7 to avoid false sharing.
Expand Down
57 changes: 29 additions & 28 deletions wee_alloc/src/lib.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -50,12 +50,9 @@ infrastructure. Nevertheless, `wee_alloc` is also usable with `std`.
// We aren't using the standard library.
#![no_std]

// Required to replace the global allocator.
#![feature(global_allocator)]

// Required to use the `alloc` crate and its types, the `abort` intrinsic, and a
// custom panic handler.
#![feature(alloc, core_intrinsics, lang_items)]
#![feature(alloc, core_intrinsics, panic_implementation, lang_items)]

extern crate alloc;
extern crate wee_alloc;
Expand All@@ -64,18 +61,22 @@ extern crate wee_alloc;
#[global_allocator]
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;

// Need to provide a tiny `panic_fmt` lang-item implementation for `#![no_std]`.
// This implementation will translate panics into traps in the resulting
// WebAssembly.
#[lang = "panic_fmt"]
extern "C" fn panic_fmt(
_args: ::core::fmt::Arguments,
_file: &'static str,
_line: u32
) -> ! {
use core::intrinsics;
// Need to provide a tiny `panic` implementation for `#![no_std]`.
// This translates into an `unreachable` instruction that will
// raise a `trap` the WebAssembly execution if we panic at runtime.
#[panic_implementation]
fn panic(_info: &::core::panic::PanicInfo) -> ! {
unsafe {
::core::intrinsics::abort();
}
}

// Need to provide a tiny `oom` lang-item implementation for
// `#![no_std]`.
#[lang = "oom"]
extern "C" fn oom() -> ! {
unsafe {
intrinsics::abort();
::core::intrinsics::abort();
}
}

Expand DownExpand Up@@ -222,7 +223,7 @@ for hacking!

#![deny(missing_docs)]
#![cfg_attr(not(feature = "use_std_for_test_debugging"), no_std)]
#![feature(alloc, allocator_api, core_intrinsics, global_allocator)]
#![feature(alloc, allocator_api, core_intrinsics)]
#![cfg_attr(target_arch = "wasm32", feature(link_llvm_intrinsics))]

#[macro_use]
Expand DownExpand Up@@ -269,7 +270,7 @@ mod neighbors;
mod size_classes;

use const_init::ConstInit;
use core::alloc::{Alloc, AllocErr, GlobalAlloc, Layout, Opaque};
use core::alloc::{Alloc, AllocErr, GlobalAlloc, Layout};
use core::cell::Cell;
use core::cmp;
use core::marker::Sync;
Expand DownExpand Up@@ -520,7 +521,7 @@ impl<'a> FreeCell<'a> {
}

unsafe fn from_uninitialized(
raw: NonNull<Opaque>,
raw: NonNull<u8>,
size: Bytes,
next_free: Option<*const FreeCell<'a>>,
policy: &AllocPolicy<'a>,
Expand DownExpand Up@@ -586,7 +587,7 @@ impl<'a> FreeCell<'a> {
let split_cell_head = split_and_aligned - size_of::<CellHeader>().0;
let split_cell = unsafe {
&*FreeCell::from_uninitialized(
unchecked_unwrap(NonNull::new(split_cell_head as *mut Opaque)),
unchecked_unwrap(NonNull::new(split_cell_head as *mut u8)),
Bytes(next - split_cell_head) - size_of::<CellHeader>(),
None,
policy,
Expand DownExpand Up@@ -951,7 +952,7 @@ unsafe fn alloc_first_fit<'a>(
align: Bytes,
head: &Cell<*const FreeCell<'a>>,
policy: &AllocPolicy<'a>,
) -> Result<NonNull<Opaque>, AllocErr> {
) -> Result<NonNull<u8>, AllocErr> {
extra_assert!(size.0 > 0);

walk_free_list(head, policy, |previous, current| {
Expand All@@ -960,7 +961,7 @@ unsafe fn alloc_first_fit<'a>(
if let Some(allocated) = current.try_alloc(previous, size, align, policy) {
assert_aligned_to(allocated.data(), align);
return Some(unchecked_unwrap(
NonNull::new(allocated.data() as *mut Opaque),
NonNull::new(allocated.data() as *mut u8),
));
}

Expand All@@ -973,7 +974,7 @@ unsafe fn alloc_with_refill<'a, 'b>(
align: Bytes,
head: &'b Cell<*const FreeCell<'a>>,
policy: &AllocPolicy<'a>,
) -> Result<NonNull<Opaque>, AllocErr> {
) -> Result<NonNull<u8>, AllocErr> {
if let Ok(result) = alloc_first_fit(size, align, head, policy) {
return Ok(result);
}
Expand DownExpand Up@@ -1072,7 +1073,7 @@ unsafe impl<'a, 'b> Alloc for &'b WeeAlloc<'a>
where
'a: 'b,
{
unsafe fn alloc(&mut self, layout: Layout) -> Result<NonNull<Opaque>, AllocErr> {
unsafe fn alloc(&mut self, layout: Layout) -> Result<NonNull<u8>, AllocErr> {
let size = Bytes(layout.size());
let align = if layout.align() == 0 {
Bytes(1)
Expand All@@ -1084,7 +1085,7 @@ where
// Ensure that our made up pointer is properly aligned by using the
// alignment as the pointer.
extra_assert!(align.0 > 0);
return Ok(NonNull::new_unchecked(align.0 as *mut Opaque));
return Ok(NonNull::new_unchecked(align.0 as *mut u8));
}

let size: Words = size.round_up_to();
Expand All@@ -1095,7 +1096,7 @@ where
})
}

unsafe fn dealloc(&mut self, ptr: NonNull<Opaque>, layout: Layout) {
unsafe fn dealloc(&mut self, ptr: NonNull<u8>, layout: Layout) {
let size = Bytes(layout.size());
if size.0 == 0 {
return;
Expand DownExpand Up@@ -1185,15 +1186,15 @@ where
}

unsafe impl GlobalAlloc for WeeAlloc<'static> {
unsafe fn alloc(&self, layout: Layout) -> *mut Opaque {
unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
let mut me = self;
match Alloc::alloc(&mut me, layout) {
Ok(ptr) => ptr.as_ptr(),
Err(AllocErr) => 0 as *mut Opaque,
Err(AllocErr) => 0 as *mut u8,
}
}

unsafe fn dealloc(&self, ptr: *mut Opaque, layout: Layout) {
unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) {
if let Some(ptr) = NonNull::new(ptr) {
let mut me = self;
Alloc::dealloc(&mut me, ptr, layout);
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
This repository was archived by the owner on Aug 25, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 16 additions & 15 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -50,12 +50,9 @@ infrastructure. Nevertheless, `wee_alloc` is also usable with `std`.
// We aren't using the standard library.
#![no_std]

// Required to replace the global allocator.
#![feature(global_allocator)]

// Required to use the `alloc` crate and its types, the `abort` intrinsic, and a
// custom panic handler.
#![feature(alloc, core_intrinsics, lang_items)]
#![feature(alloc, core_intrinsics, panic_implementation, lang_items)]

extern crate alloc;
extern crate wee_alloc;
Expand All@@ -64,18 +61,22 @@ extern crate wee_alloc;
#[global_allocator]
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;

// Need to provide a tiny `panic_fmt` lang-item implementation for `#![no_std]`.
// This implementation will translate panics into traps in the resulting
// WebAssembly.
#[lang = "panic_fmt"]
extern "C" fn panic_fmt(
_args: ::core::fmt::Arguments,
_file: &'static str,
_line: u32
) -> ! {
use core::intrinsics;
// Need to provide a tiny `panic` implementation for `#![no_std]`.
// This translates into an `unreachable` instruction that will
// raise a `trap` the WebAssembly execution if we panic at runtime.
#[panic_implementation]
fn panic(_info: &::core::panic::PanicInfo) -> ! {
unsafe {
::core::intrinsics::abort();
}
}

// Need to provide a tiny `oom` lang-item implementation for
// `#![no_std]`.
#[lang = "oom"]
extern "C" fn oom() -> ! {
unsafe {
intrinsics::abort();
::core::intrinsics::abort();
}
}

Expand Down
10 changes: 5 additions & 5 deletions example/src/lib.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,7 +6,7 @@
// We aren't using the standard library.
#![no_std]
// Replacing the allocator and using the `alloc` crate are still unstable.
#![feature(alloc, core_intrinsics, global_allocator, lang_items)]
#![feature(alloc, core_intrinsics, panic_implementation, lang_items)]

extern crate alloc;
extern crate wee_alloc;
Expand All@@ -15,11 +15,11 @@ extern crate wee_alloc;
#[global_allocator]
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;

// Need to provide a tiny `panic_fmt` lang-item implementation for
// `#![no_std]`. This translates into an `unreachable` instruction that will
// Need to provide a tiny `panic` implementation for `#![no_std]`.
// This translates into an `unreachable` instruction that will
// raise a `trap` the WebAssembly execution if we panic at runtime.
#[lang = "panic_fmt"]
extern "C" fn panic_fmt(_args: ::core::fmt::Arguments, _file: &'static str, _line: u32) -> ! {
#[panic_implementation]
fn panic(_info: &::core::panic::PanicInfo) -> ! {
unsafe {
::core::intrinsics::abort();
}
Expand Down
5 changes: 2 additions & 3 deletions test/src/lib.rs
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
#![feature(alloc, allocator_api)]

extern crate alloc;
extern crate histo;
#[macro_use]
extern crate quickcheck;
Expand All@@ -9,7 +8,7 @@ extern crate cfg_if;
extern crate rand;
extern crate wee_alloc;

use alloc::heap::{Alloc, Layout};
use std::alloc::{Alloc, Layout};
use quickcheck::{Arbitrary, Gen};
use std::f64;
use std::fs;
Expand DownExpand Up@@ -374,7 +373,7 @@ quickcheck! {
let align = ALIGNS[align % ALIGNS.len()];

let mut w = &wee_alloc::WeeAlloc::INIT;
let layout = alloc::heap::Layout::from_size_align(size, align).unwrap();
let layout = Layout::from_size_align(size, align).unwrap();
let _ = unsafe { w.alloc(layout) };
}
}
Expand Down
2 changes: 0 additions & 2 deletions test/tests/global.rs
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
// Adopted from
// https://github.com/alexcrichton/dlmalloc-rs/blob/master/tests/global.rs

#![feature(global_allocator)]

extern crate wee_alloc;

use std::collections::HashMap;
Expand Down
6 changes: 3 additions & 3 deletions wee_alloc/src/imp_static_array.rs
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
use const_init::ConstInit;
use core::alloc::{AllocErr, Opaque};
use core::alloc::AllocErr;
#[cfg(feature = "extra_assertions")]
use core::cell::Cell;
use core::ptr::NonNull;
Expand All@@ -10,12 +10,12 @@ const SCRATCH_LEN_BYTES: usize = include!(concat!(env!("OUT_DIR"), "/wee_alloc_s
static mut SCRATCH_HEAP: [u8; SCRATCH_LEN_BYTES] = [0; SCRATCH_LEN_BYTES];
static mut OFFSET: Mutex<usize> = Mutex::new(0);

pub(crate) unsafe fn alloc_pages(pages: Pages) -> Result<NonNull<Opaque>, AllocErr> {
pub(crate) unsafe fn alloc_pages(pages: Pages) -> Result<NonNull<u8>, AllocErr> {
let bytes: Bytes = pages.into();
let mut offset = OFFSET.lock();
let end = bytes.0 + *offset;
if end < SCRATCH_LEN_BYTES {
let ptr = SCRATCH_HEAP[*offset..end].as_mut_ptr() as *mut u8 as *mut Opaque;
let ptr = SCRATCH_HEAP[*offset..end].as_mut_ptr() as *mut u8;
*offset = end;
NonNull::new(ptr).ok_or_else(|| AllocErr)
} else {
Expand Down
6 changes: 3 additions & 3 deletions wee_alloc/src/imp_unix.rs
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
use const_init::ConstInit;
use core::alloc::{AllocErr, Opaque};
use core::alloc::AllocErr;
use core::cell::UnsafeCell;
use core::ptr::NonNull;
use libc;
use memory_units::{Bytes, Pages};

pub(crate) fn alloc_pages(pages: Pages) -> Result<NonNull<Opaque>, AllocErr> {
pub(crate) fn alloc_pages(pages: Pages) -> Result<NonNull<u8>, AllocErr> {
unsafe {
let bytes: Bytes = pages.into();
let addr = libc::mmap(
Expand All@@ -19,7 +19,7 @@ pub(crate) fn alloc_pages(pages: Pages) -> Result<NonNull<Opaque>, AllocErr> {
if addr == libc::MAP_FAILED {
Err(AllocErr)
} else {
NonNull::new(addr as *mut Opaque).ok_or(AllocErr)
NonNull::new(addr as *mut u8).ok_or(AllocErr)
}
}
}
Expand Down
6 changes: 3 additions & 3 deletions wee_alloc/src/imp_wasm32.rs
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
use super::{assert_is_word_aligned, PAGE_SIZE, unchecked_unwrap};
use const_init::ConstInit;
use core::alloc::{AllocErr, Opaque};
use core::alloc::AllocErr;
use core::cell::UnsafeCell;
use core::ptr::NonNull;
use memory_units::Pages;
Expand All@@ -10,10 +10,10 @@ extern "C" {
fn grow_memory(pages: usize) -> i32;
}

pub(crate) unsafe fn alloc_pages(n: Pages) -> Result<NonNull<Opaque>, AllocErr> {
pub(crate) unsafe fn alloc_pages(n: Pages) -> Result<NonNull<u8>, AllocErr> {
let ptr = grow_memory(n.0);
if -1 != ptr {
let ptr = (ptr as usize * PAGE_SIZE.0) as *mut Opaque;
let ptr = (ptr as usize * PAGE_SIZE.0) as *mut u8;
assert_is_word_aligned(ptr as *mut u8);
Ok(unchecked_unwrap(NonNull::new(ptr)))
} else {
Expand Down
6 changes: 3 additions & 3 deletions wee_alloc/src/imp_windows.rs
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
use const_init::ConstInit;
use core::alloc::{AllocErr, Opaque};
use core::alloc::AllocErr;
use core::cell::UnsafeCell;
use core::ptr::NonNull;
use memory_units::{Bytes, Pages};
Expand All@@ -12,10 +12,10 @@ use winapi::um::synchapi::{CreateMutexW, ReleaseMutex, WaitForSingleObject};
use winapi::um::winbase::{WAIT_OBJECT_0, INFINITE};
use winapi::um::winnt::{HANDLE, MEM_COMMIT, PAGE_READWRITE};

pub(crate) fn alloc_pages(pages: Pages) -> Result<NonNull<Opaque>, AllocErr> {
pub(crate) fn alloc_pages(pages: Pages) -> Result<NonNull<u8>, AllocErr> {
let bytes: Bytes = pages.into();
let ptr = unsafe { VirtualAlloc(NULL, bytes.0, MEM_COMMIT, PAGE_READWRITE) };
NonNull::new(ptr as *mut Opaque).ok_or(AllocErr)
NonNull::new(ptr as *mut u8).ok_or(AllocErr)
}

// Align to the cache line size on an i7 to avoid false sharing.
Expand Down
57 changes: 29 additions & 28 deletions wee_alloc/src/lib.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -50,12 +50,9 @@ infrastructure. Nevertheless, `wee_alloc` is also usable with `std`.
// We aren't using the standard library.
#![no_std]

// Required to replace the global allocator.
#![feature(global_allocator)]

// Required to use the `alloc` crate and its types, the `abort` intrinsic, and a
// custom panic handler.
#![feature(alloc, core_intrinsics, lang_items)]
#![feature(alloc, core_intrinsics, panic_implementation, lang_items)]

extern crate alloc;
extern crate wee_alloc;
Expand All@@ -64,18 +61,22 @@ extern crate wee_alloc;
#[global_allocator]
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;

// Need to provide a tiny `panic_fmt` lang-item implementation for `#![no_std]`.
// This implementation will translate panics into traps in the resulting
// WebAssembly.
#[lang = "panic_fmt"]
extern "C" fn panic_fmt(
_args: ::core::fmt::Arguments,
_file: &'static str,
_line: u32
) -> ! {
use core::intrinsics;
// Need to provide a tiny `panic` implementation for `#![no_std]`.
// This translates into an `unreachable` instruction that will
// raise a `trap` the WebAssembly execution if we panic at runtime.
#[panic_implementation]
fn panic(_info: &::core::panic::PanicInfo) -> ! {
unsafe {
::core::intrinsics::abort();
}
}

// Need to provide a tiny `oom` lang-item implementation for
// `#![no_std]`.
#[lang = "oom"]
extern "C" fn oom() -> ! {
unsafe {
intrinsics::abort();
::core::intrinsics::abort();
}
}

Expand DownExpand Up@@ -222,7 +223,7 @@ for hacking!

#![deny(missing_docs)]
#![cfg_attr(not(feature = "use_std_for_test_debugging"), no_std)]
#![feature(alloc, allocator_api, core_intrinsics, global_allocator)]
#![feature(alloc, allocator_api, core_intrinsics)]
#![cfg_attr(target_arch = "wasm32", feature(link_llvm_intrinsics))]

#[macro_use]
Expand DownExpand Up@@ -269,7 +270,7 @@ mod neighbors;
mod size_classes;

use const_init::ConstInit;
use core::alloc::{Alloc, AllocErr, GlobalAlloc, Layout, Opaque};
use core::alloc::{Alloc, AllocErr, GlobalAlloc, Layout};
use core::cell::Cell;
use core::cmp;
use core::marker::Sync;
Expand DownExpand Up@@ -520,7 +521,7 @@ impl<'a> FreeCell<'a> {
}

unsafe fn from_uninitialized(
raw: NonNull<Opaque>,
raw: NonNull<u8>,
size: Bytes,
next_free: Option<*const FreeCell<'a>>,
policy: &AllocPolicy<'a>,
Expand DownExpand Up@@ -586,7 +587,7 @@ impl<'a> FreeCell<'a> {
let split_cell_head = split_and_aligned - size_of::<CellHeader>().0;
let split_cell = unsafe {
&*FreeCell::from_uninitialized(
unchecked_unwrap(NonNull::new(split_cell_head as *mut Opaque)),
unchecked_unwrap(NonNull::new(split_cell_head as *mut u8)),
Bytes(next - split_cell_head) - size_of::<CellHeader>(),
None,
policy,
Expand DownExpand Up@@ -951,7 +952,7 @@ unsafe fn alloc_first_fit<'a>(
align: Bytes,
head: &Cell<*const FreeCell<'a>>,
policy: &AllocPolicy<'a>,
) -> Result<NonNull<Opaque>, AllocErr> {
) -> Result<NonNull<u8>, AllocErr> {
extra_assert!(size.0 > 0);

walk_free_list(head, policy, |previous, current| {
Expand All@@ -960,7 +961,7 @@ unsafe fn alloc_first_fit<'a>(
if let Some(allocated) = current.try_alloc(previous, size, align, policy) {
assert_aligned_to(allocated.data(), align);
return Some(unchecked_unwrap(
NonNull::new(allocated.data() as *mut Opaque),
NonNull::new(allocated.data() as *mut u8),
));
}

Expand All@@ -973,7 +974,7 @@ unsafe fn alloc_with_refill<'a, 'b>(
align: Bytes,
head: &'b Cell<*const FreeCell<'a>>,
policy: &AllocPolicy<'a>,
) -> Result<NonNull<Opaque>, AllocErr> {
) -> Result<NonNull<u8>, AllocErr> {
if let Ok(result) = alloc_first_fit(size, align, head, policy) {
return Ok(result);
}
Expand DownExpand Up@@ -1072,7 +1073,7 @@ unsafe impl<'a, 'b> Alloc for &'b WeeAlloc<'a>
where
'a: 'b,
{
unsafe fn alloc(&mut self, layout: Layout) -> Result<NonNull<Opaque>, AllocErr> {
unsafe fn alloc(&mut self, layout: Layout) -> Result<NonNull<u8>, AllocErr> {
let size = Bytes(layout.size());
let align = if layout.align() == 0 {
Bytes(1)
Expand All@@ -1084,7 +1085,7 @@ where
// Ensure that our made up pointer is properly aligned by using the
// alignment as the pointer.
extra_assert!(align.0 > 0);
return Ok(NonNull::new_unchecked(align.0 as *mut Opaque));
return Ok(NonNull::new_unchecked(align.0 as *mut u8));
}

let size: Words = size.round_up_to();
Expand All@@ -1095,7 +1096,7 @@ where
})
}

unsafe fn dealloc(&mut self, ptr: NonNull<Opaque>, layout: Layout) {
unsafe fn dealloc(&mut self, ptr: NonNull<u8>, layout: Layout) {
let size = Bytes(layout.size());
if size.0 == 0 {
return;
Expand DownExpand Up@@ -1185,15 +1186,15 @@ where
}

unsafe impl GlobalAlloc for WeeAlloc<'static> {
unsafe fn alloc(&self, layout: Layout) -> *mut Opaque {
unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
let mut me = self;
match Alloc::alloc(&mut me, layout) {
Ok(ptr) => ptr.as_ptr(),
Err(AllocErr) => 0 as *mut Opaque,
Err(AllocErr) => 0 as *mut u8,
}
}

unsafe fn dealloc(&self, ptr: *mut Opaque, layout: Layout) {
unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) {
if let Some(ptr) = NonNull::new(ptr) {
let mut me = self;
Alloc::dealloc(&mut me, ptr, layout);
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Aug 25, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 16 additions & 15 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -50,12 +50,9 @@ infrastructure. Nevertheless, `wee_alloc` is also usable with `std`.
// We aren't using the standard library.
#![no_std]

// Required to replace the global allocator.
#![feature(global_allocator)]

// Required to use the `alloc` crate and its types, the `abort` intrinsic, and a
// custom panic handler.
#![feature(alloc, core_intrinsics, lang_items)]
#![feature(alloc, core_intrinsics, panic_implementation, lang_items)]

extern crate alloc;
extern crate wee_alloc;
Expand All@@ -64,18 +61,22 @@ extern crate wee_alloc;
#[global_allocator]
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;

// Need to provide a tiny `panic_fmt` lang-item implementation for `#![no_std]`.
// This implementation will translate panics into traps in the resulting
// WebAssembly.
#[lang = "panic_fmt"]
extern "C" fn panic_fmt(
_args: ::core::fmt::Arguments,
_file: &'static str,
_line: u32
) -> ! {
use core::intrinsics;
// Need to provide a tiny `panic` implementation for `#![no_std]`.
// This translates into an `unreachable` instruction that will
// raise a `trap` the WebAssembly execution if we panic at runtime.
#[panic_implementation]
fn panic(_info: &::core::panic::PanicInfo) -> ! {
unsafe {
::core::intrinsics::abort();
}
}

// Need to provide a tiny `oom` lang-item implementation for
// `#![no_std]`.
#[lang = "oom"]
extern "C" fn oom() -> ! {
unsafe {
intrinsics::abort();
::core::intrinsics::abort();
}
}

Expand Down
10 changes: 5 additions & 5 deletions example/src/lib.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,7 +6,7 @@
// We aren't using the standard library.
#![no_std]
// Replacing the allocator and using the `alloc` crate are still unstable.
#![feature(alloc, core_intrinsics, global_allocator, lang_items)]
#![feature(alloc, core_intrinsics, panic_implementation, lang_items)]

extern crate alloc;
extern crate wee_alloc;
Expand All@@ -15,11 +15,11 @@ extern crate wee_alloc;
#[global_allocator]
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;

// Need to provide a tiny `panic_fmt` lang-item implementation for
// `#![no_std]`. This translates into an `unreachable` instruction that will
// Need to provide a tiny `panic` implementation for `#![no_std]`.
// This translates into an `unreachable` instruction that will
// raise a `trap` the WebAssembly execution if we panic at runtime.
#[lang = "panic_fmt"]
extern "C" fn panic_fmt(_args: ::core::fmt::Arguments, _file: &'static str, _line: u32) -> ! {
#[panic_implementation]
fn panic(_info: &::core::panic::PanicInfo) -> ! {
unsafe {
::core::intrinsics::abort();
}
Expand Down
5 changes: 2 additions & 3 deletions test/src/lib.rs
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
#![feature(alloc, allocator_api)]

extern crate alloc;
extern crate histo;
#[macro_use]
extern crate quickcheck;
Expand All@@ -9,7 +8,7 @@ extern crate cfg_if;
extern crate rand;
extern crate wee_alloc;

use alloc::heap::{Alloc, Layout};
use std::alloc::{Alloc, Layout};
use quickcheck::{Arbitrary, Gen};
use std::f64;
use std::fs;
Expand DownExpand Up@@ -374,7 +373,7 @@ quickcheck! {
let align = ALIGNS[align % ALIGNS.len()];

let mut w = &wee_alloc::WeeAlloc::INIT;
let layout = alloc::heap::Layout::from_size_align(size, align).unwrap();
let layout = Layout::from_size_align(size, align).unwrap();
let _ = unsafe { w.alloc(layout) };
}
}
Expand Down
2 changes: 0 additions & 2 deletions test/tests/global.rs
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
// Adopted from
// https://github.com/alexcrichton/dlmalloc-rs/blob/master/tests/global.rs

#![feature(global_allocator)]

extern crate wee_alloc;

use std::collections::HashMap;
Expand Down
6 changes: 3 additions & 3 deletions wee_alloc/src/imp_static_array.rs
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
use const_init::ConstInit;
use core::alloc::{AllocErr, Opaque};
use core::alloc::AllocErr;
#[cfg(feature = "extra_assertions")]
use core::cell::Cell;
use core::ptr::NonNull;
Expand All@@ -10,12 +10,12 @@ const SCRATCH_LEN_BYTES: usize = include!(concat!(env!("OUT_DIR"), "/wee_alloc_s
static mut SCRATCH_HEAP: [u8; SCRATCH_LEN_BYTES] = [0; SCRATCH_LEN_BYTES];
static mut OFFSET: Mutex<usize> = Mutex::new(0);

pub(crate) unsafe fn alloc_pages(pages: Pages) -> Result<NonNull<Opaque>, AllocErr> {
pub(crate) unsafe fn alloc_pages(pages: Pages) -> Result<NonNull<u8>, AllocErr> {
let bytes: Bytes = pages.into();
let mut offset = OFFSET.lock();
let end = bytes.0 + *offset;
if end < SCRATCH_LEN_BYTES {
let ptr = SCRATCH_HEAP[*offset..end].as_mut_ptr() as *mut u8 as *mut Opaque;
let ptr = SCRATCH_HEAP[*offset..end].as_mut_ptr() as *mut u8;
*offset = end;
NonNull::new(ptr).ok_or_else(|| AllocErr)
} else {
Expand Down
6 changes: 3 additions & 3 deletions wee_alloc/src/imp_unix.rs
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
use const_init::ConstInit;
use core::alloc::{AllocErr, Opaque};
use core::alloc::AllocErr;
use core::cell::UnsafeCell;
use core::ptr::NonNull;
use libc;
use memory_units::{Bytes, Pages};

pub(crate) fn alloc_pages(pages: Pages) -> Result<NonNull<Opaque>, AllocErr> {
pub(crate) fn alloc_pages(pages: Pages) -> Result<NonNull<u8>, AllocErr> {
unsafe {
let bytes: Bytes = pages.into();
let addr = libc::mmap(
Expand All@@ -19,7 +19,7 @@ pub(crate) fn alloc_pages(pages: Pages) -> Result<NonNull<Opaque>, AllocErr> {
if addr == libc::MAP_FAILED {
Err(AllocErr)
} else {
NonNull::new(addr as *mut Opaque).ok_or(AllocErr)
NonNull::new(addr as *mut u8).ok_or(AllocErr)
}
}
}
Expand Down
6 changes: 3 additions & 3 deletions wee_alloc/src/imp_wasm32.rs
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
use super::{assert_is_word_aligned, PAGE_SIZE, unchecked_unwrap};
use const_init::ConstInit;
use core::alloc::{AllocErr, Opaque};
use core::alloc::AllocErr;
use core::cell::UnsafeCell;
use core::ptr::NonNull;
use memory_units::Pages;
Expand All@@ -10,10 +10,10 @@ extern "C" {
fn grow_memory(pages: usize) -> i32;
}

pub(crate) unsafe fn alloc_pages(n: Pages) -> Result<NonNull<Opaque>, AllocErr> {
pub(crate) unsafe fn alloc_pages(n: Pages) -> Result<NonNull<u8>, AllocErr> {
let ptr = grow_memory(n.0);
if -1 != ptr {
let ptr = (ptr as usize * PAGE_SIZE.0) as *mut Opaque;
let ptr = (ptr as usize * PAGE_SIZE.0) as *mut u8;
assert_is_word_aligned(ptr as *mut u8);
Ok(unchecked_unwrap(NonNull::new(ptr)))
} else {
Expand Down
6 changes: 3 additions & 3 deletions wee_alloc/src/imp_windows.rs
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
use const_init::ConstInit;
use core::alloc::{AllocErr, Opaque};
use core::alloc::AllocErr;
use core::cell::UnsafeCell;
use core::ptr::NonNull;
use memory_units::{Bytes, Pages};
Expand All@@ -12,10 +12,10 @@ use winapi::um::synchapi::{CreateMutexW, ReleaseMutex, WaitForSingleObject};
use winapi::um::winbase::{WAIT_OBJECT_0, INFINITE};
use winapi::um::winnt::{HANDLE, MEM_COMMIT, PAGE_READWRITE};

pub(crate) fn alloc_pages(pages: Pages) -> Result<NonNull<Opaque>, AllocErr> {
pub(crate) fn alloc_pages(pages: Pages) -> Result<NonNull<u8>, AllocErr> {
let bytes: Bytes = pages.into();
let ptr = unsafe { VirtualAlloc(NULL, bytes.0, MEM_COMMIT, PAGE_READWRITE) };
NonNull::new(ptr as *mut Opaque).ok_or(AllocErr)
NonNull::new(ptr as *mut u8).ok_or(AllocErr)
}

// Align to the cache line size on an i7 to avoid false sharing.
Expand Down
57 changes: 29 additions & 28 deletions wee_alloc/src/lib.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -50,12 +50,9 @@ infrastructure. Nevertheless, `wee_alloc` is also usable with `std`.
// We aren't using the standard library.
#![no_std]

// Required to replace the global allocator.
#![feature(global_allocator)]

// Required to use the `alloc` crate and its types, the `abort` intrinsic, and a
// custom panic handler.
#![feature(alloc, core_intrinsics, lang_items)]
#![feature(alloc, core_intrinsics, panic_implementation, lang_items)]

extern crate alloc;
extern crate wee_alloc;
Expand All@@ -64,18 +61,22 @@ extern crate wee_alloc;
#[global_allocator]
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;

// Need to provide a tiny `panic_fmt` lang-item implementation for `#![no_std]`.
// This implementation will translate panics into traps in the resulting
// WebAssembly.
#[lang = "panic_fmt"]
extern "C" fn panic_fmt(
_args: ::core::fmt::Arguments,
_file: &'static str,
_line: u32
) -> ! {
use core::intrinsics;
// Need to provide a tiny `panic` implementation for `#![no_std]`.
// This translates into an `unreachable` instruction that will
// raise a `trap` the WebAssembly execution if we panic at runtime.
#[panic_implementation]
fn panic(_info: &::core::panic::PanicInfo) -> ! {
unsafe {
::core::intrinsics::abort();
}
}

// Need to provide a tiny `oom` lang-item implementation for
// `#![no_std]`.
#[lang = "oom"]
extern "C" fn oom() -> ! {
unsafe {
intrinsics::abort();
::core::intrinsics::abort();
}
}

Expand DownExpand Up@@ -222,7 +223,7 @@ for hacking!

#![deny(missing_docs)]
#![cfg_attr(not(feature = "use_std_for_test_debugging"), no_std)]
#![feature(alloc, allocator_api, core_intrinsics, global_allocator)]
#![feature(alloc, allocator_api, core_intrinsics)]
#![cfg_attr(target_arch = "wasm32", feature(link_llvm_intrinsics))]

#[macro_use]
Expand DownExpand Up@@ -269,7 +270,7 @@ mod neighbors;
mod size_classes;

use const_init::ConstInit;
use core::alloc::{Alloc, AllocErr, GlobalAlloc, Layout, Opaque};
use core::alloc::{Alloc, AllocErr, GlobalAlloc, Layout};
use core::cell::Cell;
use core::cmp;
use core::marker::Sync;
Expand DownExpand Up@@ -520,7 +521,7 @@ impl<'a> FreeCell<'a> {
}

unsafe fn from_uninitialized(
raw: NonNull<Opaque>,
raw: NonNull<u8>,
size: Bytes,
next_free: Option<*const FreeCell<'a>>,
policy: &AllocPolicy<'a>,
Expand DownExpand Up@@ -586,7 +587,7 @@ impl<'a> FreeCell<'a> {
let split_cell_head = split_and_aligned - size_of::<CellHeader>().0;
let split_cell = unsafe {
&*FreeCell::from_uninitialized(
unchecked_unwrap(NonNull::new(split_cell_head as *mut Opaque)),
unchecked_unwrap(NonNull::new(split_cell_head as *mut u8)),
Bytes(next - split_cell_head) - size_of::<CellHeader>(),
None,
policy,
Expand DownExpand Up@@ -951,7 +952,7 @@ unsafe fn alloc_first_fit<'a>(
align: Bytes,
head: &Cell<*const FreeCell<'a>>,
policy: &AllocPolicy<'a>,
) -> Result<NonNull<Opaque>, AllocErr> {
) -> Result<NonNull<u8>, AllocErr> {
extra_assert!(size.0 > 0);

walk_free_list(head, policy, |previous, current| {
Expand All@@ -960,7 +961,7 @@ unsafe fn alloc_first_fit<'a>(
if let Some(allocated) = current.try_alloc(previous, size, align, policy) {
assert_aligned_to(allocated.data(), align);
return Some(unchecked_unwrap(
NonNull::new(allocated.data() as *mut Opaque),
NonNull::new(allocated.data() as *mut u8),
));
}

Expand All@@ -973,7 +974,7 @@ unsafe fn alloc_with_refill<'a, 'b>(
align: Bytes,
head: &'b Cell<*const FreeCell<'a>>,
policy: &AllocPolicy<'a>,
) -> Result<NonNull<Opaque>, AllocErr> {
) -> Result<NonNull<u8>, AllocErr> {
if let Ok(result) = alloc_first_fit(size, align, head, policy) {
return Ok(result);
}
Expand DownExpand Up@@ -1072,7 +1073,7 @@ unsafe impl<'a, 'b> Alloc for &'b WeeAlloc<'a>
where
'a: 'b,
{
unsafe fn alloc(&mut self, layout: Layout) -> Result<NonNull<Opaque>, AllocErr> {
unsafe fn alloc(&mut self, layout: Layout) -> Result<NonNull<u8>, AllocErr> {
let size = Bytes(layout.size());
let align = if layout.align() == 0 {
Bytes(1)
Expand All@@ -1084,7 +1085,7 @@ where
// Ensure that our made up pointer is properly aligned by using the
// alignment as the pointer.
extra_assert!(align.0 > 0);
return Ok(NonNull::new_unchecked(align.0 as *mut Opaque));
return Ok(NonNull::new_unchecked(align.0 as *mut u8));
}

let size: Words = size.round_up_to();
Expand All@@ -1095,7 +1096,7 @@ where
})
}

unsafe fn dealloc(&mut self, ptr: NonNull<Opaque>, layout: Layout) {
unsafe fn dealloc(&mut self, ptr: NonNull<u8>, layout: Layout) {
let size = Bytes(layout.size());
if size.0 == 0 {
return;
Expand DownExpand Up@@ -1185,15 +1186,15 @@ where
}

unsafe impl GlobalAlloc for WeeAlloc<'static> {
unsafe fn alloc(&self, layout: Layout) -> *mut Opaque {
unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
let mut me = self;
match Alloc::alloc(&mut me, layout) {
Ok(ptr) => ptr.as_ptr(),
Err(AllocErr) => 0 as *mut Opaque,
Err(AllocErr) => 0 as *mut u8,
}
}

unsafe fn dealloc(&self, ptr: *mut Opaque, layout: Layout) {
unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) {
if let Some(ptr) = NonNull::new(ptr) {
let mut me = self;
Alloc::dealloc(&mut me, ptr, layout);
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Aug 25, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 16 additions & 15 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -50,12 +50,9 @@ infrastructure. Nevertheless, `wee_alloc` is also usable with `std`.
// We aren't using the standard library.
#![no_std]

// Required to replace the global allocator.
#![feature(global_allocator)]

// Required to use the `alloc` crate and its types, the `abort` intrinsic, and a
// custom panic handler.
#![feature(alloc, core_intrinsics, lang_items)]
#![feature(alloc, core_intrinsics, panic_implementation, lang_items)]

extern crate alloc;
extern crate wee_alloc;
Expand All@@ -64,18 +61,22 @@ extern crate wee_alloc;
#[global_allocator]
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;

// Need to provide a tiny `panic_fmt` lang-item implementation for `#![no_std]`.
// This implementation will translate panics into traps in the resulting
// WebAssembly.
#[lang = "panic_fmt"]
extern "C" fn panic_fmt(
_args: ::core::fmt::Arguments,
_file: &'static str,
_line: u32
) -> ! {
use core::intrinsics;
// Need to provide a tiny `panic` implementation for `#![no_std]`.
// This translates into an `unreachable` instruction that will
// raise a `trap` the WebAssembly execution if we panic at runtime.
#[panic_implementation]
fn panic(_info: &::core::panic::PanicInfo) -> ! {
unsafe {
::core::intrinsics::abort();
}
}

// Need to provide a tiny `oom` lang-item implementation for
// `#![no_std]`.
#[lang = "oom"]
extern "C" fn oom() -> ! {
unsafe {
intrinsics::abort();
::core::intrinsics::abort();
}
}

Expand Down
10 changes: 5 additions & 5 deletions example/src/lib.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,7 +6,7 @@
// We aren't using the standard library.
#![no_std]
// Replacing the allocator and using the `alloc` crate are still unstable.
#![feature(alloc, core_intrinsics, global_allocator, lang_items)]
#![feature(alloc, core_intrinsics, panic_implementation, lang_items)]

extern crate alloc;
extern crate wee_alloc;
Expand All@@ -15,11 +15,11 @@ extern crate wee_alloc;
#[global_allocator]
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;

// Need to provide a tiny `panic_fmt` lang-item implementation for
// `#![no_std]`. This translates into an `unreachable` instruction that will
// Need to provide a tiny `panic` implementation for `#![no_std]`.
// This translates into an `unreachable` instruction that will
// raise a `trap` the WebAssembly execution if we panic at runtime.
#[lang = "panic_fmt"]
extern "C" fn panic_fmt(_args: ::core::fmt::Arguments, _file: &'static str, _line: u32) -> ! {
#[panic_implementation]
fn panic(_info: &::core::panic::PanicInfo) -> ! {
unsafe {
::core::intrinsics::abort();
}
Expand Down
5 changes: 2 additions & 3 deletions test/src/lib.rs
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
#![feature(alloc, allocator_api)]

extern crate alloc;
extern crate histo;
#[macro_use]
extern crate quickcheck;
Expand All@@ -9,7 +8,7 @@ extern crate cfg_if;
extern crate rand;
extern crate wee_alloc;

use alloc::heap::{Alloc, Layout};
use std::alloc::{Alloc, Layout};
use quickcheck::{Arbitrary, Gen};
use std::f64;
use std::fs;
Expand DownExpand Up@@ -374,7 +373,7 @@ quickcheck! {
let align = ALIGNS[align % ALIGNS.len()];

let mut w = &wee_alloc::WeeAlloc::INIT;
let layout = alloc::heap::Layout::from_size_align(size, align).unwrap();
let layout = Layout::from_size_align(size, align).unwrap();
let _ = unsafe { w.alloc(layout) };
}
}
Expand Down
2 changes: 0 additions & 2 deletions test/tests/global.rs
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
// Adopted from
// https://github.com/alexcrichton/dlmalloc-rs/blob/master/tests/global.rs

#![feature(global_allocator)]

extern crate wee_alloc;

use std::collections::HashMap;
Expand Down
6 changes: 3 additions & 3 deletions wee_alloc/src/imp_static_array.rs
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
use const_init::ConstInit;
use core::alloc::{AllocErr, Opaque};
use core::alloc::AllocErr;
#[cfg(feature = "extra_assertions")]
use core::cell::Cell;
use core::ptr::NonNull;
Expand All@@ -10,12 +10,12 @@ const SCRATCH_LEN_BYTES: usize = include!(concat!(env!("OUT_DIR"), "/wee_alloc_s
static mut SCRATCH_HEAP: [u8; SCRATCH_LEN_BYTES] = [0; SCRATCH_LEN_BYTES];
static mut OFFSET: Mutex<usize> = Mutex::new(0);

pub(crate) unsafe fn alloc_pages(pages: Pages) -> Result<NonNull<Opaque>, AllocErr> {
pub(crate) unsafe fn alloc_pages(pages: Pages) -> Result<NonNull<u8>, AllocErr> {
let bytes: Bytes = pages.into();
let mut offset = OFFSET.lock();
let end = bytes.0 + *offset;
if end < SCRATCH_LEN_BYTES {
let ptr = SCRATCH_HEAP[*offset..end].as_mut_ptr() as *mut u8 as *mut Opaque;
let ptr = SCRATCH_HEAP[*offset..end].as_mut_ptr() as *mut u8;
*offset = end;
NonNull::new(ptr).ok_or_else(|| AllocErr)
} else {
Expand Down
6 changes: 3 additions & 3 deletions wee_alloc/src/imp_unix.rs
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
use const_init::ConstInit;
use core::alloc::{AllocErr, Opaque};
use core::alloc::AllocErr;
use core::cell::UnsafeCell;
use core::ptr::NonNull;
use libc;
use memory_units::{Bytes, Pages};

pub(crate) fn alloc_pages(pages: Pages) -> Result<NonNull<Opaque>, AllocErr> {
pub(crate) fn alloc_pages(pages: Pages) -> Result<NonNull<u8>, AllocErr> {
unsafe {
let bytes: Bytes = pages.into();
let addr = libc::mmap(
Expand All@@ -19,7 +19,7 @@ pub(crate) fn alloc_pages(pages: Pages) -> Result<NonNull<Opaque>, AllocErr> {
if addr == libc::MAP_FAILED {
Err(AllocErr)
} else {
NonNull::new(addr as *mut Opaque).ok_or(AllocErr)
NonNull::new(addr as *mut u8).ok_or(AllocErr)
}
}
}
Expand Down
6 changes: 3 additions & 3 deletions wee_alloc/src/imp_wasm32.rs
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
use super::{assert_is_word_aligned, PAGE_SIZE, unchecked_unwrap};
use const_init::ConstInit;
use core::alloc::{AllocErr, Opaque};
use core::alloc::AllocErr;
use core::cell::UnsafeCell;
use core::ptr::NonNull;
use memory_units::Pages;
Expand All@@ -10,10 +10,10 @@ extern "C" {
fn grow_memory(pages: usize) -> i32;
}

pub(crate) unsafe fn alloc_pages(n: Pages) -> Result<NonNull<Opaque>, AllocErr> {
pub(crate) unsafe fn alloc_pages(n: Pages) -> Result<NonNull<u8>, AllocErr> {
let ptr = grow_memory(n.0);
if -1 != ptr {
let ptr = (ptr as usize * PAGE_SIZE.0) as *mut Opaque;
let ptr = (ptr as usize * PAGE_SIZE.0) as *mut u8;
assert_is_word_aligned(ptr as *mut u8);
Ok(unchecked_unwrap(NonNull::new(ptr)))
} else {
Expand Down
6 changes: 3 additions & 3 deletions wee_alloc/src/imp_windows.rs
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
use const_init::ConstInit;
use core::alloc::{AllocErr, Opaque};
use core::alloc::AllocErr;
use core::cell::UnsafeCell;
use core::ptr::NonNull;
use memory_units::{Bytes, Pages};
Expand All@@ -12,10 +12,10 @@ use winapi::um::synchapi::{CreateMutexW, ReleaseMutex, WaitForSingleObject};
use winapi::um::winbase::{WAIT_OBJECT_0, INFINITE};
use winapi::um::winnt::{HANDLE, MEM_COMMIT, PAGE_READWRITE};

pub(crate) fn alloc_pages(pages: Pages) -> Result<NonNull<Opaque>, AllocErr> {
pub(crate) fn alloc_pages(pages: Pages) -> Result<NonNull<u8>, AllocErr> {
let bytes: Bytes = pages.into();
let ptr = unsafe { VirtualAlloc(NULL, bytes.0, MEM_COMMIT, PAGE_READWRITE) };
NonNull::new(ptr as *mut Opaque).ok_or(AllocErr)
NonNull::new(ptr as *mut u8).ok_or(AllocErr)
}

// Align to the cache line size on an i7 to avoid false sharing.
Expand Down
57 changes: 29 additions & 28 deletions wee_alloc/src/lib.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -50,12 +50,9 @@ infrastructure. Nevertheless, `wee_alloc` is also usable with `std`.
// We aren't using the standard library.
#![no_std]

// Required to replace the global allocator.
#![feature(global_allocator)]

// Required to use the `alloc` crate and its types, the `abort` intrinsic, and a
// custom panic handler.
#![feature(alloc, core_intrinsics, lang_items)]
#![feature(alloc, core_intrinsics, panic_implementation, lang_items)]

extern crate alloc;
extern crate wee_alloc;
Expand All@@ -64,18 +61,22 @@ extern crate wee_alloc;
#[global_allocator]
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;

// Need to provide a tiny `panic_fmt` lang-item implementation for `#![no_std]`.
// This implementation will translate panics into traps in the resulting
// WebAssembly.
#[lang = "panic_fmt"]
extern "C" fn panic_fmt(
_args: ::core::fmt::Arguments,
_file: &'static str,
_line: u32
) -> ! {
use core::intrinsics;
// Need to provide a tiny `panic` implementation for `#![no_std]`.
// This translates into an `unreachable` instruction that will
// raise a `trap` the WebAssembly execution if we panic at runtime.
#[panic_implementation]
fn panic(_info: &::core::panic::PanicInfo) -> ! {
unsafe {
::core::intrinsics::abort();
}
}

// Need to provide a tiny `oom` lang-item implementation for
// `#![no_std]`.
#[lang = "oom"]
extern "C" fn oom() -> ! {
unsafe {
intrinsics::abort();
::core::intrinsics::abort();
}
}

Expand DownExpand Up@@ -222,7 +223,7 @@ for hacking!

#![deny(missing_docs)]
#![cfg_attr(not(feature = "use_std_for_test_debugging"), no_std)]
#![feature(alloc, allocator_api, core_intrinsics, global_allocator)]
#![feature(alloc, allocator_api, core_intrinsics)]
#![cfg_attr(target_arch = "wasm32", feature(link_llvm_intrinsics))]

#[macro_use]
Expand DownExpand Up@@ -269,7 +270,7 @@ mod neighbors;
mod size_classes;

use const_init::ConstInit;
use core::alloc::{Alloc, AllocErr, GlobalAlloc, Layout, Opaque};
use core::alloc::{Alloc, AllocErr, GlobalAlloc, Layout};
use core::cell::Cell;
use core::cmp;
use core::marker::Sync;
Expand DownExpand Up@@ -520,7 +521,7 @@ impl<'a> FreeCell<'a> {
}

unsafe fn from_uninitialized(
raw: NonNull<Opaque>,
raw: NonNull<u8>,
size: Bytes,
next_free: Option<*const FreeCell<'a>>,
policy: &AllocPolicy<'a>,
Expand DownExpand Up@@ -586,7 +587,7 @@ impl<'a> FreeCell<'a> {
let split_cell_head = split_and_aligned - size_of::<CellHeader>().0;
let split_cell = unsafe {
&*FreeCell::from_uninitialized(
unchecked_unwrap(NonNull::new(split_cell_head as *mut Opaque)),
unchecked_unwrap(NonNull::new(split_cell_head as *mut u8)),
Bytes(next - split_cell_head) - size_of::<CellHeader>(),
None,
policy,
Expand DownExpand Up@@ -951,7 +952,7 @@ unsafe fn alloc_first_fit<'a>(
align: Bytes,
head: &Cell<*const FreeCell<'a>>,
policy: &AllocPolicy<'a>,
) -> Result<NonNull<Opaque>, AllocErr> {
) -> Result<NonNull<u8>, AllocErr> {
extra_assert!(size.0 > 0);

walk_free_list(head, policy, |previous, current| {
Expand All@@ -960,7 +961,7 @@ unsafe fn alloc_first_fit<'a>(
if let Some(allocated) = current.try_alloc(previous, size, align, policy) {
assert_aligned_to(allocated.data(), align);
return Some(unchecked_unwrap(
NonNull::new(allocated.data() as *mut Opaque),
NonNull::new(allocated.data() as *mut u8),
));
}

Expand All@@ -973,7 +974,7 @@ unsafe fn alloc_with_refill<'a, 'b>(
align: Bytes,
head: &'b Cell<*const FreeCell<'a>>,
policy: &AllocPolicy<'a>,
) -> Result<NonNull<Opaque>, AllocErr> {
) -> Result<NonNull<u8>, AllocErr> {
if let Ok(result) = alloc_first_fit(size, align, head, policy) {
return Ok(result);
}
Expand DownExpand Up@@ -1072,7 +1073,7 @@ unsafe impl<'a, 'b> Alloc for &'b WeeAlloc<'a>
where
'a: 'b,
{
unsafe fn alloc(&mut self, layout: Layout) -> Result<NonNull<Opaque>, AllocErr> {
unsafe fn alloc(&mut self, layout: Layout) -> Result<NonNull<u8>, AllocErr> {
let size = Bytes(layout.size());
let align = if layout.align() == 0 {
Bytes(1)
Expand All@@ -1084,7 +1085,7 @@ where
// Ensure that our made up pointer is properly aligned by using the
// alignment as the pointer.
extra_assert!(align.0 > 0);
return Ok(NonNull::new_unchecked(align.0 as *mut Opaque));
return Ok(NonNull::new_unchecked(align.0 as *mut u8));
}

let size: Words = size.round_up_to();
Expand All@@ -1095,7 +1096,7 @@ where
})
}

unsafe fn dealloc(&mut self, ptr: NonNull<Opaque>, layout: Layout) {
unsafe fn dealloc(&mut self, ptr: NonNull<u8>, layout: Layout) {
let size = Bytes(layout.size());
if size.0 == 0 {
return;
Expand DownExpand Up@@ -1185,15 +1186,15 @@ where
}

unsafe impl GlobalAlloc for WeeAlloc<'static> {
unsafe fn alloc(&self, layout: Layout) -> *mut Opaque {
unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
let mut me = self;
match Alloc::alloc(&mut me, layout) {
Ok(ptr) => ptr.as_ptr(),
Err(AllocErr) => 0 as *mut Opaque,
Err(AllocErr) => 0 as *mut u8,
}
}

unsafe fn dealloc(&self, ptr: *mut Opaque, layout: Layout) {
unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) {
if let Some(ptr) = NonNull::new(ptr) {
let mut me = self;
Alloc::dealloc(&mut me, ptr, layout);
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
This repository was archived by the owner on Aug 25, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 16 additions & 15 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -50,12 +50,9 @@ infrastructure. Nevertheless, `wee_alloc` is also usable with `std`.
// We aren't using the standard library.
#![no_std]

// Required to replace the global allocator.
#![feature(global_allocator)]

// Required to use the `alloc` crate and its types, the `abort` intrinsic, and a
// custom panic handler.
#![feature(alloc, core_intrinsics, lang_items)]
#![feature(alloc, core_intrinsics, panic_implementation, lang_items)]

extern crate alloc;
extern crate wee_alloc;
Expand All@@ -64,18 +61,22 @@ extern crate wee_alloc;
#[global_allocator]
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;

// Need to provide a tiny `panic_fmt` lang-item implementation for `#![no_std]`.
// This implementation will translate panics into traps in the resulting
// WebAssembly.
#[lang = "panic_fmt"]
extern "C" fn panic_fmt(
_args: ::core::fmt::Arguments,
_file: &'static str,
_line: u32
) -> ! {
use core::intrinsics;
// Need to provide a tiny `panic` implementation for `#![no_std]`.
// This translates into an `unreachable` instruction that will
// raise a `trap` the WebAssembly execution if we panic at runtime.
#[panic_implementation]
fn panic(_info: &::core::panic::PanicInfo) -> ! {
unsafe {
::core::intrinsics::abort();
}
}

// Need to provide a tiny `oom` lang-item implementation for
// `#![no_std]`.
#[lang = "oom"]
extern "C" fn oom() -> ! {
unsafe {
intrinsics::abort();
::core::intrinsics::abort();
}
}

Expand Down
10 changes: 5 additions & 5 deletions example/src/lib.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,7 +6,7 @@
// We aren't using the standard library.
#![no_std]
// Replacing the allocator and using the `alloc` crate are still unstable.
#![feature(alloc, core_intrinsics, global_allocator, lang_items)]
#![feature(alloc, core_intrinsics, panic_implementation, lang_items)]

extern crate alloc;
extern crate wee_alloc;
Expand All@@ -15,11 +15,11 @@ extern crate wee_alloc;
#[global_allocator]
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;

// Need to provide a tiny `panic_fmt` lang-item implementation for
// `#![no_std]`. This translates into an `unreachable` instruction that will
// Need to provide a tiny `panic` implementation for `#![no_std]`.
// This translates into an `unreachable` instruction that will
// raise a `trap` the WebAssembly execution if we panic at runtime.
#[lang = "panic_fmt"]
extern "C" fn panic_fmt(_args: ::core::fmt::Arguments, _file: &'static str, _line: u32) -> ! {
#[panic_implementation]
fn panic(_info: &::core::panic::PanicInfo) -> ! {
unsafe {
::core::intrinsics::abort();
}
Expand Down
5 changes: 2 additions & 3 deletions test/src/lib.rs
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
#![feature(alloc, allocator_api)]

extern crate alloc;
extern crate histo;
#[macro_use]
extern crate quickcheck;
Expand All@@ -9,7 +8,7 @@ extern crate cfg_if;
extern crate rand;
extern crate wee_alloc;

use alloc::heap::{Alloc, Layout};
use std::alloc::{Alloc, Layout};
use quickcheck::{Arbitrary, Gen};
use std::f64;
use std::fs;
Expand DownExpand Up@@ -374,7 +373,7 @@ quickcheck! {
let align = ALIGNS[align % ALIGNS.len()];

let mut w = &wee_alloc::WeeAlloc::INIT;
let layout = alloc::heap::Layout::from_size_align(size, align).unwrap();
let layout = Layout::from_size_align(size, align).unwrap();
let _ = unsafe { w.alloc(layout) };
}
}
Expand Down
2 changes: 0 additions & 2 deletions test/tests/global.rs
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
// Adopted from
// https://github.com/alexcrichton/dlmalloc-rs/blob/master/tests/global.rs

#![feature(global_allocator)]

extern crate wee_alloc;

use std::collections::HashMap;
Expand Down
6 changes: 3 additions & 3 deletions wee_alloc/src/imp_static_array.rs
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
use const_init::ConstInit;
use core::alloc::{AllocErr, Opaque};
use core::alloc::AllocErr;
#[cfg(feature = "extra_assertions")]
use core::cell::Cell;
use core::ptr::NonNull;
Expand All@@ -10,12 +10,12 @@ const SCRATCH_LEN_BYTES: usize = include!(concat!(env!("OUT_DIR"), "/wee_alloc_s
static mut SCRATCH_HEAP: [u8; SCRATCH_LEN_BYTES] = [0; SCRATCH_LEN_BYTES];
static mut OFFSET: Mutex<usize> = Mutex::new(0);

pub(crate) unsafe fn alloc_pages(pages: Pages) -> Result<NonNull<Opaque>, AllocErr> {
pub(crate) unsafe fn alloc_pages(pages: Pages) -> Result<NonNull<u8>, AllocErr> {
let bytes: Bytes = pages.into();
let mut offset = OFFSET.lock();
let end = bytes.0 + *offset;
if end < SCRATCH_LEN_BYTES {
let ptr = SCRATCH_HEAP[*offset..end].as_mut_ptr() as *mut u8 as *mut Opaque;
let ptr = SCRATCH_HEAP[*offset..end].as_mut_ptr() as *mut u8;
*offset = end;
NonNull::new(ptr).ok_or_else(|| AllocErr)
} else {
Expand Down
6 changes: 3 additions & 3 deletions wee_alloc/src/imp_unix.rs
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
use const_init::ConstInit;
use core::alloc::{AllocErr, Opaque};
use core::alloc::AllocErr;
use core::cell::UnsafeCell;
use core::ptr::NonNull;
use libc;
use memory_units::{Bytes, Pages};

pub(crate) fn alloc_pages(pages: Pages) -> Result<NonNull<Opaque>, AllocErr> {
pub(crate) fn alloc_pages(pages: Pages) -> Result<NonNull<u8>, AllocErr> {
unsafe {
let bytes: Bytes = pages.into();
let addr = libc::mmap(
Expand All@@ -19,7 +19,7 @@ pub(crate) fn alloc_pages(pages: Pages) -> Result<NonNull<Opaque>, AllocErr> {
if addr == libc::MAP_FAILED {
Err(AllocErr)
} else {
NonNull::new(addr as *mut Opaque).ok_or(AllocErr)
NonNull::new(addr as *mut u8).ok_or(AllocErr)
}
}
}
Expand Down
6 changes: 3 additions & 3 deletions wee_alloc/src/imp_wasm32.rs
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
use super::{assert_is_word_aligned, PAGE_SIZE, unchecked_unwrap};
use const_init::ConstInit;
use core::alloc::{AllocErr, Opaque};
use core::alloc::AllocErr;
use core::cell::UnsafeCell;
use core::ptr::NonNull;
use memory_units::Pages;
Expand All@@ -10,10 +10,10 @@ extern "C" {
fn grow_memory(pages: usize) -> i32;
}

pub(crate) unsafe fn alloc_pages(n: Pages) -> Result<NonNull<Opaque>, AllocErr> {
pub(crate) unsafe fn alloc_pages(n: Pages) -> Result<NonNull<u8>, AllocErr> {
let ptr = grow_memory(n.0);
if -1 != ptr {
let ptr = (ptr as usize * PAGE_SIZE.0) as *mut Opaque;
let ptr = (ptr as usize * PAGE_SIZE.0) as *mut u8;
assert_is_word_aligned(ptr as *mut u8);
Ok(unchecked_unwrap(NonNull::new(ptr)))
} else {
Expand Down
6 changes: 3 additions & 3 deletions wee_alloc/src/imp_windows.rs
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
use const_init::ConstInit;
use core::alloc::{AllocErr, Opaque};
use core::alloc::AllocErr;
use core::cell::UnsafeCell;
use core::ptr::NonNull;
use memory_units::{Bytes, Pages};
Expand All@@ -12,10 +12,10 @@ use winapi::um::synchapi::{CreateMutexW, ReleaseMutex, WaitForSingleObject};
use winapi::um::winbase::{WAIT_OBJECT_0, INFINITE};
use winapi::um::winnt::{HANDLE, MEM_COMMIT, PAGE_READWRITE};

pub(crate) fn alloc_pages(pages: Pages) -> Result<NonNull<Opaque>, AllocErr> {
pub(crate) fn alloc_pages(pages: Pages) -> Result<NonNull<u8>, AllocErr> {
let bytes: Bytes = pages.into();
let ptr = unsafe { VirtualAlloc(NULL, bytes.0, MEM_COMMIT, PAGE_READWRITE) };
NonNull::new(ptr as *mut Opaque).ok_or(AllocErr)
NonNull::new(ptr as *mut u8).ok_or(AllocErr)
}

// Align to the cache line size on an i7 to avoid false sharing.
Expand Down
57 changes: 29 additions & 28 deletions wee_alloc/src/lib.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -50,12 +50,9 @@ infrastructure. Nevertheless, `wee_alloc` is also usable with `std`.
// We aren't using the standard library.
#![no_std]

// Required to replace the global allocator.
#![feature(global_allocator)]

// Required to use the `alloc` crate and its types, the `abort` intrinsic, and a
// custom panic handler.
#![feature(alloc, core_intrinsics, lang_items)]
#![feature(alloc, core_intrinsics, panic_implementation, lang_items)]

extern crate alloc;
extern crate wee_alloc;
Expand All@@ -64,18 +61,22 @@ extern crate wee_alloc;
#[global_allocator]
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;

// Need to provide a tiny `panic_fmt` lang-item implementation for `#![no_std]`.
// This implementation will translate panics into traps in the resulting
// WebAssembly.
#[lang = "panic_fmt"]
extern "C" fn panic_fmt(
_args: ::core::fmt::Arguments,
_file: &'static str,
_line: u32
) -> ! {
use core::intrinsics;
// Need to provide a tiny `panic` implementation for `#![no_std]`.
// This translates into an `unreachable` instruction that will
// raise a `trap` the WebAssembly execution if we panic at runtime.
#[panic_implementation]
fn panic(_info: &::core::panic::PanicInfo) -> ! {
unsafe {
::core::intrinsics::abort();
}
}

// Need to provide a tiny `oom` lang-item implementation for
// `#![no_std]`.
#[lang = "oom"]
extern "C" fn oom() -> ! {
unsafe {
intrinsics::abort();
::core::intrinsics::abort();
}
}

Expand DownExpand Up@@ -222,7 +223,7 @@ for hacking!

#![deny(missing_docs)]
#![cfg_attr(not(feature = "use_std_for_test_debugging"), no_std)]
#![feature(alloc, allocator_api, core_intrinsics, global_allocator)]
#![feature(alloc, allocator_api, core_intrinsics)]
#![cfg_attr(target_arch = "wasm32", feature(link_llvm_intrinsics))]

#[macro_use]
Expand DownExpand Up@@ -269,7 +270,7 @@ mod neighbors;
mod size_classes;

use const_init::ConstInit;
use core::alloc::{Alloc, AllocErr, GlobalAlloc, Layout, Opaque};
use core::alloc::{Alloc, AllocErr, GlobalAlloc, Layout};
use core::cell::Cell;
use core::cmp;
use core::marker::Sync;
Expand DownExpand Up@@ -520,7 +521,7 @@ impl<'a> FreeCell<'a> {
}

unsafe fn from_uninitialized(
raw: NonNull<Opaque>,
raw: NonNull<u8>,
size: Bytes,
next_free: Option<*const FreeCell<'a>>,
policy: &AllocPolicy<'a>,
Expand DownExpand Up@@ -586,7 +587,7 @@ impl<'a> FreeCell<'a> {
let split_cell_head = split_and_aligned - size_of::<CellHeader>().0;
let split_cell = unsafe {
&*FreeCell::from_uninitialized(
unchecked_unwrap(NonNull::new(split_cell_head as *mut Opaque)),
unchecked_unwrap(NonNull::new(split_cell_head as *mut u8)),
Bytes(next - split_cell_head) - size_of::<CellHeader>(),
None,
policy,
Expand DownExpand Up@@ -951,7 +952,7 @@ unsafe fn alloc_first_fit<'a>(
align: Bytes,
head: &Cell<*const FreeCell<'a>>,
policy: &AllocPolicy<'a>,
) -> Result<NonNull<Opaque>, AllocErr> {
) -> Result<NonNull<u8>, AllocErr> {
extra_assert!(size.0 > 0);

walk_free_list(head, policy, |previous, current| {
Expand All@@ -960,7 +961,7 @@ unsafe fn alloc_first_fit<'a>(
if let Some(allocated) = current.try_alloc(previous, size, align, policy) {
assert_aligned_to(allocated.data(), align);
return Some(unchecked_unwrap(
NonNull::new(allocated.data() as *mut Opaque),
NonNull::new(allocated.data() as *mut u8),
));
}

Expand All@@ -973,7 +974,7 @@ unsafe fn alloc_with_refill<'a, 'b>(
align: Bytes,
head: &'b Cell<*const FreeCell<'a>>,
policy: &AllocPolicy<'a>,
) -> Result<NonNull<Opaque>, AllocErr> {
) -> Result<NonNull<u8>, AllocErr> {
if let Ok(result) = alloc_first_fit(size, align, head, policy) {
return Ok(result);
}
Expand DownExpand Up@@ -1072,7 +1073,7 @@ unsafe impl<'a, 'b> Alloc for &'b WeeAlloc<'a>
where
'a: 'b,
{
unsafe fn alloc(&mut self, layout: Layout) -> Result<NonNull<Opaque>, AllocErr> {
unsafe fn alloc(&mut self, layout: Layout) -> Result<NonNull<u8>, AllocErr> {
let size = Bytes(layout.size());
let align = if layout.align() == 0 {
Bytes(1)
Expand All@@ -1084,7 +1085,7 @@ where
// Ensure that our made up pointer is properly aligned by using the
// alignment as the pointer.
extra_assert!(align.0 > 0);
return Ok(NonNull::new_unchecked(align.0 as *mut Opaque));
return Ok(NonNull::new_unchecked(align.0 as *mut u8));
}

let size: Words = size.round_up_to();
Expand All@@ -1095,7 +1096,7 @@ where
})
}

unsafe fn dealloc(&mut self, ptr: NonNull<Opaque>, layout: Layout) {
unsafe fn dealloc(&mut self, ptr: NonNull<u8>, layout: Layout) {
let size = Bytes(layout.size());
if size.0 == 0 {
return;
Expand DownExpand Up@@ -1185,15 +1186,15 @@ where
}

unsafe impl GlobalAlloc for WeeAlloc<'static> {
unsafe fn alloc(&self, layout: Layout) -> *mut Opaque {
unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
let mut me = self;
match Alloc::alloc(&mut me, layout) {
Ok(ptr) => ptr.as_ptr(),
Err(AllocErr) => 0 as *mut Opaque,
Err(AllocErr) => 0 as *mut u8,
}
}

unsafe fn dealloc(&self, ptr: *mut Opaque, layout: Layout) {
unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) {
if let Some(ptr) = NonNull::new(ptr) {
let mut me = self;
Alloc::dealloc(&mut me, ptr, layout);
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Aug 25, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 16 additions & 15 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -50,12 +50,9 @@ infrastructure. Nevertheless, `wee_alloc` is also usable with `std`.
// We aren't using the standard library.
#![no_std]

// Required to replace the global allocator.
#![feature(global_allocator)]

// Required to use the `alloc` crate and its types, the `abort` intrinsic, and a
// custom panic handler.
#![feature(alloc, core_intrinsics, lang_items)]
#![feature(alloc, core_intrinsics, panic_implementation, lang_items)]

extern crate alloc;
extern crate wee_alloc;
Expand All@@ -64,18 +61,22 @@ extern crate wee_alloc;
#[global_allocator]
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;

// Need to provide a tiny `panic_fmt` lang-item implementation for `#![no_std]`.
// This implementation will translate panics into traps in the resulting
// WebAssembly.
#[lang = "panic_fmt"]
extern "C" fn panic_fmt(
_args: ::core::fmt::Arguments,
_file: &'static str,
_line: u32
) -> ! {
use core::intrinsics;
// Need to provide a tiny `panic` implementation for `#![no_std]`.
// This translates into an `unreachable` instruction that will
// raise a `trap` the WebAssembly execution if we panic at runtime.
#[panic_implementation]
fn panic(_info: &::core::panic::PanicInfo) -> ! {
unsafe {
::core::intrinsics::abort();
}
}

// Need to provide a tiny `oom` lang-item implementation for
// `#![no_std]`.
#[lang = "oom"]
extern "C" fn oom() -> ! {
unsafe {
intrinsics::abort();
::core::intrinsics::abort();
}
}

Expand Down
10 changes: 5 additions & 5 deletions example/src/lib.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,7 +6,7 @@
// We aren't using the standard library.
#![no_std]
// Replacing the allocator and using the `alloc` crate are still unstable.
#![feature(alloc, core_intrinsics, global_allocator, lang_items)]
#![feature(alloc, core_intrinsics, panic_implementation, lang_items)]

extern crate alloc;
extern crate wee_alloc;
Expand All@@ -15,11 +15,11 @@ extern crate wee_alloc;
#[global_allocator]
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;

// Need to provide a tiny `panic_fmt` lang-item implementation for
// `#![no_std]`. This translates into an `unreachable` instruction that will
// Need to provide a tiny `panic` implementation for `#![no_std]`.
// This translates into an `unreachable` instruction that will
// raise a `trap` the WebAssembly execution if we panic at runtime.
#[lang = "panic_fmt"]
extern "C" fn panic_fmt(_args: ::core::fmt::Arguments, _file: &'static str, _line: u32) -> ! {
#[panic_implementation]
fn panic(_info: &::core::panic::PanicInfo) -> ! {
unsafe {
::core::intrinsics::abort();
}
Expand Down
5 changes: 2 additions & 3 deletions test/src/lib.rs
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
#![feature(alloc, allocator_api)]

extern crate alloc;
extern crate histo;
#[macro_use]
extern crate quickcheck;
Expand All@@ -9,7 +8,7 @@ extern crate cfg_if;
extern crate rand;
extern crate wee_alloc;

use alloc::heap::{Alloc, Layout};
use std::alloc::{Alloc, Layout};
use quickcheck::{Arbitrary, Gen};
use std::f64;
use std::fs;
Expand DownExpand Up@@ -374,7 +373,7 @@ quickcheck! {
let align = ALIGNS[align % ALIGNS.len()];

let mut w = &wee_alloc::WeeAlloc::INIT;
let layout = alloc::heap::Layout::from_size_align(size, align).unwrap();
let layout = Layout::from_size_align(size, align).unwrap();
let _ = unsafe { w.alloc(layout) };
}
}
Expand Down
2 changes: 0 additions & 2 deletions test/tests/global.rs
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
// Adopted from
// https://github.com/alexcrichton/dlmalloc-rs/blob/master/tests/global.rs

#![feature(global_allocator)]

extern crate wee_alloc;

use std::collections::HashMap;
Expand Down
6 changes: 3 additions & 3 deletions wee_alloc/src/imp_static_array.rs
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
use const_init::ConstInit;
use core::alloc::{AllocErr, Opaque};
use core::alloc::AllocErr;
#[cfg(feature = "extra_assertions")]
use core::cell::Cell;
use core::ptr::NonNull;
Expand All@@ -10,12 +10,12 @@ const SCRATCH_LEN_BYTES: usize = include!(concat!(env!("OUT_DIR"), "/wee_alloc_s
static mut SCRATCH_HEAP: [u8; SCRATCH_LEN_BYTES] = [0; SCRATCH_LEN_BYTES];
static mut OFFSET: Mutex<usize> = Mutex::new(0);

pub(crate) unsafe fn alloc_pages(pages: Pages) -> Result<NonNull<Opaque>, AllocErr> {
pub(crate) unsafe fn alloc_pages(pages: Pages) -> Result<NonNull<u8>, AllocErr> {
let bytes: Bytes = pages.into();
let mut offset = OFFSET.lock();
let end = bytes.0 + *offset;
if end < SCRATCH_LEN_BYTES {
let ptr = SCRATCH_HEAP[*offset..end].as_mut_ptr() as *mut u8 as *mut Opaque;
let ptr = SCRATCH_HEAP[*offset..end].as_mut_ptr() as *mut u8;
*offset = end;
NonNull::new(ptr).ok_or_else(|| AllocErr)
} else {
Expand Down
6 changes: 3 additions & 3 deletions wee_alloc/src/imp_unix.rs
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
use const_init::ConstInit;
use core::alloc::{AllocErr, Opaque};
use core::alloc::AllocErr;
use core::cell::UnsafeCell;
use core::ptr::NonNull;
use libc;
use memory_units::{Bytes, Pages};

pub(crate) fn alloc_pages(pages: Pages) -> Result<NonNull<Opaque>, AllocErr> {
pub(crate) fn alloc_pages(pages: Pages) -> Result<NonNull<u8>, AllocErr> {
unsafe {
let bytes: Bytes = pages.into();
let addr = libc::mmap(
Expand All@@ -19,7 +19,7 @@ pub(crate) fn alloc_pages(pages: Pages) -> Result<NonNull<Opaque>, AllocErr> {
if addr == libc::MAP_FAILED {
Err(AllocErr)
} else {
NonNull::new(addr as *mut Opaque).ok_or(AllocErr)
NonNull::new(addr as *mut u8).ok_or(AllocErr)
}
}
}
Expand Down
6 changes: 3 additions & 3 deletions wee_alloc/src/imp_wasm32.rs
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
use super::{assert_is_word_aligned, PAGE_SIZE, unchecked_unwrap};
use const_init::ConstInit;
use core::alloc::{AllocErr, Opaque};
use core::alloc::AllocErr;
use core::cell::UnsafeCell;
use core::ptr::NonNull;
use memory_units::Pages;
Expand All@@ -10,10 +10,10 @@ extern "C" {
fn grow_memory(pages: usize) -> i32;
}

pub(crate) unsafe fn alloc_pages(n: Pages) -> Result<NonNull<Opaque>, AllocErr> {
pub(crate) unsafe fn alloc_pages(n: Pages) -> Result<NonNull<u8>, AllocErr> {
let ptr = grow_memory(n.0);
if -1 != ptr {
let ptr = (ptr as usize * PAGE_SIZE.0) as *mut Opaque;
let ptr = (ptr as usize * PAGE_SIZE.0) as *mut u8;
assert_is_word_aligned(ptr as *mut u8);
Ok(unchecked_unwrap(NonNull::new(ptr)))
} else {
Expand Down
6 changes: 3 additions & 3 deletions wee_alloc/src/imp_windows.rs
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
use const_init::ConstInit;
use core::alloc::{AllocErr, Opaque};
use core::alloc::AllocErr;
use core::cell::UnsafeCell;
use core::ptr::NonNull;
use memory_units::{Bytes, Pages};
Expand All@@ -12,10 +12,10 @@ use winapi::um::synchapi::{CreateMutexW, ReleaseMutex, WaitForSingleObject};
use winapi::um::winbase::{WAIT_OBJECT_0, INFINITE};
use winapi::um::winnt::{HANDLE, MEM_COMMIT, PAGE_READWRITE};

pub(crate) fn alloc_pages(pages: Pages) -> Result<NonNull<Opaque>, AllocErr> {
pub(crate) fn alloc_pages(pages: Pages) -> Result<NonNull<u8>, AllocErr> {
let bytes: Bytes = pages.into();
let ptr = unsafe { VirtualAlloc(NULL, bytes.0, MEM_COMMIT, PAGE_READWRITE) };
NonNull::new(ptr as *mut Opaque).ok_or(AllocErr)
NonNull::new(ptr as *mut u8).ok_or(AllocErr)
}

// Align to the cache line size on an i7 to avoid false sharing.
Expand Down
57 changes: 29 additions & 28 deletions wee_alloc/src/lib.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -50,12 +50,9 @@ infrastructure. Nevertheless, `wee_alloc` is also usable with `std`.
// We aren't using the standard library.
#![no_std]

// Required to replace the global allocator.
#![feature(global_allocator)]

// Required to use the `alloc` crate and its types, the `abort` intrinsic, and a
// custom panic handler.
#![feature(alloc, core_intrinsics, lang_items)]
#![feature(alloc, core_intrinsics, panic_implementation, lang_items)]

extern crate alloc;
extern crate wee_alloc;
Expand All@@ -64,18 +61,22 @@ extern crate wee_alloc;
#[global_allocator]
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;

// Need to provide a tiny `panic_fmt` lang-item implementation for `#![no_std]`.
// This implementation will translate panics into traps in the resulting
// WebAssembly.
#[lang = "panic_fmt"]
extern "C" fn panic_fmt(
_args: ::core::fmt::Arguments,
_file: &'static str,
_line: u32
) -> ! {
use core::intrinsics;
// Need to provide a tiny `panic` implementation for `#![no_std]`.
// This translates into an `unreachable` instruction that will
// raise a `trap` the WebAssembly execution if we panic at runtime.
#[panic_implementation]
fn panic(_info: &::core::panic::PanicInfo) -> ! {
unsafe {
::core::intrinsics::abort();
}
}

// Need to provide a tiny `oom` lang-item implementation for
// `#![no_std]`.
#[lang = "oom"]
extern "C" fn oom() -> ! {
unsafe {
intrinsics::abort();
::core::intrinsics::abort();
}
}

Expand DownExpand Up@@ -222,7 +223,7 @@ for hacking!

#![deny(missing_docs)]
#![cfg_attr(not(feature = "use_std_for_test_debugging"), no_std)]
#![feature(alloc, allocator_api, core_intrinsics, global_allocator)]
#![feature(alloc, allocator_api, core_intrinsics)]
#![cfg_attr(target_arch = "wasm32", feature(link_llvm_intrinsics))]

#[macro_use]
Expand DownExpand Up@@ -269,7 +270,7 @@ mod neighbors;
mod size_classes;

use const_init::ConstInit;
use core::alloc::{Alloc, AllocErr, GlobalAlloc, Layout, Opaque};
use core::alloc::{Alloc, AllocErr, GlobalAlloc, Layout};
use core::cell::Cell;
use core::cmp;
use core::marker::Sync;
Expand DownExpand Up@@ -520,7 +521,7 @@ impl<'a> FreeCell<'a> {
}

unsafe fn from_uninitialized(
raw: NonNull<Opaque>,
raw: NonNull<u8>,
size: Bytes,
next_free: Option<*const FreeCell<'a>>,
policy: &AllocPolicy<'a>,
Expand DownExpand Up@@ -586,7 +587,7 @@ impl<'a> FreeCell<'a> {
let split_cell_head = split_and_aligned - size_of::<CellHeader>().0;
let split_cell = unsafe {
&*FreeCell::from_uninitialized(
unchecked_unwrap(NonNull::new(split_cell_head as *mut Opaque)),
unchecked_unwrap(NonNull::new(split_cell_head as *mut u8)),
Bytes(next - split_cell_head) - size_of::<CellHeader>(),
None,
policy,
Expand DownExpand Up@@ -951,7 +952,7 @@ unsafe fn alloc_first_fit<'a>(
align: Bytes,
head: &Cell<*const FreeCell<'a>>,
policy: &AllocPolicy<'a>,
) -> Result<NonNull<Opaque>, AllocErr> {
) -> Result<NonNull<u8>, AllocErr> {
extra_assert!(size.0 > 0);

walk_free_list(head, policy, |previous, current| {
Expand All@@ -960,7 +961,7 @@ unsafe fn alloc_first_fit<'a>(
if let Some(allocated) = current.try_alloc(previous, size, align, policy) {
assert_aligned_to(allocated.data(), align);
return Some(unchecked_unwrap(
NonNull::new(allocated.data() as *mut Opaque),
NonNull::new(allocated.data() as *mut u8),
));
}

Expand All@@ -973,7 +974,7 @@ unsafe fn alloc_with_refill<'a, 'b>(
align: Bytes,
head: &'b Cell<*const FreeCell<'a>>,
policy: &AllocPolicy<'a>,
) -> Result<NonNull<Opaque>, AllocErr> {
) -> Result<NonNull<u8>, AllocErr> {
if let Ok(result) = alloc_first_fit(size, align, head, policy) {
return Ok(result);
}
Expand DownExpand Up@@ -1072,7 +1073,7 @@ unsafe impl<'a, 'b> Alloc for &'b WeeAlloc<'a>
where
'a: 'b,
{
unsafe fn alloc(&mut self, layout: Layout) -> Result<NonNull<Opaque>, AllocErr> {
unsafe fn alloc(&mut self, layout: Layout) -> Result<NonNull<u8>, AllocErr> {
let size = Bytes(layout.size());
let align = if layout.align() == 0 {
Bytes(1)
Expand All@@ -1084,7 +1085,7 @@ where
// Ensure that our made up pointer is properly aligned by using the
// alignment as the pointer.
extra_assert!(align.0 > 0);
return Ok(NonNull::new_unchecked(align.0 as *mut Opaque));
return Ok(NonNull::new_unchecked(align.0 as *mut u8));
}

let size: Words = size.round_up_to();
Expand All@@ -1095,7 +1096,7 @@ where
})
}

unsafe fn dealloc(&mut self, ptr: NonNull<Opaque>, layout: Layout) {
unsafe fn dealloc(&mut self, ptr: NonNull<u8>, layout: Layout) {
let size = Bytes(layout.size());
if size.0 == 0 {
return;
Expand DownExpand Up@@ -1185,15 +1186,15 @@ where
}

unsafe impl GlobalAlloc for WeeAlloc<'static> {
unsafe fn alloc(&self, layout: Layout) -> *mut Opaque {
unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
let mut me = self;
match Alloc::alloc(&mut me, layout) {
Ok(ptr) => ptr.as_ptr(),
Err(AllocErr) => 0 as *mut Opaque,
Err(AllocErr) => 0 as *mut u8,
}
}

unsafe fn dealloc(&self, ptr: *mut Opaque, layout: Layout) {
unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) {
if let Some(ptr) = NonNull::new(ptr) {
let mut me = self;
Alloc::dealloc(&mut me, ptr, layout);
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Aug 25, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 16 additions & 15 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -50,12 +50,9 @@ infrastructure. Nevertheless, `wee_alloc` is also usable with `std`.
// We aren't using the standard library.
#![no_std]

// Required to replace the global allocator.
#![feature(global_allocator)]

// Required to use the `alloc` crate and its types, the `abort` intrinsic, and a
// custom panic handler.
#![feature(alloc, core_intrinsics, lang_items)]
#![feature(alloc, core_intrinsics, panic_implementation, lang_items)]

extern crate alloc;
extern crate wee_alloc;
Expand All@@ -64,18 +61,22 @@ extern crate wee_alloc;
#[global_allocator]
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;

// Need to provide a tiny `panic_fmt` lang-item implementation for `#![no_std]`.
// This implementation will translate panics into traps in the resulting
// WebAssembly.
#[lang = "panic_fmt"]
extern "C" fn panic_fmt(
_args: ::core::fmt::Arguments,
_file: &'static str,
_line: u32
) -> ! {
use core::intrinsics;
// Need to provide a tiny `panic` implementation for `#![no_std]`.
// This translates into an `unreachable` instruction that will
// raise a `trap` the WebAssembly execution if we panic at runtime.
#[panic_implementation]
fn panic(_info: &::core::panic::PanicInfo) -> ! {
unsafe {
::core::intrinsics::abort();
}
}

// Need to provide a tiny `oom` lang-item implementation for
// `#![no_std]`.
#[lang = "oom"]
extern "C" fn oom() -> ! {
unsafe {
intrinsics::abort();
::core::intrinsics::abort();
}
}

Expand Down
10 changes: 5 additions & 5 deletions example/src/lib.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,7 +6,7 @@
// We aren't using the standard library.
#![no_std]
// Replacing the allocator and using the `alloc` crate are still unstable.
#![feature(alloc, core_intrinsics, global_allocator, lang_items)]
#![feature(alloc, core_intrinsics, panic_implementation, lang_items)]

extern crate alloc;
extern crate wee_alloc;
Expand All@@ -15,11 +15,11 @@ extern crate wee_alloc;
#[global_allocator]
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;

// Need to provide a tiny `panic_fmt` lang-item implementation for
// `#![no_std]`. This translates into an `unreachable` instruction that will
// Need to provide a tiny `panic` implementation for `#![no_std]`.
// This translates into an `unreachable` instruction that will
// raise a `trap` the WebAssembly execution if we panic at runtime.
#[lang = "panic_fmt"]
extern "C" fn panic_fmt(_args: ::core::fmt::Arguments, _file: &'static str, _line: u32) -> ! {
#[panic_implementation]
fn panic(_info: &::core::panic::PanicInfo) -> ! {
unsafe {
::core::intrinsics::abort();
}
Expand Down
5 changes: 2 additions & 3 deletions test/src/lib.rs
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
#![feature(alloc, allocator_api)]

extern crate alloc;
extern crate histo;
#[macro_use]
extern crate quickcheck;
Expand All@@ -9,7 +8,7 @@ extern crate cfg_if;
extern crate rand;
extern crate wee_alloc;

use alloc::heap::{Alloc, Layout};
use std::alloc::{Alloc, Layout};
use quickcheck::{Arbitrary, Gen};
use std::f64;
use std::fs;
Expand DownExpand Up@@ -374,7 +373,7 @@ quickcheck! {
let align = ALIGNS[align % ALIGNS.len()];

let mut w = &wee_alloc::WeeAlloc::INIT;
let layout = alloc::heap::Layout::from_size_align(size, align).unwrap();
let layout = Layout::from_size_align(size, align).unwrap();
let _ = unsafe { w.alloc(layout) };
}
}
Expand Down
2 changes: 0 additions & 2 deletions test/tests/global.rs
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
// Adopted from
// https://github.com/alexcrichton/dlmalloc-rs/blob/master/tests/global.rs

#![feature(global_allocator)]

extern crate wee_alloc;

use std::collections::HashMap;
Expand Down
6 changes: 3 additions & 3 deletions wee_alloc/src/imp_static_array.rs
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
use const_init::ConstInit;
use core::alloc::{AllocErr, Opaque};
use core::alloc::AllocErr;
#[cfg(feature = "extra_assertions")]
use core::cell::Cell;
use core::ptr::NonNull;
Expand All@@ -10,12 +10,12 @@ const SCRATCH_LEN_BYTES: usize = include!(concat!(env!("OUT_DIR"), "/wee_alloc_s
static mut SCRATCH_HEAP: [u8; SCRATCH_LEN_BYTES] = [0; SCRATCH_LEN_BYTES];
static mut OFFSET: Mutex<usize> = Mutex::new(0);

pub(crate) unsafe fn alloc_pages(pages: Pages) -> Result<NonNull<Opaque>, AllocErr> {
pub(crate) unsafe fn alloc_pages(pages: Pages) -> Result<NonNull<u8>, AllocErr> {
let bytes: Bytes = pages.into();
let mut offset = OFFSET.lock();
let end = bytes.0 + *offset;
if end < SCRATCH_LEN_BYTES {
let ptr = SCRATCH_HEAP[*offset..end].as_mut_ptr() as *mut u8 as *mut Opaque;
let ptr = SCRATCH_HEAP[*offset..end].as_mut_ptr() as *mut u8;
*offset = end;
NonNull::new(ptr).ok_or_else(|| AllocErr)
} else {
Expand Down
6 changes: 3 additions & 3 deletions wee_alloc/src/imp_unix.rs
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
use const_init::ConstInit;
use core::alloc::{AllocErr, Opaque};
use core::alloc::AllocErr;
use core::cell::UnsafeCell;
use core::ptr::NonNull;
use libc;
use memory_units::{Bytes, Pages};

pub(crate) fn alloc_pages(pages: Pages) -> Result<NonNull<Opaque>, AllocErr> {
pub(crate) fn alloc_pages(pages: Pages) -> Result<NonNull<u8>, AllocErr> {
unsafe {
let bytes: Bytes = pages.into();
let addr = libc::mmap(
Expand All@@ -19,7 +19,7 @@ pub(crate) fn alloc_pages(pages: Pages) -> Result<NonNull<Opaque>, AllocErr> {
if addr == libc::MAP_FAILED {
Err(AllocErr)
} else {
NonNull::new(addr as *mut Opaque).ok_or(AllocErr)
NonNull::new(addr as *mut u8).ok_or(AllocErr)
}
}
}
Expand Down
6 changes: 3 additions & 3 deletions wee_alloc/src/imp_wasm32.rs
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
use super::{assert_is_word_aligned, PAGE_SIZE, unchecked_unwrap};
use const_init::ConstInit;
use core::alloc::{AllocErr, Opaque};
use core::alloc::AllocErr;
use core::cell::UnsafeCell;
use core::ptr::NonNull;
use memory_units::Pages;
Expand All@@ -10,10 +10,10 @@ extern "C" {
fn grow_memory(pages: usize) -> i32;
}

pub(crate) unsafe fn alloc_pages(n: Pages) -> Result<NonNull<Opaque>, AllocErr> {
pub(crate) unsafe fn alloc_pages(n: Pages) -> Result<NonNull<u8>, AllocErr> {
let ptr = grow_memory(n.0);
if -1 != ptr {
let ptr = (ptr as usize * PAGE_SIZE.0) as *mut Opaque;
let ptr = (ptr as usize * PAGE_SIZE.0) as *mut u8;
assert_is_word_aligned(ptr as *mut u8);
Ok(unchecked_unwrap(NonNull::new(ptr)))
} else {
Expand Down
6 changes: 3 additions & 3 deletions wee_alloc/src/imp_windows.rs
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
use const_init::ConstInit;
use core::alloc::{AllocErr, Opaque};
use core::alloc::AllocErr;
use core::cell::UnsafeCell;
use core::ptr::NonNull;
use memory_units::{Bytes, Pages};
Expand All@@ -12,10 +12,10 @@ use winapi::um::synchapi::{CreateMutexW, ReleaseMutex, WaitForSingleObject};
use winapi::um::winbase::{WAIT_OBJECT_0, INFINITE};
use winapi::um::winnt::{HANDLE, MEM_COMMIT, PAGE_READWRITE};

pub(crate) fn alloc_pages(pages: Pages) -> Result<NonNull<Opaque>, AllocErr> {
pub(crate) fn alloc_pages(pages: Pages) -> Result<NonNull<u8>, AllocErr> {
let bytes: Bytes = pages.into();
let ptr = unsafe { VirtualAlloc(NULL, bytes.0, MEM_COMMIT, PAGE_READWRITE) };
NonNull::new(ptr as *mut Opaque).ok_or(AllocErr)
NonNull::new(ptr as *mut u8).ok_or(AllocErr)
}

// Align to the cache line size on an i7 to avoid false sharing.
Expand Down
57 changes: 29 additions & 28 deletions wee_alloc/src/lib.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -50,12 +50,9 @@ infrastructure. Nevertheless, `wee_alloc` is also usable with `std`.
// We aren't using the standard library.
#![no_std]

// Required to replace the global allocator.
#![feature(global_allocator)]

// Required to use the `alloc` crate and its types, the `abort` intrinsic, and a
// custom panic handler.
#![feature(alloc, core_intrinsics, lang_items)]
#![feature(alloc, core_intrinsics, panic_implementation, lang_items)]

extern crate alloc;
extern crate wee_alloc;
Expand All@@ -64,18 +61,22 @@ extern crate wee_alloc;
#[global_allocator]
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;

// Need to provide a tiny `panic_fmt` lang-item implementation for `#![no_std]`.
// This implementation will translate panics into traps in the resulting
// WebAssembly.
#[lang = "panic_fmt"]
extern "C" fn panic_fmt(
_args: ::core::fmt::Arguments,
_file: &'static str,
_line: u32
) -> ! {
use core::intrinsics;
// Need to provide a tiny `panic` implementation for `#![no_std]`.
// This translates into an `unreachable` instruction that will
// raise a `trap` the WebAssembly execution if we panic at runtime.
#[panic_implementation]
fn panic(_info: &::core::panic::PanicInfo) -> ! {
unsafe {
::core::intrinsics::abort();
}
}

// Need to provide a tiny `oom` lang-item implementation for
// `#![no_std]`.
#[lang = "oom"]
extern "C" fn oom() -> ! {
unsafe {
intrinsics::abort();
::core::intrinsics::abort();
}
}

Expand DownExpand Up@@ -222,7 +223,7 @@ for hacking!

#![deny(missing_docs)]
#![cfg_attr(not(feature = "use_std_for_test_debugging"), no_std)]
#![feature(alloc, allocator_api, core_intrinsics, global_allocator)]
#![feature(alloc, allocator_api, core_intrinsics)]
#![cfg_attr(target_arch = "wasm32", feature(link_llvm_intrinsics))]

#[macro_use]
Expand DownExpand Up@@ -269,7 +270,7 @@ mod neighbors;
mod size_classes;

use const_init::ConstInit;
use core::alloc::{Alloc, AllocErr, GlobalAlloc, Layout, Opaque};
use core::alloc::{Alloc, AllocErr, GlobalAlloc, Layout};
use core::cell::Cell;
use core::cmp;
use core::marker::Sync;
Expand DownExpand Up@@ -520,7 +521,7 @@ impl<'a> FreeCell<'a> {
}

unsafe fn from_uninitialized(
raw: NonNull<Opaque>,
raw: NonNull<u8>,
size: Bytes,
next_free: Option<*const FreeCell<'a>>,
policy: &AllocPolicy<'a>,
Expand DownExpand Up@@ -586,7 +587,7 @@ impl<'a> FreeCell<'a> {
let split_cell_head = split_and_aligned - size_of::<CellHeader>().0;
let split_cell = unsafe {
&*FreeCell::from_uninitialized(
unchecked_unwrap(NonNull::new(split_cell_head as *mut Opaque)),
unchecked_unwrap(NonNull::new(split_cell_head as *mut u8)),
Bytes(next - split_cell_head) - size_of::<CellHeader>(),
None,
policy,
Expand DownExpand Up@@ -951,7 +952,7 @@ unsafe fn alloc_first_fit<'a>(
align: Bytes,
head: &Cell<*const FreeCell<'a>>,
policy: &AllocPolicy<'a>,
) -> Result<NonNull<Opaque>, AllocErr> {
) -> Result<NonNull<u8>, AllocErr> {
extra_assert!(size.0 > 0);

walk_free_list(head, policy, |previous, current| {
Expand All@@ -960,7 +961,7 @@ unsafe fn alloc_first_fit<'a>(
if let Some(allocated) = current.try_alloc(previous, size, align, policy) {
assert_aligned_to(allocated.data(), align);
return Some(unchecked_unwrap(
NonNull::new(allocated.data() as *mut Opaque),
NonNull::new(allocated.data() as *mut u8),
));
}

Expand All@@ -973,7 +974,7 @@ unsafe fn alloc_with_refill<'a, 'b>(
align: Bytes,
head: &'b Cell<*const FreeCell<'a>>,
policy: &AllocPolicy<'a>,
) -> Result<NonNull<Opaque>, AllocErr> {
) -> Result<NonNull<u8>, AllocErr> {
if let Ok(result) = alloc_first_fit(size, align, head, policy) {
return Ok(result);
}
Expand DownExpand Up@@ -1072,7 +1073,7 @@ unsafe impl<'a, 'b> Alloc for &'b WeeAlloc<'a>
where
'a: 'b,
{
unsafe fn alloc(&mut self, layout: Layout) -> Result<NonNull<Opaque>, AllocErr> {
unsafe fn alloc(&mut self, layout: Layout) -> Result<NonNull<u8>, AllocErr> {
let size = Bytes(layout.size());
let align = if layout.align() == 0 {
Bytes(1)
Expand All@@ -1084,7 +1085,7 @@ where
// Ensure that our made up pointer is properly aligned by using the
// alignment as the pointer.
extra_assert!(align.0 > 0);
return Ok(NonNull::new_unchecked(align.0 as *mut Opaque));
return Ok(NonNull::new_unchecked(align.0 as *mut u8));
}

let size: Words = size.round_up_to();
Expand All@@ -1095,7 +1096,7 @@ where
})
}

unsafe fn dealloc(&mut self, ptr: NonNull<Opaque>, layout: Layout) {
unsafe fn dealloc(&mut self, ptr: NonNull<u8>, layout: Layout) {
let size = Bytes(layout.size());
if size.0 == 0 {
return;
Expand DownExpand Up@@ -1185,15 +1186,15 @@ where
}

unsafe impl GlobalAlloc for WeeAlloc<'static> {
unsafe fn alloc(&self, layout: Layout) -> *mut Opaque {
unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
let mut me = self;
match Alloc::alloc(&mut me, layout) {
Ok(ptr) => ptr.as_ptr(),
Err(AllocErr) => 0 as *mut Opaque,
Err(AllocErr) => 0 as *mut u8,
}
}

unsafe fn dealloc(&self, ptr: *mut Opaque, layout: Layout) {
unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) {
if let Some(ptr) = NonNull::new(ptr) {
let mut me = self;
Alloc::dealloc(&mut me, ptr, layout);
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
This repository was archived by the owner on Aug 25, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 16 additions & 15 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -50,12 +50,9 @@ infrastructure. Nevertheless, `wee_alloc` is also usable with `std`.
// We aren't using the standard library.
#![no_std]

// Required to replace the global allocator.
#![feature(global_allocator)]

// Required to use the `alloc` crate and its types, the `abort` intrinsic, and a
// custom panic handler.
#![feature(alloc, core_intrinsics, lang_items)]
#![feature(alloc, core_intrinsics, panic_implementation, lang_items)]

extern crate alloc;
extern crate wee_alloc;
Expand All@@ -64,18 +61,22 @@ extern crate wee_alloc;
#[global_allocator]
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;

// Need to provide a tiny `panic_fmt` lang-item implementation for `#![no_std]`.
// This implementation will translate panics into traps in the resulting
// WebAssembly.
#[lang = "panic_fmt"]
extern "C" fn panic_fmt(
_args: ::core::fmt::Arguments,
_file: &'static str,
_line: u32
) -> ! {
use core::intrinsics;
// Need to provide a tiny `panic` implementation for `#![no_std]`.
// This translates into an `unreachable` instruction that will
// raise a `trap` the WebAssembly execution if we panic at runtime.
#[panic_implementation]
fn panic(_info: &::core::panic::PanicInfo) -> ! {
unsafe {
::core::intrinsics::abort();
}
}

// Need to provide a tiny `oom` lang-item implementation for
// `#![no_std]`.
#[lang = "oom"]
extern "C" fn oom() -> ! {
unsafe {
intrinsics::abort();
::core::intrinsics::abort();
}
}

Expand Down
10 changes: 5 additions & 5 deletions example/src/lib.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,7 +6,7 @@
// We aren't using the standard library.
#![no_std]
// Replacing the allocator and using the `alloc` crate are still unstable.
#![feature(alloc, core_intrinsics, global_allocator, lang_items)]
#![feature(alloc, core_intrinsics, panic_implementation, lang_items)]

extern crate alloc;
extern crate wee_alloc;
Expand All@@ -15,11 +15,11 @@ extern crate wee_alloc;
#[global_allocator]
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;

// Need to provide a tiny `panic_fmt` lang-item implementation for
// `#![no_std]`. This translates into an `unreachable` instruction that will
// Need to provide a tiny `panic` implementation for `#![no_std]`.
// This translates into an `unreachable` instruction that will
// raise a `trap` the WebAssembly execution if we panic at runtime.
#[lang = "panic_fmt"]
extern "C" fn panic_fmt(_args: ::core::fmt::Arguments, _file: &'static str, _line: u32) -> ! {
#[panic_implementation]
fn panic(_info: &::core::panic::PanicInfo) -> ! {
unsafe {
::core::intrinsics::abort();
}
Expand Down
5 changes: 2 additions & 3 deletions test/src/lib.rs
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
#![feature(alloc, allocator_api)]

extern crate alloc;
extern crate histo;
#[macro_use]
extern crate quickcheck;
Expand All@@ -9,7 +8,7 @@ extern crate cfg_if;
extern crate rand;
extern crate wee_alloc;

use alloc::heap::{Alloc, Layout};
use std::alloc::{Alloc, Layout};
use quickcheck::{Arbitrary, Gen};
use std::f64;
use std::fs;
Expand DownExpand Up@@ -374,7 +373,7 @@ quickcheck! {
let align = ALIGNS[align % ALIGNS.len()];

let mut w = &wee_alloc::WeeAlloc::INIT;
let layout = alloc::heap::Layout::from_size_align(size, align).unwrap();
let layout = Layout::from_size_align(size, align).unwrap();
let _ = unsafe { w.alloc(layout) };
}
}
Expand Down
2 changes: 0 additions & 2 deletions test/tests/global.rs
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
// Adopted from
// https://github.com/alexcrichton/dlmalloc-rs/blob/master/tests/global.rs

#![feature(global_allocator)]

extern crate wee_alloc;

use std::collections::HashMap;
Expand Down
6 changes: 3 additions & 3 deletions wee_alloc/src/imp_static_array.rs
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
use const_init::ConstInit;
use core::alloc::{AllocErr, Opaque};
use core::alloc::AllocErr;
#[cfg(feature = "extra_assertions")]
use core::cell::Cell;
use core::ptr::NonNull;
Expand All@@ -10,12 +10,12 @@ const SCRATCH_LEN_BYTES: usize = include!(concat!(env!("OUT_DIR"), "/wee_alloc_s
static mut SCRATCH_HEAP: [u8; SCRATCH_LEN_BYTES] = [0; SCRATCH_LEN_BYTES];
static mut OFFSET: Mutex<usize> = Mutex::new(0);

pub(crate) unsafe fn alloc_pages(pages: Pages) -> Result<NonNull<Opaque>, AllocErr> {
pub(crate) unsafe fn alloc_pages(pages: Pages) -> Result<NonNull<u8>, AllocErr> {
let bytes: Bytes = pages.into();
let mut offset = OFFSET.lock();
let end = bytes.0 + *offset;
if end < SCRATCH_LEN_BYTES {
let ptr = SCRATCH_HEAP[*offset..end].as_mut_ptr() as *mut u8 as *mut Opaque;
let ptr = SCRATCH_HEAP[*offset..end].as_mut_ptr() as *mut u8;
*offset = end;
NonNull::new(ptr).ok_or_else(|| AllocErr)
} else {
Expand Down
6 changes: 3 additions & 3 deletions wee_alloc/src/imp_unix.rs
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
use const_init::ConstInit;
use core::alloc::{AllocErr, Opaque};
use core::alloc::AllocErr;
use core::cell::UnsafeCell;
use core::ptr::NonNull;
use libc;
use memory_units::{Bytes, Pages};

pub(crate) fn alloc_pages(pages: Pages) -> Result<NonNull<Opaque>, AllocErr> {
pub(crate) fn alloc_pages(pages: Pages) -> Result<NonNull<u8>, AllocErr> {
unsafe {
let bytes: Bytes = pages.into();
let addr = libc::mmap(
Expand All@@ -19,7 +19,7 @@ pub(crate) fn alloc_pages(pages: Pages) -> Result<NonNull<Opaque>, AllocErr> {
if addr == libc::MAP_FAILED {
Err(AllocErr)
} else {
NonNull::new(addr as *mut Opaque).ok_or(AllocErr)
NonNull::new(addr as *mut u8).ok_or(AllocErr)
}
}
}
Expand Down
6 changes: 3 additions & 3 deletions wee_alloc/src/imp_wasm32.rs
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
use super::{assert_is_word_aligned, PAGE_SIZE, unchecked_unwrap};
use const_init::ConstInit;
use core::alloc::{AllocErr, Opaque};
use core::alloc::AllocErr;
use core::cell::UnsafeCell;
use core::ptr::NonNull;
use memory_units::Pages;
Expand All@@ -10,10 +10,10 @@ extern "C" {
fn grow_memory(pages: usize) -> i32;
}

pub(crate) unsafe fn alloc_pages(n: Pages) -> Result<NonNull<Opaque>, AllocErr> {
pub(crate) unsafe fn alloc_pages(n: Pages) -> Result<NonNull<u8>, AllocErr> {
let ptr = grow_memory(n.0);
if -1 != ptr {
let ptr = (ptr as usize * PAGE_SIZE.0) as *mut Opaque;
let ptr = (ptr as usize * PAGE_SIZE.0) as *mut u8;
assert_is_word_aligned(ptr as *mut u8);
Ok(unchecked_unwrap(NonNull::new(ptr)))
} else {
Expand Down
6 changes: 3 additions & 3 deletions wee_alloc/src/imp_windows.rs
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
use const_init::ConstInit;
use core::alloc::{AllocErr, Opaque};
use core::alloc::AllocErr;
use core::cell::UnsafeCell;
use core::ptr::NonNull;
use memory_units::{Bytes, Pages};
Expand All@@ -12,10 +12,10 @@ use winapi::um::synchapi::{CreateMutexW, ReleaseMutex, WaitForSingleObject};
use winapi::um::winbase::{WAIT_OBJECT_0, INFINITE};
use winapi::um::winnt::{HANDLE, MEM_COMMIT, PAGE_READWRITE};

pub(crate) fn alloc_pages(pages: Pages) -> Result<NonNull<Opaque>, AllocErr> {
pub(crate) fn alloc_pages(pages: Pages) -> Result<NonNull<u8>, AllocErr> {
let bytes: Bytes = pages.into();
let ptr = unsafe { VirtualAlloc(NULL, bytes.0, MEM_COMMIT, PAGE_READWRITE) };
NonNull::new(ptr as *mut Opaque).ok_or(AllocErr)
NonNull::new(ptr as *mut u8).ok_or(AllocErr)
}

// Align to the cache line size on an i7 to avoid false sharing.
Expand Down
57 changes: 29 additions & 28 deletions wee_alloc/src/lib.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -50,12 +50,9 @@ infrastructure. Nevertheless, `wee_alloc` is also usable with `std`.
// We aren't using the standard library.
#![no_std]

// Required to replace the global allocator.
#![feature(global_allocator)]

// Required to use the `alloc` crate and its types, the `abort` intrinsic, and a
// custom panic handler.
#![feature(alloc, core_intrinsics, lang_items)]
#![feature(alloc, core_intrinsics, panic_implementation, lang_items)]

extern crate alloc;
extern crate wee_alloc;
Expand All@@ -64,18 +61,22 @@ extern crate wee_alloc;
#[global_allocator]
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;

// Need to provide a tiny `panic_fmt` lang-item implementation for `#![no_std]`.
// This implementation will translate panics into traps in the resulting
// WebAssembly.
#[lang = "panic_fmt"]
extern "C" fn panic_fmt(
_args: ::core::fmt::Arguments,
_file: &'static str,
_line: u32
) -> ! {
use core::intrinsics;
// Need to provide a tiny `panic` implementation for `#![no_std]`.
// This translates into an `unreachable` instruction that will
// raise a `trap` the WebAssembly execution if we panic at runtime.
#[panic_implementation]
fn panic(_info: &::core::panic::PanicInfo) -> ! {
unsafe {
::core::intrinsics::abort();
}
}

// Need to provide a tiny `oom` lang-item implementation for
// `#![no_std]`.
#[lang = "oom"]
extern "C" fn oom() -> ! {
unsafe {
intrinsics::abort();
::core::intrinsics::abort();
}
}

Expand DownExpand Up@@ -222,7 +223,7 @@ for hacking!

#![deny(missing_docs)]
#![cfg_attr(not(feature = "use_std_for_test_debugging"), no_std)]
#![feature(alloc, allocator_api, core_intrinsics, global_allocator)]
#![feature(alloc, allocator_api, core_intrinsics)]
#![cfg_attr(target_arch = "wasm32", feature(link_llvm_intrinsics))]

#[macro_use]
Expand DownExpand Up@@ -269,7 +270,7 @@ mod neighbors;
mod size_classes;

use const_init::ConstInit;
use core::alloc::{Alloc, AllocErr, GlobalAlloc, Layout, Opaque};
use core::alloc::{Alloc, AllocErr, GlobalAlloc, Layout};
use core::cell::Cell;
use core::cmp;
use core::marker::Sync;
Expand DownExpand Up@@ -520,7 +521,7 @@ impl<'a> FreeCell<'a> {
}

unsafe fn from_uninitialized(
raw: NonNull<Opaque>,
raw: NonNull<u8>,
size: Bytes,
next_free: Option<*const FreeCell<'a>>,
policy: &AllocPolicy<'a>,
Expand DownExpand Up@@ -586,7 +587,7 @@ impl<'a> FreeCell<'a> {
let split_cell_head = split_and_aligned - size_of::<CellHeader>().0;
let split_cell = unsafe {
&*FreeCell::from_uninitialized(
unchecked_unwrap(NonNull::new(split_cell_head as *mut Opaque)),
unchecked_unwrap(NonNull::new(split_cell_head as *mut u8)),
Bytes(next - split_cell_head) - size_of::<CellHeader>(),
None,
policy,
Expand DownExpand Up@@ -951,7 +952,7 @@ unsafe fn alloc_first_fit<'a>(
align: Bytes,
head: &Cell<*const FreeCell<'a>>,
policy: &AllocPolicy<'a>,
) -> Result<NonNull<Opaque>, AllocErr> {
) -> Result<NonNull<u8>, AllocErr> {
extra_assert!(size.0 > 0);

walk_free_list(head, policy, |previous, current| {
Expand All@@ -960,7 +961,7 @@ unsafe fn alloc_first_fit<'a>(
if let Some(allocated) = current.try_alloc(previous, size, align, policy) {
assert_aligned_to(allocated.data(), align);
return Some(unchecked_unwrap(
NonNull::new(allocated.data() as *mut Opaque),
NonNull::new(allocated.data() as *mut u8),
));
}

Expand All@@ -973,7 +974,7 @@ unsafe fn alloc_with_refill<'a, 'b>(
align: Bytes,
head: &'b Cell<*const FreeCell<'a>>,
policy: &AllocPolicy<'a>,
) -> Result<NonNull<Opaque>, AllocErr> {
) -> Result<NonNull<u8>, AllocErr> {
if let Ok(result) = alloc_first_fit(size, align, head, policy) {
return Ok(result);
}
Expand DownExpand Up@@ -1072,7 +1073,7 @@ unsafe impl<'a, 'b> Alloc for &'b WeeAlloc<'a>
where
'a: 'b,
{
unsafe fn alloc(&mut self, layout: Layout) -> Result<NonNull<Opaque>, AllocErr> {
unsafe fn alloc(&mut self, layout: Layout) -> Result<NonNull<u8>, AllocErr> {
let size = Bytes(layout.size());
let align = if layout.align() == 0 {
Bytes(1)
Expand All@@ -1084,7 +1085,7 @@ where
// Ensure that our made up pointer is properly aligned by using the
// alignment as the pointer.
extra_assert!(align.0 > 0);
return Ok(NonNull::new_unchecked(align.0 as *mut Opaque));
return Ok(NonNull::new_unchecked(align.0 as *mut u8));
}

let size: Words = size.round_up_to();
Expand All@@ -1095,7 +1096,7 @@ where
})
}

unsafe fn dealloc(&mut self, ptr: NonNull<Opaque>, layout: Layout) {
unsafe fn dealloc(&mut self, ptr: NonNull<u8>, layout: Layout) {
let size = Bytes(layout.size());
if size.0 == 0 {
return;
Expand DownExpand Up@@ -1185,15 +1186,15 @@ where
}

unsafe impl GlobalAlloc for WeeAlloc<'static> {
unsafe fn alloc(&self, layout: Layout) -> *mut Opaque {
unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
let mut me = self;
match Alloc::alloc(&mut me, layout) {
Ok(ptr) => ptr.as_ptr(),
Err(AllocErr) => 0 as *mut Opaque,
Err(AllocErr) => 0 as *mut u8,
}
}

unsafe fn dealloc(&self, ptr: *mut Opaque, layout: Layout) {
unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) {
if let Some(ptr) = NonNull::new(ptr) {
let mut me = self;
Alloc::dealloc(&mut me, ptr, layout);
Expand Down