#ifndef JSActivation_h
#define JSActivation_h
#include "CodeBlock.h"
#include "JSVariableObject.h"
#include "SymbolTable.h"
#include "Nodes.h"
namespace JSC {
class Arguments;
class Register;
class JSActivation : public JSVariableObject {
private:
JSActivation(CallFrame*, FunctionExecutable*);
public:
typedef JSVariableObject Base;
static JSActivation* create(JSGlobalData& globalData, CallFrame* callFrame, FunctionExecutable* funcExec)
{
return new (allocateCell<JSActivation>(globalData.heap)) JSActivation(callFrame, funcExec);
}
virtual ~JSActivation();
virtual void visitChildren(SlotVisitor&);
virtual bool isDynamicScope(bool& requiresDynamicChecks) const;
virtual bool isActivationObject() const { return true; }
virtual bool getOwnPropertySlot(ExecState*, const Identifier&, PropertySlot&);
virtual void getOwnPropertyNames(ExecState*, PropertyNameArray&, EnumerationMode);
virtual void put(ExecState*, const Identifier&, JSValue, PutPropertySlot&);
virtual void putWithAttributes(ExecState*, const Identifier&, JSValue, unsigned attributes);
virtual bool deleteProperty(ExecState*, const Identifier& propertyName);
virtual JSObject* toThisObject(ExecState*) const;
virtual JSValue toStrictThisObject(ExecState*) const;
void copyRegisters(JSGlobalData&);
static const ClassInfo s_info;
static Structure* createStructure(JSGlobalData& globalData, JSValue proto) { return Structure::create(globalData, proto, TypeInfo(ObjectType, StructureFlags), AnonymousSlotCount, &s_info); }
protected:
static const unsigned StructureFlags = IsEnvironmentRecord | OverridesGetOwnPropertySlot | OverridesVisitChildren | OverridesGetPropertyNames | JSVariableObject::StructureFlags;
private:
bool symbolTableGet(const Identifier&, PropertySlot&);
bool symbolTableGet(const Identifier&, PropertyDescriptor&);
bool symbolTableGet(const Identifier&, PropertySlot&, bool& slotIsWriteable);
bool symbolTablePut(JSGlobalData&, const Identifier&, JSValue);
bool symbolTablePutWithAttributes(JSGlobalData&, const Identifier&, JSValue, unsigned attributes);
static JSValue argumentsGetter(ExecState*, JSValue, const Identifier&);
NEVER_INLINE PropertySlot::GetValueFunc getArgumentsGetter();
int m_numParametersMinusThis;
int m_numCapturedVars : 31;
bool m_requiresDynamicChecks : 1;
int m_argumentsRegister;
};
JSActivation* asActivation(JSValue);
inline JSActivation* asActivation(JSValue value)
{
ASSERT(asObject(value)->inherits(&JSActivation::s_info));
return static_cast<JSActivation*>(asObject(value));
}
ALWAYS_INLINE JSActivation* Register::activation() const
{
return asActivation(jsValue());
}
}
#endif // JSActivation_h