/*
* Copyright (C) 1999-2001 Harri Porten (porten@kde.org)
* Copyright (C) 2001 Peter Kelly (pmk@post.com)
- * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
+ * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
#include "JSCell.h"
+#include "CallFrame.h"
+#include "Structure.h"
+
namespace JSC {
class JSObject;
// This is an internal value object which stores getter and setter functions
// for a property.
class GetterSetter : public JSCell {
- public:
- GetterSetter()
- : JSCell(0)
- , m_getter(0)
- , m_setter(0)
+ friend class JIT;
+
+ private:
+ GetterSetter(VM& vm)
+ : JSCell(vm, vm.getterSetterStructure.get())
{
}
- virtual void mark();
+ public:
+ typedef JSCell Base;
- JSObject* getter() const { return m_getter; }
- void setGetter(JSObject* getter) { m_getter = getter; }
- JSObject* setter() const { return m_setter; }
- void setSetter(JSObject* setter) { m_setter = setter; }
+ static GetterSetter* create(VM& vm)
+ {
+ GetterSetter* getterSetter = new (NotNull, allocateCell<GetterSetter>(vm.heap)) GetterSetter(vm);
+ getterSetter->finishCreation(vm);
+ return getterSetter;
+ }
- private:
- virtual bool isGetterSetter() const;
+ static void visitChildren(JSCell*, SlotVisitor&);
- virtual JSValue toPrimitive(ExecState*, PreferredPrimitiveType) const;
- virtual bool getPrimitiveNumber(ExecState*, double& number, JSValue& value);
- virtual bool toBoolean(ExecState*) const;
- virtual double toNumber(ExecState*) const;
- virtual UString toString(ExecState*) const;
- virtual JSObject* toObject(ExecState*) const;
+ JSObject* getter() const { return m_getter.get(); }
+ void setGetter(VM& vm, JSObject* getter) { m_getter.setMayBeNull(vm, this, getter); }
+ JSObject* setter() const { return m_setter.get(); }
+ void setSetter(VM& vm, JSObject* setter) { m_setter.setMayBeNull(vm, this, setter); }
+ static Structure* createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype)
+ {
+ return Structure::create(vm, globalObject, prototype, TypeInfo(GetterSetterType, OverridesVisitChildren), info());
+ }
+
+ static ptrdiff_t offsetOfGetter()
+ {
+ return OBJECT_OFFSETOF(GetterSetter, m_getter);
+ }
+
+ static ptrdiff_t offsetOfSetter()
+ {
+ return OBJECT_OFFSETOF(GetterSetter, m_setter);
+ }
+
+ DECLARE_INFO;
- JSObject* m_getter;
- JSObject* m_setter;
+ private:
+ WriteBarrier<JSObject> m_getter;
+ WriteBarrier<JSObject> m_setter;
};
GetterSetter* asGetterSetter(JSValue);
inline GetterSetter* asGetterSetter(JSValue value)
{
- ASSERT(asCell(value)->isGetterSetter());
- return static_cast<GetterSetter*>(asCell(value));
+ ASSERT_WITH_SECURITY_IMPLICATION(value.asCell()->isGetterSetter());
+ return static_cast<GetterSetter*>(value.asCell());
}
+ JSValue callGetter(ExecState*, JSValue base, JSValue getterSetter);
+ void callSetter(ExecState*, JSValue base, JSValue getterSetter, JSValue value, ECMAMode);
} // namespace JSC