summaryrefslogtreecommitdiffstats
path: root/js/src/vm/ObjectFlags.h
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/vm/ObjectFlags.h')
-rw-r--r--js/src/vm/ObjectFlags.h95
1 files changed, 95 insertions, 0 deletions
diff --git a/js/src/vm/ObjectFlags.h b/js/src/vm/ObjectFlags.h
new file mode 100644
index 0000000000..b27d278b62
--- /dev/null
+++ b/js/src/vm/ObjectFlags.h
@@ -0,0 +1,95 @@
+/* -*- 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_ObjectFlags_h
+#define vm_ObjectFlags_h
+
+#include <stdint.h>
+
+#include "util/EnumFlags.h" // js::EnumFlags
+
+namespace js {
+
+// Flags set on the Shape which describe the referring object. Once set these
+// cannot be unset (except during object densification of sparse indexes), and
+// are transferred from shape to shape as the object's last property changes.
+//
+// If you add a new flag here, please add appropriate code to JSObject::dump to
+// dump it as part of the object representation.
+enum class ObjectFlag : uint16_t {
+ IsUsedAsPrototype = 1 << 0,
+ NotExtensible = 1 << 1,
+ Indexed = 1 << 2,
+ HasInterestingSymbol = 1 << 3,
+
+ // If set, the shape's property map may contain an enumerable property. This
+ // only accounts for (own) shape properties: if the flag is not set, the
+ // object may still have (enumerable) dense elements, typed array elements, or
+ // a JSClass enumeration hook.
+ HasEnumerable = 1 << 4,
+
+ FrozenElements = 1 << 5, // See ObjectElements::FROZEN comment.
+
+ // If set, the shape teleporting optimization can no longer be used for
+ // accessing properties on this object.
+ // See: JSObject::hasInvalidatedTeleporting, ProtoChainSupportsTeleporting.
+ InvalidatedTeleporting = 1 << 6,
+
+ ImmutablePrototype = 1 << 7,
+
+ // See JSObject::isQualifiedVarObj().
+ QualifiedVarObj = 1 << 8,
+
+ // If set, the object may have a non-writable property or an accessor
+ // property.
+ //
+ // * This is only set for PlainObjects because we only need it for these
+ // objects and setting it for other objects confuses insertInitialShape.
+ //
+ // * This flag does not account for properties named "__proto__". This is
+ // because |Object.prototype| has a "__proto__" accessor property and we
+ // don't want to include it because it would result in the flag being set on
+ // most proto chains. Code using this flag must check for "__proto__"
+ // property names separately.
+ HasNonWritableOrAccessorPropExclProto = 1 << 9,
+
+ // If set, the object either mutated or deleted an accessor property. This is
+ // used to invalidate IC/Warp code specializing on specific getter/setter
+ // objects. See also the SMDOC comment in vm/GetterSetter.h.
+ HadGetterSetterChange = 1 << 10,
+
+ // If set, use the watchtower testing mechanism to log changes to this object.
+ UseWatchtowerTestingLog = 1 << 11,
+
+ // If set, access to existing properties of this global object can be guarded
+ // based on a per-global counter that is incremented when the global object
+ // has its properties reordered/shadowed, instead of a shape guard.
+ GenerationCountedGlobal = 1 << 12,
+
+ // If set, we need to verify the result of a proxy get/set trap.
+ //
+ // The [[Get]] and [[Set]] traps for proxy objects enforce certain invariants
+ // for non-configurable, non-writable data properties and non-configurable
+ // accessors. If the invariants are not maintained, we must throw a type
+ // error. If this flag is not set, and this is a NativeObject, *and* the
+ // class does not have a resolve hook, then this object does not have any
+ // such properties, and we can skip the slow check.
+ //
+ // See
+ // https://tc39.es/ecma262/#sec-proxy-object-internal-methods-and-internal-slots
+ NeedsProxyGetSetResultValidation = 1 << 13,
+
+ // There exists a property on this object which has fuse semantics associated
+ // with it, and thus we must trap on changes to said property.
+ HasFuseProperty = 1 << 14,
+
+};
+
+using ObjectFlags = EnumFlags<ObjectFlag>;
+
+} // namespace js
+
+#endif /* vm_ObjectFlags_h */