#include "CallData.h"
#include "ConstructData.h"
+#include "EnumerationMode.h"
#include "Heap.h"
#include "IndexingType.h"
#include "JSLock.h"
class CopyVisitor;
class ExecState;
+class Identifier;
class JSArrayBufferView;
class JSDestructibleObject;
class JSGlobalObject;
class PropertyNameArray;
class Structure;
-enum EnumerationMode {
- ExcludeDontEnumProperties,
- IncludeDontEnumProperties
-};
-
template<typename T> void* allocateCell(Heap&);
template<typename T> void* allocateCell(Heap&, size_t);
static const unsigned StructureFlags = 0;
static const bool needsDestruction = false;
- static const bool hasImmortalStructure = false;
+
+ static JSCell* seenMultipleCalleeObjects() { return bitwise_cast<JSCell*>(static_cast<uintptr_t>(1)); }
enum CreatingEarlyCellTag { CreatingEarlyCell };
JSCell(CreatingEarlyCellTag);
public:
// Querying the type.
bool isString() const;
+ bool isSymbol() const;
bool isObject() const;
bool isGetterSetter() const;
bool isCustomGetterSetter() const;
const char* className() const;
+ VM* vm() const;
+
// Extracting the value.
JS_EXPORT_PRIVATE bool getString(ExecState*, String&) const;
JS_EXPORT_PRIVATE String getString(ExecState*) const; // null string if not a string
JS_EXPORT_PRIVATE JSObject* getObject(); // NULL if not an object
const JSObject* getObject() const; // NULL if not an object
+ // Returns information about how to call/construct this cell as a function/constructor. May tell
+ // you that the cell is not callable or constructor (default is that it's not either). If it
+ // says that the function is callable, and the TypeOfShouldCallGetCallData type flag is set, and
+ // this is an object, then typeof will return "function" instead of "object". These methods
+ // cannot change their minds and must be thread-safe. They are sometimes called from compiler
+ // threads.
JS_EXPORT_PRIVATE static CallType getCallData(JSCell*, CallData&);
JS_EXPORT_PRIVATE static ConstructType getConstructData(JSCell*, ConstructData&);
bool isZapped() const { return !*reinterpret_cast<uintptr_t* const*>(this); }
static bool canUseFastGetOwnProperty(const Structure&);
- JSValue fastGetOwnProperty(VM&, Structure&, const String&);
+ JSValue fastGetOwnProperty(VM&, Structure&, PropertyName);
enum GCData : uint8_t {
- Marked = 0,
- NotMarked = 1,
- MarkedAndRemembered = 2,
+ Marked = 0, // The object has survived a GC and is in the old gen.
+ NotMarked = 1, // The object is new and in the eden gen.
+ MarkedAndRemembered = 2, // The object is in the GC's remembered set.
+
+ // The object being in the GC's remembered set implies that it is also
+ // Marked. This is because objects are only added to the remembered sets
+ // by write barriers, and write barriers are only interested in old gen
+ // objects that point to potential eden gen objects.
};
void setMarked() { m_gcData = Marked; }
static NO_RETURN_DUE_TO_CRASH void getOwnPropertyNames(JSObject*, ExecState*, PropertyNameArray&, EnumerationMode);
static NO_RETURN_DUE_TO_CRASH void getOwnNonIndexPropertyNames(JSObject*, ExecState*, PropertyNameArray&, EnumerationMode);
static NO_RETURN_DUE_TO_CRASH void getPropertyNames(JSObject*, ExecState*, PropertyNameArray&, EnumerationMode);
+
+ static uint32_t getEnumerableLength(ExecState*, JSObject*);
+ static NO_RETURN_DUE_TO_CRASH void getStructurePropertyNames(JSObject*, ExecState*, PropertyNameArray&, EnumerationMode);
+ static NO_RETURN_DUE_TO_CRASH void getGenericPropertyNames(JSObject*, ExecState*, PropertyNameArray&, EnumerationMode);
+
static String className(const JSObject*);
JS_EXPORT_PRIVATE static bool customHasInstance(JSObject*, ExecState*, JSValue);
static bool defineOwnProperty(JSObject*, ExecState*, PropertyName, const PropertyDescriptor&, bool shouldThrow);
template<typename To, typename From>
inline To jsCast(From* from)
{
- ASSERT(!from || from->JSCell::inherits(std::remove_pointer<To>::type::info()));
+ ASSERT_WITH_SECURITY_IMPLICATION(!from || from->JSCell::inherits(std::remove_pointer<To>::type::info()));
return static_cast<To>(from);
}
template<typename To>
inline To jsCast(JSValue from)
{
- ASSERT(from.isCell() && from.asCell()->JSCell::inherits(std::remove_pointer<To>::type::info()));
+ ASSERT_WITH_SECURITY_IMPLICATION(from.isCell() && from.asCell()->JSCell::inherits(std::remove_pointer<To>::type::info()));
return static_cast<To>(from.asCell());
}