mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-05 23:38:38 +09:00
Issue #1742 - Part 2: Add a class to encapsulate the possible results of a property lookup
This commit is contained in:
parent
80d7d43961
commit
c48b8e8932
1 changed files with 111 additions and 0 deletions
|
|
@ -271,8 +271,119 @@ class ObjectOpResult
|
|||
}
|
||||
};
|
||||
|
||||
class PropertyResult
|
||||
{
|
||||
union {
|
||||
js::Shape* shape_;
|
||||
uintptr_t bits_;
|
||||
};
|
||||
|
||||
static const uintptr_t NotFound = 0;
|
||||
static const uintptr_t NonNativeProperty = 1;
|
||||
static const uintptr_t DenseOrTypedArrayElement = 1;
|
||||
|
||||
public:
|
||||
PropertyResult() : bits_(NotFound) {}
|
||||
|
||||
explicit PropertyResult(js::Shape* propertyShape)
|
||||
: shape_(propertyShape)
|
||||
{
|
||||
MOZ_ASSERT(!isFound() || isNativeProperty());
|
||||
}
|
||||
|
||||
explicit operator bool() const {
|
||||
return isFound();
|
||||
}
|
||||
|
||||
bool isFound() const {
|
||||
return bits_ != NotFound;
|
||||
}
|
||||
|
||||
bool isNonNativeProperty() const {
|
||||
return bits_ == NonNativeProperty;
|
||||
}
|
||||
|
||||
bool isDenseOrTypedArrayElement() const {
|
||||
return bits_ == DenseOrTypedArrayElement;
|
||||
}
|
||||
|
||||
bool isNativeProperty() const {
|
||||
return isFound() && !isNonNativeProperty();
|
||||
}
|
||||
|
||||
js::Shape* maybeShape() const {
|
||||
MOZ_ASSERT(!isNonNativeProperty());
|
||||
return isFound() ? shape_ : nullptr;
|
||||
}
|
||||
|
||||
js::Shape* shape() const {
|
||||
MOZ_ASSERT(isNativeProperty());
|
||||
return shape_;
|
||||
}
|
||||
|
||||
void setNotFound() {
|
||||
bits_ = NotFound;
|
||||
}
|
||||
|
||||
void setNativeProperty(js::Shape* propertyShape) {
|
||||
shape_ = propertyShape;
|
||||
MOZ_ASSERT(isNativeProperty());
|
||||
}
|
||||
|
||||
void setNonNativeProperty() {
|
||||
bits_ = NonNativeProperty;
|
||||
}
|
||||
|
||||
void setDenseOrTypedArrayElement() {
|
||||
bits_ = DenseOrTypedArrayElement;
|
||||
}
|
||||
|
||||
void trace(JSTracer* trc);
|
||||
};
|
||||
|
||||
} // namespace JS
|
||||
|
||||
namespace js {
|
||||
|
||||
template <class Wrapper>
|
||||
class WrappedPtrOperations<JS::PropertyResult, Wrapper>
|
||||
{
|
||||
const JS::PropertyResult& value() const { return static_cast<const Wrapper*>(this)->get(); }
|
||||
|
||||
public:
|
||||
bool isFound() const { return value().isFound(); }
|
||||
explicit operator bool() const { return bool(value()); }
|
||||
js::Shape* maybeShape() const { return value().maybeShape(); }
|
||||
js::Shape* shape() const { return value().shape(); }
|
||||
bool isNativeProperty() const { return value().isNativeProperty(); }
|
||||
bool isNonNativeProperty() const { return value().isNonNativeProperty(); }
|
||||
bool isDenseOrTypedArrayElement() const { return value().isDenseOrTypedArrayElement(); }
|
||||
js::Shape* asTaggedShape() const { return value().asTaggedShape(); }
|
||||
};
|
||||
|
||||
template <class Wrapper>
|
||||
class MutableWrappedPtrOperations<JS::PropertyResult, Wrapper>
|
||||
: public WrappedPtrOperations<JS::PropertyResult, Wrapper>
|
||||
{
|
||||
JS::PropertyResult& value() { return static_cast<Wrapper*>(this)->get(); }
|
||||
|
||||
public:
|
||||
void setNotFound() {
|
||||
value().setNotFound();
|
||||
}
|
||||
void setNativeProperty(js::Shape* shape) {
|
||||
value().setNativeProperty(shape);
|
||||
}
|
||||
void setNonNativeProperty() {
|
||||
value().setNonNativeProperty();
|
||||
}
|
||||
void setDenseOrTypedArrayElement() {
|
||||
value().setDenseOrTypedArrayElement();
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace js
|
||||
|
||||
// JSClass operation signatures.
|
||||
|
||||
/**
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue