summaryrefslogtreecommitdiffstats
path: root/js/src/rust
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 09:22:09 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 09:22:09 +0000
commit43a97878ce14b72f0981164f87f2e35e14151312 (patch)
tree620249daf56c0258faa40cbdcf9cfba06de2a846 /js/src/rust
parentInitial commit. (diff)
downloadfirefox-43a97878ce14b72f0981164f87f2e35e14151312.tar.xz
firefox-43a97878ce14b72f0981164f87f2e35e14151312.zip
Adding upstream version 110.0.1.upstream/110.0.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'js/src/rust')
-rw-r--r--js/src/rust/Cargo.toml23
-rw-r--r--js/src/rust/extra-bindgen-flags.in1
-rw-r--r--js/src/rust/lib.rs20
-rw-r--r--js/src/rust/moz.build36
-rw-r--r--js/src/rust/shared/Cargo.toml28
-rw-r--r--js/src/rust/shared/lib.rs23
-rw-r--r--js/src/rust/wasm.rs113
7 files changed, 244 insertions, 0 deletions
diff --git a/js/src/rust/Cargo.toml b/js/src/rust/Cargo.toml
new file mode 100644
index 0000000000..3510cfc0af
--- /dev/null
+++ b/js/src/rust/Cargo.toml
@@ -0,0 +1,23 @@
+[package]
+name = "jsrust"
+version = "0.1.0"
+authors = ["The Spidermonkey developers"]
+license = "MPL-2.0"
+
+[lib]
+name = "jsrust"
+crate-type = ["staticlib"]
+path = "lib.rs"
+
+[features]
+moz_memory = ['mozglue-static/moz_memory']
+simd-accel = ['jsrust_shared/simd-accel']
+smoosh = ['jsrust_shared/smoosh']
+gluesmith = ['jsrust_shared/gluesmith']
+
+[dependencies]
+jsrust_shared = { path = "./shared" }
+# Workaround for https://github.com/rust-lang/rust/issues/58393
+mozglue-static = { path = "../../../mozglue/static/rust" }
+wast = { version = "49.0.0" }
+wasmparser = { version = "0.94.0" }
diff --git a/js/src/rust/extra-bindgen-flags.in b/js/src/rust/extra-bindgen-flags.in
new file mode 100644
index 0000000000..ddf9e8df49
--- /dev/null
+++ b/js/src/rust/extra-bindgen-flags.in
@@ -0,0 +1 @@
+@BINDGEN_SYSTEM_FLAGS@
diff --git a/js/src/rust/lib.rs b/js/src/rust/lib.rs
new file mode 100644
index 0000000000..dcc292019d
--- /dev/null
+++ b/js/src/rust/lib.rs
@@ -0,0 +1,20 @@
+/* Copyright 2018 Mozilla Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+extern crate jsrust_shared;
+extern crate wasmparser;
+extern crate wast;
+
+mod wasm;
diff --git a/js/src/rust/moz.build b/js/src/rust/moz.build
new file mode 100644
index 0000000000..83666033fc
--- /dev/null
+++ b/js/src/rust/moz.build
@@ -0,0 +1,36 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+features = []
+
+if CONFIG["MOZ_RUST_SIMD"]:
+ features += ["simd-accel"]
+
+if CONFIG["FUZZING_INTERFACES"]:
+ features += ["gluesmith"]
+
+if CONFIG["JS_ENABLE_SMOOSH"]:
+ features += ["smoosh"]
+
+if CONFIG["MOZ_MEMORY"]:
+ features += ["moz_memory"]
+
+RustLibrary("jsrust", features)
+
+if CONFIG["JS_SHARED_LIBRARY"]:
+ FINAL_LIBRARY = "js"
+
+if CONFIG["OS_ARCH"] == "Darwin":
+ # The Rust standard library references libresolv on macOS, so we need to
+ # link it as a workaround. See also bug 1367932.
+ OS_LIBS += ["-lresolv"]
+elif CONFIG["OS_ARCH"] == "WINNT":
+ # Extra libraries used by Rust bindings libs in debug builds.
+ OS_LIBS += [
+ "shell32",
+ "userenv",
+ "ws2_32",
+ ]
diff --git a/js/src/rust/shared/Cargo.toml b/js/src/rust/shared/Cargo.toml
new file mode 100644
index 0000000000..175d967af3
--- /dev/null
+++ b/js/src/rust/shared/Cargo.toml
@@ -0,0 +1,28 @@
+[package]
+name = "jsrust_shared"
+version = "0.1.0"
+authors = ["The Spidermonkey developers"]
+license = "MPL-2.0"
+
+[lib]
+crate-type = ["rlib"]
+name = "jsrust_shared"
+path = "lib.rs"
+
+[dependencies]
+encoding_c = "0.9.5"
+encoding_c_mem = "0.2.4"
+smoosh = { path = "../../frontend/smoosh", optional = true }
+mozilla-central-workspace-hack = { path = "../../../../build/workspace-hack" }
+mozglue-static = { path = "../../../../mozglue/static/rust" }
+gluesmith = { path = "../../fuzz-tests/gluesmith", optional = true }
+
+[features]
+simd-accel = ['encoding_c/simd-accel']
+
+# Uncomment this to enable perf support in release mode.
+#[profile.release]
+#debug = true
+
+[package.metadata.cargo-udeps.ignore]
+normal = ["mozilla-central-workspace-hack"]
diff --git a/js/src/rust/shared/lib.rs b/js/src/rust/shared/lib.rs
new file mode 100644
index 0000000000..eb85586835
--- /dev/null
+++ b/js/src/rust/shared/lib.rs
@@ -0,0 +1,23 @@
+/* Copyright 2018 Mozilla Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+extern crate encoding_c;
+extern crate encoding_c_mem;
+extern crate mozglue_static;
+
+#[cfg(feature = "smoosh")]
+extern crate smoosh;
+
+#[cfg(feature = "gluesmith")]
+extern crate gluesmith;
diff --git a/js/src/rust/wasm.rs b/js/src/rust/wasm.rs
new file mode 100644
index 0000000000..76154fd450
--- /dev/null
+++ b/js/src/rust/wasm.rs
@@ -0,0 +1,113 @@
+/* Copyright 2020 Mozilla Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#[no_mangle]
+pub unsafe extern "C" fn wasm_text_to_binary(
+ text: *const u16,
+ text_len: usize,
+ out_bytes: *mut *mut u8,
+ out_bytes_len: *mut usize,
+ out_error: *mut *mut u8,
+ out_error_len: *mut usize,
+) -> bool {
+ let text_slice = std::slice::from_raw_parts(text, text_len);
+ let text = String::from_utf16_lossy(text_slice);
+
+ match text_to_binary(&text) {
+ Ok(bytes) => {
+ let bytes_box = bytes.into_boxed_slice();
+ let bytes_slice = Box::leak(bytes_box);
+ out_bytes.write(bytes_slice.as_mut_ptr());
+ out_bytes_len.write(bytes_slice.len());
+ true
+ }
+ Err(error) => {
+ let error = Box::leak(format!("{}\0", error).into_boxed_str());
+ out_error.write(error.as_mut_ptr());
+ out_error_len.write(error.len());
+ false
+ }
+ }
+}
+
+fn text_to_binary(text: &str) -> Result<Vec<u8>, wast::Error> {
+ let mut lexer = wast::lexer::Lexer::new(text);
+ // The 'names.wast' spec test has confusable unicode, so disable detection.
+ // This protection is not very useful for a shell testing function anyways.
+ lexer.allow_confusing_unicode(true);
+ let buf = wast::parser::ParseBuffer::new_with_lexer(lexer)?;
+ let mut ast = wast::parser::parse::<wast::Wat>(&buf)?;
+ return ast.encode();
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn wasm_code_offsets(
+ bytes: *const u8,
+ bytes_len: usize,
+ out_offsets: *mut *mut u32,
+ out_offsets_len: *mut usize,
+) {
+ fn code_offsets(bytes: &[u8]) -> Vec<u32> {
+ use wasmparser::*;
+
+ if bytes.is_empty() {
+ return Vec::new();
+ }
+
+ let mut offsets = Vec::new();
+
+ // Read operators offsets and skip invalid data.
+ for payload in Parser::new(0).parse_all(bytes) {
+ if payload.is_err() {
+ break;
+ }
+ match payload.unwrap() {
+ Payload::CodeSectionEntry(body) => {
+ let reader = match body.get_operators_reader() {
+ Ok(r) => r,
+ Err(_) => {
+ break;
+ }
+ };
+ for pair in reader.into_iter_with_offsets() {
+ let offset = match pair {
+ Ok((_op, offset)) => offset,
+ Err(_) => {
+ break;
+ }
+ };
+ offsets.push(offset as u32);
+ }
+ }
+ _ => (),
+ }
+ }
+
+ offsets
+ }
+
+ let bytes = std::slice::from_raw_parts(bytes, bytes_len);
+ let offsets = code_offsets(bytes);
+
+ if offsets.len() == 0 {
+ out_offsets.write(std::ptr::null_mut());
+ out_offsets_len.write(0);
+ } else {
+ let offsets_box = offsets.into_boxed_slice();
+ let offsets_slice = Box::leak(offsets_box);
+ out_offsets.write(offsets_slice.as_mut_ptr());
+ out_offsets_len.write(offsets_slice.len());
+ }
+}