summaryrefslogtreecommitdiffstats
path: root/js/src/wasm/WasmModuleTypes.cpp
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 19:33:14 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 19:33:14 +0000
commit36d22d82aa202bb199967e9512281e9a53db42c9 (patch)
tree105e8c98ddea1c1e4784a60a5a6410fa416be2de /js/src/wasm/WasmModuleTypes.cpp
parentInitial commit. (diff)
downloadfirefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.tar.xz
firefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.zip
Adding upstream version 115.7.0esr.upstream/115.7.0esrupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'js/src/wasm/WasmModuleTypes.cpp')
-rw-r--r--js/src/wasm/WasmModuleTypes.cpp171
1 files changed, 171 insertions, 0 deletions
diff --git a/js/src/wasm/WasmModuleTypes.cpp b/js/src/wasm/WasmModuleTypes.cpp
new file mode 100644
index 0000000000..9823d7ddbc
--- /dev/null
+++ b/js/src/wasm/WasmModuleTypes.cpp
@@ -0,0 +1,171 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ * vim: set ts=8 sts=2 et sw=2 tw=80:
+ *
+ * Copyright 2015 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.
+ */
+
+#include "wasm/WasmModuleTypes.h"
+
+#include "mozilla/Range.h"
+
+#include "vm/JSAtom.h"
+#include "vm/MallocProvider.h"
+#include "wasm/WasmUtility.h"
+
+#include "vm/JSAtom-inl.h"
+
+using namespace js;
+using namespace js::wasm;
+
+/* static */
+CacheableName CacheableName::fromUTF8Chars(UniqueChars&& utf8Chars) {
+ size_t length = strlen(utf8Chars.get());
+ UTF8Bytes bytes;
+ bytes.replaceRawBuffer(utf8Chars.release(), length, length + 1);
+ return CacheableName(std::move(bytes));
+}
+
+/* static */
+bool CacheableName::fromUTF8Chars(const char* utf8Chars, CacheableName* name) {
+ size_t utf8CharsLen = strlen(utf8Chars);
+ UTF8Bytes bytes;
+ if (!bytes.resizeUninitialized(utf8CharsLen)) {
+ return false;
+ }
+ memcpy(bytes.begin(), utf8Chars, utf8CharsLen);
+ *name = CacheableName(std::move(bytes));
+ return true;
+}
+
+JSAtom* CacheableName::toAtom(JSContext* cx) const {
+ return AtomizeUTF8Chars(cx, begin(), length());
+}
+
+bool CacheableName::toPropertyKey(JSContext* cx,
+ MutableHandleId propertyKey) const {
+ JSAtom* atom = toAtom(cx);
+ if (!atom) {
+ return false;
+ }
+ propertyKey.set(AtomToId(atom));
+ return true;
+}
+
+UniqueChars CacheableName::toQuotedString(JSContext* cx) const {
+ RootedString atom(cx, toAtom(cx));
+ if (!atom) {
+ return nullptr;
+ }
+ return QuoteString(cx, atom.get());
+}
+
+size_t CacheableName::sizeOfExcludingThis(MallocSizeOf mallocSizeOf) const {
+ return bytes_.sizeOfExcludingThis(mallocSizeOf);
+}
+
+size_t Import::sizeOfExcludingThis(MallocSizeOf mallocSizeOf) const {
+ return module.sizeOfExcludingThis(mallocSizeOf) +
+ field.sizeOfExcludingThis(mallocSizeOf);
+}
+
+Export::Export(CacheableName&& fieldName, uint32_t index, DefinitionKind kind)
+ : fieldName_(std::move(fieldName)) {
+ pod.kind_ = kind;
+ pod.index_ = index;
+}
+
+Export::Export(CacheableName&& fieldName, DefinitionKind kind)
+ : fieldName_(std::move(fieldName)) {
+ pod.kind_ = kind;
+ pod.index_ = 0;
+}
+
+uint32_t Export::funcIndex() const {
+ MOZ_ASSERT(pod.kind_ == DefinitionKind::Function);
+ return pod.index_;
+}
+
+uint32_t Export::globalIndex() const {
+ MOZ_ASSERT(pod.kind_ == DefinitionKind::Global);
+ return pod.index_;
+}
+
+uint32_t Export::tagIndex() const {
+ MOZ_ASSERT(pod.kind_ == DefinitionKind::Tag);
+ return pod.index_;
+}
+
+uint32_t Export::tableIndex() const {
+ MOZ_ASSERT(pod.kind_ == DefinitionKind::Table);
+ return pod.index_;
+}
+
+size_t Export::sizeOfExcludingThis(MallocSizeOf mallocSizeOf) const {
+ return fieldName_.sizeOfExcludingThis(mallocSizeOf);
+}
+
+size_t GlobalDesc::sizeOfExcludingThis(MallocSizeOf mallocSizeOf) const {
+ return initial_.sizeOfExcludingThis(mallocSizeOf);
+}
+
+bool TagType::initialize(ValTypeVector&& argTypes) {
+ MOZ_ASSERT(argTypes_.empty() && argOffsets_.empty() && size_ == 0);
+
+ argTypes_ = std::move(argTypes);
+ if (!argOffsets_.resize(argTypes_.length())) {
+ return false;
+ }
+
+ StructLayout layout;
+ for (size_t i = 0; i < argTypes_.length(); i++) {
+ CheckedInt32 offset = layout.addField(FieldType(argTypes_[i].packed()));
+ if (!offset.isValid()) {
+ return false;
+ }
+ argOffsets_[i] = offset.value();
+ }
+
+ CheckedInt32 size = layout.close();
+ if (!size.isValid()) {
+ return false;
+ }
+ this->size_ = size.value();
+
+ return true;
+}
+
+size_t TagType::sizeOfExcludingThis(MallocSizeOf mallocSizeOf) const {
+ return argTypes_.sizeOfExcludingThis(mallocSizeOf) +
+ argOffsets_.sizeOfExcludingThis(mallocSizeOf);
+}
+
+size_t TagDesc::sizeOfExcludingThis(MallocSizeOf mallocSizeOf) const {
+ return type->sizeOfExcludingThis(mallocSizeOf);
+}
+
+size_t ElemSegment::sizeOfExcludingThis(MallocSizeOf mallocSizeOf) const {
+ return SizeOfMaybeExcludingThis(offsetIfActive, mallocSizeOf) +
+ elemFuncIndices.sizeOfExcludingThis(mallocSizeOf);
+}
+
+size_t DataSegment::sizeOfExcludingThis(MallocSizeOf mallocSizeOf) const {
+ return SizeOfMaybeExcludingThis(offsetIfActive, mallocSizeOf) +
+ bytes.sizeOfExcludingThis(mallocSizeOf);
+}
+
+size_t CustomSection::sizeOfExcludingThis(MallocSizeOf mallocSizeOf) const {
+ return name.sizeOfExcludingThis(mallocSizeOf) + sizeof(*payload) +
+ payload->sizeOfExcludingThis(mallocSizeOf);
+}