Skip to content

Commit 433a8d8

Browse files
authored
Merge pull request #1391 from RReverser/node-pass-string
Add specialised passStringToWasm for Node.js
2 parents 6522968 + 12011f4 commit 433a8d8

File tree

1 file changed

+43
-14
lines changed
  • crates/cli-support/src/js

1 file changed

+43
-14
lines changed

crates/cli-support/src/js/mod.rs

Lines changed: 43 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1236,8 +1236,6 @@ impl<'a> Context<'a> {
12361236
return Ok(());
12371237
}
12381238
self.require_internal_export("__wbindgen_malloc")?;
1239-
self.expose_text_encoder();
1240-
self.expose_uint8_memory();
12411239
self.expose_wasm_vector_len();
12421240
let debug = if self.config.debug {
12431241
"
@@ -1247,6 +1245,33 @@ impl<'a> Context<'a> {
12471245
""
12481246
};
12491247

1248+
// If we are targeting Node.js, it doesn't have `encodeInto` yet
1249+
// but it does have `Buffer::write` which has similar semantics but
1250+
// doesn't require creating intermediate view using `subarray`
1251+
// and also has `Buffer::byteLength` to calculate size upfront.
1252+
if self.config.mode.nodejs() {
1253+
self.expose_node_buffer_memory();
1254+
1255+
self.global(&format!(
1256+
"
1257+
function passStringToWasm(arg) {{
1258+
{}
1259+
const size = Buffer.byteLength(arg);
1260+
const ptr = wasm.__wbindgen_malloc(size);
1261+
getNodeBufferMemory().write(arg, ptr, size);
1262+
WASM_VECTOR_LEN = size;
1263+
return ptr;
1264+
}}
1265+
",
1266+
debug,
1267+
));
1268+
1269+
return Ok(());
1270+
}
1271+
1272+
self.expose_text_encoder();
1273+
self.expose_uint8_memory();
1274+
12501275
// The first implementation we have for this is to use
12511276
// `TextEncoder#encode` which has been around for quite some time.
12521277
let use_encode = format!(
@@ -1600,48 +1625,52 @@ impl<'a> Context<'a> {
16001625
));
16011626
}
16021627

1628+
fn expose_node_buffer_memory(&mut self) {
1629+
self.memview("getNodeBufferMemory", "Buffer.from");
1630+
}
1631+
16031632
fn expose_int8_memory(&mut self) {
1604-
self.memview("getInt8Memory", "Int8Array");
1633+
self.memview("getInt8Memory", "new Int8Array");
16051634
}
16061635

16071636
fn expose_uint8_memory(&mut self) {
1608-
self.memview("getUint8Memory", "Uint8Array");
1637+
self.memview("getUint8Memory", "new Uint8Array");
16091638
}
16101639

16111640
fn expose_clamped_uint8_memory(&mut self) {
1612-
self.memview("getUint8ClampedMemory", "Uint8ClampedArray");
1641+
self.memview("getUint8ClampedMemory", "new Uint8ClampedArray");
16131642
}
16141643

16151644
fn expose_int16_memory(&mut self) {
1616-
self.memview("getInt16Memory", "Int16Array");
1645+
self.memview("getInt16Memory", "new Int16Array");
16171646
}
16181647

16191648
fn expose_uint16_memory(&mut self) {
1620-
self.memview("getUint16Memory", "Uint16Array");
1649+
self.memview("getUint16Memory", "new Uint16Array");
16211650
}
16221651

16231652
fn expose_int32_memory(&mut self) {
1624-
self.memview("getInt32Memory", "Int32Array");
1653+
self.memview("getInt32Memory", "new Int32Array");
16251654
}
16261655

16271656
fn expose_uint32_memory(&mut self) {
1628-
self.memview("getUint32Memory", "Uint32Array");
1657+
self.memview("getUint32Memory", "new Uint32Array");
16291658
}
16301659

16311660
fn expose_int64_memory(&mut self) {
1632-
self.memview("getInt64Memory", "BigInt64Array");
1661+
self.memview("getInt64Memory", "new BigInt64Array");
16331662
}
16341663

16351664
fn expose_uint64_memory(&mut self) {
1636-
self.memview("getUint64Memory", "BigUint64Array");
1665+
self.memview("getUint64Memory", "new BigUint64Array");
16371666
}
16381667

16391668
fn expose_f32_memory(&mut self) {
1640-
self.memview("getFloat32Memory", "Float32Array");
1669+
self.memview("getFloat32Memory", "new Float32Array");
16411670
}
16421671

16431672
fn expose_f64_memory(&mut self) {
1644-
self.memview("getFloat64Memory", "Float64Array");
1673+
self.memview("getFloat64Memory", "new Float64Array");
16451674
}
16461675

16471676
fn memview_function(&mut self, t: VectorKind) -> &'static str {
@@ -1711,7 +1740,7 @@ impl<'a> Context<'a> {
17111740
let cache{name} = null;
17121741
function {name}() {{
17131742
if (cache{name} === null || cache{name}.buffer !== {mem}.buffer) {{
1714-
cache{name} = new {js}({mem}.buffer);
1743+
cache{name} = {js}({mem}.buffer);
17151744
}}
17161745
return cache{name};
17171746
}}

0 commit comments

Comments
 (0)