JSLexicalEnvironment.h [plain text]
#ifndef JSLexicalEnvironment_h
#define JSLexicalEnvironment_h
#include "CodeBlock.h"
#include "CopiedSpaceInlines.h"
#include "JSEnvironmentRecord.h"
#include "SymbolTable.h"
namespace JSC {
class Register;
class JSLexicalEnvironment : public JSEnvironmentRecord {
private:
JSLexicalEnvironment(VM&, Structure*, JSScope*, SymbolTable*);
public:
typedef JSEnvironmentRecord Base;
static const unsigned StructureFlags = Base::StructureFlags | OverridesGetOwnPropertySlot | OverridesGetPropertyNames;
static JSLexicalEnvironment* create(
VM& vm, Structure* structure, JSScope* currentScope, SymbolTable* symbolTable)
{
JSLexicalEnvironment* result =
new (
NotNull,
allocateCell<JSLexicalEnvironment>(vm.heap, allocationSize(symbolTable)))
JSLexicalEnvironment(vm, structure, currentScope, symbolTable);
result->finishCreation(vm);
return result;
}
static JSLexicalEnvironment* create(VM& vm, CallFrame* callFrame, JSScope* currentScope, CodeBlock* codeBlock)
{
JSGlobalObject* globalObject = callFrame->lexicalGlobalObject();
Structure* structure = globalObject->activationStructure();
SymbolTable* symbolTable = codeBlock->symbolTable();
return create(vm, structure, currentScope, symbolTable);
}
static bool getOwnPropertySlot(JSObject*, ExecState*, PropertyName, PropertySlot&);
static void getOwnNonIndexPropertyNames(JSObject*, ExecState*, PropertyNameArray&, EnumerationMode);
static void put(JSCell*, ExecState*, PropertyName, JSValue, PutPropertySlot&);
static bool deleteProperty(JSCell*, ExecState*, PropertyName);
static JSValue toThis(JSCell*, ExecState*, ECMAMode);
DECLARE_INFO;
static Structure* createStructure(VM& vm, JSGlobalObject* globalObject) { return Structure::create(vm, globalObject, jsNull(), TypeInfo(ActivationObjectType, StructureFlags), info()); }
private:
bool symbolTableGet(PropertyName, PropertySlot&);
bool symbolTableGet(PropertyName, PropertyDescriptor&);
bool symbolTableGet(PropertyName, PropertySlot&, bool& slotIsWriteable);
bool symbolTablePut(ExecState*, PropertyName, JSValue, bool shouldThrow);
bool symbolTablePutWithAttributes(VM&, PropertyName, JSValue, unsigned attributes);
};
inline JSLexicalEnvironment::JSLexicalEnvironment(VM& vm, Structure* structure, JSScope* currentScope, SymbolTable* symbolTable)
: Base(vm, structure, currentScope, symbolTable)
{
}
inline JSLexicalEnvironment* asActivation(JSValue value)
{
ASSERT(asObject(value)->inherits(JSLexicalEnvironment::info()));
return jsCast<JSLexicalEnvironment*>(asObject(value));
}
ALWAYS_INLINE JSLexicalEnvironment* Register::lexicalEnvironment() const
{
return asActivation(jsValue());
}
}
#endif // JSLexicalEnvironment_h