diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:22:09 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:22:09 +0000 |
commit | 43a97878ce14b72f0981164f87f2e35e14151312 (patch) | |
tree | 620249daf56c0258faa40cbdcf9cfba06de2a846 /js/src/rust | |
parent | Initial commit. (diff) | |
download | firefox-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.toml | 23 | ||||
-rw-r--r-- | js/src/rust/extra-bindgen-flags.in | 1 | ||||
-rw-r--r-- | js/src/rust/lib.rs | 20 | ||||
-rw-r--r-- | js/src/rust/moz.build | 36 | ||||
-rw-r--r-- | js/src/rust/shared/Cargo.toml | 28 | ||||
-rw-r--r-- | js/src/rust/shared/lib.rs | 23 | ||||
-rw-r--r-- | js/src/rust/wasm.rs | 113 |
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()); + } +} |