summaryrefslogtreecommitdiffstats
path: root/js/src/vm/PropertyResult.h
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/vm/PropertyResult.h')
-rw-r--r--js/src/vm/PropertyResult.h103
1 files changed, 103 insertions, 0 deletions
diff --git a/js/src/vm/PropertyResult.h b/js/src/vm/PropertyResult.h
new file mode 100644
index 0000000000..e9e9b4c1cc
--- /dev/null
+++ b/js/src/vm/PropertyResult.h
@@ -0,0 +1,103 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ * vim: set ts=8 sts=2 et sw=2 tw=80:
+ * 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/. */
+
+#ifndef vm_PropertyResult_h
+#define vm_PropertyResult_h
+
+#include "mozilla/Assertions.h"
+
+#include "vm/PropertyInfo.h"
+
+namespace js {
+
+class PropertyResult {
+ enum class Kind : uint8_t {
+ NotFound,
+ NativeProperty,
+ NonNativeProperty,
+ DenseElement,
+ TypedArrayElement,
+ };
+ union {
+ // Set if kind is NativeProperty.
+ PropertyInfo propInfo_;
+ // Set if kind is DenseElement.
+ uint32_t denseIndex_;
+ // Set if kind is TypedArrayElement.
+ size_t typedArrayIndex_;
+ };
+ Kind kind_ = Kind::NotFound;
+ bool ignoreProtoChain_ = false;
+
+ public:
+ // Note: because PropertyInfo does not have a default constructor, we can't
+ // use |= default| here.
+ PropertyResult() {}
+
+ // When a property is not found, we may additionally indicate that the
+ // prototype chain should be ignored. This occurs for:
+ // - An out-of-range numeric property on a TypedArrayObject.
+ // - A resolve hook recursively calling itself as it sets the property.
+ bool isNotFound() const { return kind_ == Kind::NotFound; }
+ bool shouldIgnoreProtoChain() const {
+ MOZ_ASSERT(isNotFound());
+ return ignoreProtoChain_;
+ }
+
+ bool isFound() const { return kind_ != Kind::NotFound; }
+ bool isNonNativeProperty() const { return kind_ == Kind::NonNativeProperty; }
+ bool isDenseElement() const { return kind_ == Kind::DenseElement; }
+ bool isTypedArrayElement() const { return kind_ == Kind::TypedArrayElement; }
+ bool isNativeProperty() const { return kind_ == Kind::NativeProperty; }
+
+ PropertyInfo propertyInfo() const {
+ MOZ_ASSERT(isNativeProperty());
+ return propInfo_;
+ }
+
+ uint32_t denseElementIndex() const {
+ MOZ_ASSERT(isDenseElement());
+ return denseIndex_;
+ }
+
+ size_t typedArrayElementIndex() const {
+ MOZ_ASSERT(isTypedArrayElement());
+ return typedArrayIndex_;
+ }
+
+ void setNotFound() { kind_ = Kind::NotFound; }
+
+ void setNativeProperty(PropertyInfo prop) {
+ kind_ = Kind::NativeProperty;
+ propInfo_ = prop;
+ }
+
+ void setWasmGcProperty() { kind_ = Kind::NonNativeProperty; }
+ void setProxyProperty() { kind_ = Kind::NonNativeProperty; }
+
+ void setDenseElement(uint32_t index) {
+ kind_ = Kind::DenseElement;
+ denseIndex_ = index;
+ }
+
+ void setTypedArrayElement(size_t index) {
+ kind_ = Kind::TypedArrayElement;
+ typedArrayIndex_ = index;
+ }
+
+ void setTypedArrayOutOfRange() {
+ kind_ = Kind::NotFound;
+ ignoreProtoChain_ = true;
+ }
+ void setRecursiveResolve() {
+ kind_ = Kind::NotFound;
+ ignoreProtoChain_ = true;
+ }
+};
+
+} // namespace js
+
+#endif /* vm_PropertyResult_h */