From 1e16cb03cea86840e3478e04d7ae20dd4e68628d Mon Sep 17 00:00:00 2001 From: Stephen Chung Date: Sat, 31 Oct 2020 11:52:42 +0800 Subject: [PATCH] Add content to no-std buld. --- doc/src/start/builds/no-std.md | 60 +++++++++++++++++++++++++++++++++- doc/src/start/builds/wasm.md | 10 +++--- 2 files changed, 64 insertions(+), 6 deletions(-) diff --git a/doc/src/start/builds/no-std.md b/doc/src/start/builds/no-std.md index 75395ed6..ce30ddb0 100644 --- a/doc/src/start/builds/no-std.md +++ b/doc/src/start/builds/no-std.md @@ -15,7 +15,65 @@ Nightly Required Currently, [`no_std`] requires the nightly compiler due to the crates that it uses. +Implementation +-------------- + +Rhai allocates, so the first thing that must be included in any `no-std` project is +an allocator crate, such as [`wee_alloc`](https://crates.io/crates/wee_alloc). + +Then there is the need to set up proper error/panic handlers. +The following example uses `panic = "abort"` and `wee_alloc` as the allocator. + +```rust +// Set up for no-std. +#![no_std] + +// The following no-std features are usually needed. +#![feature(alloc_error_handler, start, core_intrinsics, lang_items, link_cfg)] + +// Set up the global allocator. +extern crate alloc; +extern crate wee_alloc; + +#[global_allocator] +static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT; + +// Rust needs a CRT runtime on Windows when compiled with MSVC. +#[cfg(all(windows, target_env = "msvc"))] +#[link(name = "msvcrt")] +#[link(name = "libcmt")] +extern {} + +// Set up panic and error handlers +#[alloc_error_handler] +fn err_handler(_: core::alloc::Layout) -> ! { + core::intrinsics::abort(); +} + +#[panic_handler] +#[lang = "panic_impl"] +extern "C" fn rust_begin_panic(_: &core::panic::PanicInfo) -> ! { + core::intrinsics::abort(); +} + +#[lang = "eh_personality"] +extern "C" fn eh_personality() {} + +#[no_mangle] +extern "C" fn rust_eh_register_frames() {} + +#[no_mangle] +extern "C" fn rust_eh_unregister_frames() {} + +#[start] +fn main(_argc: isize, _argv: *const *const u8) -> isize { + // ... main program ... +} +``` + + Samples ------- -Check out the [`no-std` sample applications](../examples/rust.md#no-std-samples) for different operating environments. +Check out the [`no-std` sample applications](../examples/rust.md#no-std-samples) +for different operating environments. diff --git a/doc/src/start/builds/wasm.md b/doc/src/start/builds/wasm.md index 1f813ae8..fbbc9007 100644 --- a/doc/src/start/builds/wasm.md +++ b/doc/src/start/builds/wasm.md @@ -3,16 +3,16 @@ Building to WebAssembly (WASM) {{#include ../../links.md}} -It is possible to use Rhai when compiling to WebAssembly (WASM). This yields a scripting engine (and language) -that can be run in a standard web browser. +It is possible to use Rhai when compiling to WebAssembly (WASM). +This yields a scripting engine (and language) that can be run in a standard web browser. -Why you would want to is another matter... as there is already a nice, fast, complete scripting language +Why you would _want_ to is another matter... as there is already a nice, fast, complete scripting language for the the common WASM environment (i.e. a browser) - and it is called JavaScript. But anyhow, do it because you _can_! -When building for WASM, certain features will not be available, such as the script file API's and loading modules -from external script files. +When building for WASM, certain features will not be available, +such as the script file API's and loading modules from external script files. Size