本文整理汇总了C++中PutPropertySlot类的典型用法代码示例。如果您正苦于以下问题:C++ PutPropertySlot类的具体用法?C++ PutPropertySlot怎么用?C++ PutPropertySlot使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了PutPropertySlot类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: getDirect
void JSObject::defineSetter(ExecState* exec, const Identifier& propertyName, JSObject* setterFunction, unsigned attributes)
{
JSValue object = getDirect(propertyName);
if (object && object.isGetterSetter()) {
ASSERT(m_structure->hasGetterSetterProperties());
asGetterSetter(object)->setSetter(setterFunction);
return;
}
PutPropertySlot slot;
GetterSetter* getterSetter = new (exec) GetterSetter(exec);
putDirectInternal(exec->globalData(), propertyName, getterSetter, attributes | Setter, true, slot);
// putDirect will change our Structure if we add a new property. For
// getters and setters, though, we also need to change our Structure
// if we override an existing non-getter or non-setter.
if (slot.type() != PutPropertySlot::NewProperty) {
if (!m_structure->isDictionary()) {
RefPtr<Structure> structure = Structure::getterSetterTransition(m_structure);
setStructure(structure.release());
}
}
m_structure->setHasGetterSetterProperties(true);
getterSetter->setSetter(setterFunction);
}
示例2: getDirect
void JSObject::defineSetter(ExecState* exec, const Identifier& propertyName, JSObject* setterFunction)
{
JSValue* object = getDirect(propertyName);
if (object && object->isGetterSetter()) {
ASSERT(m_structureID->hasGetterSetterProperties());
asGetterSetter(object)->setSetter(setterFunction);
return;
}
PutPropertySlot slot;
GetterSetter* getterSetter = new (exec) GetterSetter;
putDirect(propertyName, getterSetter, None, true, slot);
// putDirect will change our StructureID if we add a new property. For
// getters and setters, though, we also need to change our StructureID
// if we override an existing non-getter or non-setter.
if (slot.type() != PutPropertySlot::NewProperty) {
if (!m_structureID->isDictionary()) {
RefPtr<StructureID> structureID = StructureID::getterSetterTransition(m_structureID);
setStructureID(structureID.release());
}
}
m_structureID->setHasGetterSetterProperties(true);
getterSetter->setSetter(setterFunction);
}
示例3: put
void RegExpObject::put(JSCell* cell, ExecState* exec, PropertyName propertyName, JSValue value, PutPropertySlot& slot)
{
if (propertyName == exec->propertyNames().lastIndex) {
asRegExpObject(cell)->setLastIndex(exec, value, slot.isStrictMode());
slot.setCustomProperty(asRegExpObject(cell), slot.isStrictMode()
? regExpObjectSetLastIndexStrict
: regExpObjectSetLastIndexNonStrict);
return;
}
Base::put(cell, exec, propertyName, value, slot);
}
示例4: put
bool JSArrayBuffer::put(
JSCell* cell, ExecState* exec, PropertyName propertyName, JSValue value,
PutPropertySlot& slot)
{
JSArrayBuffer* thisObject = jsCast<JSArrayBuffer*>(cell);
if (UNLIKELY(isThisValueAltered(slot, thisObject)))
return ordinarySetSlow(exec, thisObject, propertyName, value, slot.thisValue(), slot.isStrictMode());
if (propertyName == exec->propertyNames().byteLength)
return reject(exec, slot.isStrictMode(), "Attempting to write to a read-only array buffer property.");
return Base::put(thisObject, exec, propertyName, value, slot);
}
示例5: put
void JSFunction::put(JSCell* cell, ExecState* exec, PropertyName propertyName, JSValue value, PutPropertySlot& slot)
{
JSFunction* thisObject = jsCast<JSFunction*>(cell);
if (thisObject->isHostFunction()) {
Base::put(thisObject, exec, propertyName, value, slot);
return;
}
if (propertyName == exec->propertyNames().prototype) {
// Make sure prototype has been reified, such that it can only be overwritten
// following the rules set out in ECMA-262 8.12.9.
PropertySlot slot;
thisObject->methodTable()->getOwnPropertySlot(thisObject, exec, propertyName, slot);
thisObject->m_allocationProfile.clear();
thisObject->m_allocationProfileWatchpoint.notifyWrite();
// Don't allow this to be cached, since a [[Put]] must clear m_allocationProfile.
PutPropertySlot dontCache;
Base::put(thisObject, exec, propertyName, value, dontCache);
return;
}
if (thisObject->jsExecutable()->isStrictMode() && (propertyName == exec->propertyNames().arguments || propertyName == exec->propertyNames().caller)) {
// This will trigger the property to be reified, if this is not already the case!
bool okay = thisObject->hasProperty(exec, propertyName);
ASSERT_UNUSED(okay, okay);
Base::put(thisObject, exec, propertyName, value, slot);
return;
}
if (propertyName == exec->propertyNames().arguments || propertyName == exec->propertyNames().length || propertyName == exec->propertyNames().name || propertyName == exec->propertyNames().caller) {
if (slot.isStrictMode())
throwTypeError(exec, StrictModeReadonlyPropertyWriteError);
return;
}
Base::put(thisObject, exec, propertyName, value, slot);
}
示例6: put
bool RegExpObject::put(JSCell* cell, ExecState* exec, PropertyName propertyName, JSValue value, PutPropertySlot& slot)
{
RegExpObject* thisObject = jsCast<RegExpObject*>(cell);
if (UNLIKELY(isThisValueAltered(slot, thisObject)))
return ordinarySetSlow(exec, thisObject, propertyName, value, slot.thisValue(), slot.isStrictMode());
if (propertyName == exec->propertyNames().lastIndex) {
bool result = asRegExpObject(cell)->setLastIndex(exec, value, slot.isStrictMode());
slot.setCustomValue(asRegExpObject(cell), slot.isStrictMode()
? regExpObjectSetLastIndexStrict
: regExpObjectSetLastIndexNonStrict);
return result;
}
return Base::put(cell, exec, propertyName, value, slot);
}
示例7: put
bool StringObject::put(JSCell* cell, ExecState* exec, PropertyName propertyName, JSValue value, PutPropertySlot& slot)
{
VM& vm = exec->vm();
auto scope = DECLARE_THROW_SCOPE(vm);
StringObject* thisObject = jsCast<StringObject*>(cell);
if (UNLIKELY(isThisValueAltered(slot, thisObject)))
return ordinarySetSlow(exec, thisObject, propertyName, value, slot.thisValue(), slot.isStrictMode());
if (propertyName == vm.propertyNames->length)
return typeError(exec, scope, slot.isStrictMode(), ASCIILiteral(ReadonlyPropertyWriteError));
if (Optional<uint32_t> index = parseIndex(propertyName))
return putByIndex(cell, exec, index.value(), value, slot.isStrictMode());
return JSObject::put(cell, exec, propertyName, value, slot);
}
示例8: put
void JSGlobalObject::put(JSCell* cell, ExecState* exec, PropertyName propertyName, JSValue value, PutPropertySlot& slot)
{
JSGlobalObject* thisObject = jsCast<JSGlobalObject*>(cell);
ASSERT(!Heap::heap(value) || Heap::heap(value) == Heap::heap(thisObject));
if (symbolTablePut(thisObject, exec, propertyName, value, slot.isStrictMode()))
return;
Base::put(thisObject, exec, propertyName, value, slot);
}
示例9: put
void StringObject::put(JSCell* cell, ExecState* exec, PropertyName propertyName, JSValue value, PutPropertySlot& slot)
{
if (propertyName == exec->propertyNames().length) {
if (slot.isStrictMode())
throwTypeError(exec, StrictModeReadonlyPropertyWriteError);
return;
}
JSObject::put(cell, exec, propertyName, value, slot);
}
示例10: put
void DebuggerScope::put(JSCell* cell, ExecState* exec, PropertyName propertyName, JSValue value, PutPropertySlot& slot)
{
DebuggerScope* scope = jsCast<DebuggerScope*>(cell);
ASSERT(scope->isValid());
if (!scope->isValid())
return;
JSObject* thisObject = JSScope::objectAtScope(scope->jsScope());
slot.setThisValue(JSValue(thisObject));
thisObject->methodTable()->put(thisObject, exec, propertyName, value, slot);
}
示例11: put
bool JSArrayBufferView::put(
JSCell* cell, ExecState* exec, PropertyName propertyName, JSValue value,
PutPropertySlot& slot)
{
JSArrayBufferView* thisObject = jsCast<JSArrayBufferView*>(cell);
if (UNLIKELY(isThisValueAltered(slot, thisObject)))
return ordinarySetSlow(exec, thisObject, propertyName, value, slot.thisValue(), slot.isStrictMode());
return Base::put(thisObject, exec, propertyName, value, slot);
}
示例12: put
void JSDataView::put(
JSCell* cell, ExecState* exec, PropertyName propertyName, JSValue value,
PutPropertySlot& slot)
{
JSDataView* thisObject = jsCast<JSDataView*>(cell);
if (propertyName == exec->propertyNames().byteLength
|| propertyName == exec->propertyNames().byteOffset) {
reject(exec, slot.isStrictMode(), "Attempting to write to read-only typed array property.");
return;
}
Base::put(thisObject, exec, propertyName, value, slot);
}
示例13: put
void JSArrayBuffer::put(
JSCell* cell, ExecState* exec, PropertyName propertyName, JSValue value,
PutPropertySlot& slot)
{
JSArrayBuffer* thisObject = jsCast<JSArrayBuffer*>(cell);
if (propertyName == exec->propertyNames().byteLength) {
reject(exec, slot.isStrictMode(), "Attempting to write to a read-only array buffer property.");
return;
}
Base::put(thisObject, exec, propertyName, value, slot);
}
示例14: put
void JSNameScope::put(JSCell* cell, ExecState* exec, PropertyName propertyName, JSValue value, PutPropertySlot& slot)
{
JSNameScope* thisObject = jsCast<JSNameScope*>(cell);
if (slot.isStrictMode()) {
// Double lookup in strict mode, but this only occurs when
// a) indirectly writing to an exception slot
// b) writing to a function expression name
// (a) is unlikely, and (b) is an error.
// Also with a single entry the symbol table lookup should simply be
// a pointer compare.
PropertySlot slot;
bool isWritable = true;
symbolTableGet(thisObject, propertyName, slot, isWritable);
if (!isWritable) {
throwError(exec, createTypeError(exec, StrictModeReadonlyPropertyWriteError));
return;
}
}
if (symbolTablePut(thisObject, exec, propertyName, value, slot.isStrictMode()))
return;
RELEASE_ASSERT_NOT_REACHED();
}
示例15: put
void JSLexicalEnvironment::put(JSCell* cell, ExecState* exec, PropertyName propertyName, JSValue value, PutPropertySlot& slot)
{
JSLexicalEnvironment* thisObject = jsCast<JSLexicalEnvironment*>(cell);
ASSERT(!Heap::heap(value) || Heap::heap(value) == Heap::heap(thisObject));
if (thisObject->symbolTablePut(exec, propertyName, value, slot.isStrictMode()))
return;
// We don't call through to JSObject because __proto__ and getter/setter
// properties are non-standard extensions that other implementations do not
// expose in the lexicalEnvironment object.
ASSERT(!thisObject->hasGetterSetterProperties());
thisObject->putOwnDataProperty(exec->vm(), propertyName, value, slot);
}