mirror of
https://github.com/fluencelabs/wasm-bindgen
synced 2025-06-20 08:16:31 +00:00
Add support for TextEncoder#encodeInto
This commit adds support for the recently implemented standard of [`TextEncoder#encodeInto`][standard]. This new function is a "bring your own buffer" style function where we can avoid an intermediate allocation and copy by encoding strings directly into wasm's memory. Currently we feature-detect whether `encodeInto` exists as it is only implemented in recent browsers and not in all browsers. Additionally this commit emits the binding using `encodeInto` by default, but this requires `realloc` functionality to be exposed by the wasm module. Measured locally an empty binary which takes `&str` previously took 7.6k, but after this commit takes 8.7k due to the extra code needed for `realloc`. [standard]: https://encoding.spec.whatwg.org/#dom-textencoder-encodeinto Closes #1172
This commit is contained in:
@ -3,7 +3,7 @@ use failure::{bail, Error};
|
||||
use serde::Deserialize;
|
||||
use std::path::PathBuf;
|
||||
use std::process;
|
||||
use wasm_bindgen_cli_support::Bindgen;
|
||||
use wasm_bindgen_cli_support::{Bindgen, EncodeInto};
|
||||
|
||||
// no need for jemalloc bloat in this binary (and we don't need speed)
|
||||
#[global_allocator]
|
||||
@ -32,6 +32,8 @@ Options:
|
||||
--keep-debug Keep debug sections in wasm files
|
||||
--remove-name-section Remove the debugging `name` section of the file
|
||||
--remove-producers-section Remove the telemetry `producers` section
|
||||
--encode-into MODE Whether or not to use TextEncoder#encodeInto,
|
||||
valid values are [test, always, never]
|
||||
-V --version Print the version number of wasm-bindgen
|
||||
";
|
||||
|
||||
@ -51,6 +53,7 @@ struct Args {
|
||||
flag_remove_name_section: bool,
|
||||
flag_remove_producers_section: bool,
|
||||
flag_keep_debug: bool,
|
||||
flag_encode_into: Option<String>,
|
||||
arg_input: Option<PathBuf>,
|
||||
}
|
||||
|
||||
@ -100,6 +103,14 @@ fn rmain(args: &Args) -> Result<(), Error> {
|
||||
if let Some(ref name) = args.flag_out_name {
|
||||
b.out_name(name);
|
||||
}
|
||||
if let Some(mode) = &args.flag_encode_into {
|
||||
match mode.as_str() {
|
||||
"test" => b.encode_into(EncodeInto::Test),
|
||||
"always" => b.encode_into(EncodeInto::Always),
|
||||
"never" => b.encode_into(EncodeInto::Never),
|
||||
s => bail!("invalid encode-into mode: `{}`", s),
|
||||
};
|
||||
}
|
||||
|
||||
let out_dir = match args.flag_out_dir {
|
||||
Some(ref p) => p,
|
||||
|
Reference in New Issue
Block a user