本文整理汇总了C++中PropDesc::hasWritable方法的典型用法代码示例。如果您正苦于以下问题:C++ PropDesc::hasWritable方法的具体用法?C++ PropDesc::hasWritable怎么用?C++ PropDesc::hasWritable使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类PropDesc
的用法示例。
在下文中一共展示了PropDesc::hasWritable方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: val
bool
DenseElementsHeader::defineElement(JSContext *cx, Handle<ObjectImpl*> obj, uint32_t index,
const PropDesc &desc, bool shouldThrow, unsigned resolveFlags,
bool *succeeded)
{
MOZ_ASSERT(this == &obj->elementsHeader());
MOZ_ASSERT_IF(desc.hasGet() || desc.hasSet(), !desc.hasValue() && !desc.hasWritable());
MOZ_ASSERT_IF(desc.hasValue() || desc.hasWritable(), !desc.hasGet() && !desc.hasSet());
/*
* If desc is an accessor descriptor or a data descriptor with atypical
* attributes, convert to sparse and retry.
*/
if (desc.hasGet() || desc.hasSet() ||
(desc.hasEnumerable() && !desc.enumerable()) ||
(desc.hasConfigurable() && !desc.configurable()) ||
(desc.hasWritable() && !desc.writable()))
{
if (!obj->makeElementsSparse(cx))
return false;
SparseElementsHeader &elts = obj->elementsHeader().asSparseElements();
return elts.defineElement(cx, obj, index, desc, shouldThrow, resolveFlags, succeeded);
}
/* Does the element exist? All behavior depends upon this. */
uint32_t initLen = initializedLength();
if (index < initLen) {
HeapSlot &slot = obj->elements[index];
if (!slot.isMagic(JS_ELEMENTS_HOLE)) {
/*
* The element exists with attributes { [[Enumerable]]: true,
* [[Configurable]]: true, [[Writable]]: true, [[Value]]: slot }.
*/
// XXX jwalden fill this in!
}
}
/*
* If the element doesn't exist, we can only add it if the object is
* extensible.
*/
if (!obj->isExtensible()) {
*succeeded = false;
if (!shouldThrow)
return true;
RootedValue val(cx, ObjectValue(*obj));
MOZ_ALWAYS_FALSE(js_ReportValueErrorFlags(cx, JSREPORT_ERROR, JSMSG_OBJECT_NOT_EXTENSIBLE,
JSDVG_IGNORE_STACK,
val, NullPtr(),
NULL, NULL));
return false;
}
/* Otherwise we ensure space for it exists and that it's initialized. */
ObjectImpl::DenseElementsResult res = obj->ensureDenseElementsInitialized(cx, index, 0);
/* Propagate any error. */
if (res == ObjectImpl::Failure)
return false;
/* Otherwise, if the index was too far out of range, go sparse. */
if (res == ObjectImpl::ConvertToSparse) {
if (!obj->makeElementsSparse(cx))
return false;
SparseElementsHeader &elts = obj->elementsHeader().asSparseElements();
return elts.defineElement(cx, obj, index, desc, shouldThrow, resolveFlags, succeeded);
}
/* But if we were able to ensure the element's existence, we're good. */
MOZ_ASSERT(res == ObjectImpl::Succeeded);
obj->elements[index].set(obj->asObjectPtr(), HeapSlot::Element, index, desc.value());
*succeeded = true;
return true;
}