njs_inline njs_bool_t
njs_is_data_descriptor(njs_object_prop_t *prop)
{
- return prop->writable != NJS_ATTRIBUTE_UNSET || njs_is_valid(&prop->value);
+ return njs_is_valid(&prop->value) ||
+ prop->writable != NJS_ATTRIBUTE_UNSET ||
+ prop->type == NJS_PROPERTY_HANDLER;
}
* the property's attributes to their default values.
*/
+ if (pq.temp) {
+ pq.lhq.value = NULL;
+ prop->configurable = prev->configurable;
+ prop->enumerable = prev->enumerable;
+ goto set_prop;
+ }
+
+ prev->type = prop->type;
+
if (njs_is_data_descriptor(prev)) {
njs_set_undefined(&prev->getter);
njs_set_undefined(&prev->setter);
done:
- if (njs_is_valid(&prop->value) || njs_is_accessor_descriptor(prop)) {
+ if (njs_is_valid(&prop->value)) {
if (prev->type == NJS_PROPERTY_HANDLER) {
if (prev->writable) {
ret = prev->value.data.u.prop_handler(vm, prev, object,
return NJS_DECLINED;
}
+ pq->temp = 1;
prop = &pq->scratch;
njs_memzero(prop, sizeof(njs_object_prop_t));
njs_object_prop_t *own_whiteout;
uint8_t query;
uint8_t shared;
+ uint8_t temp;
uint8_t own;
} njs_property_query_t;
(pq)->query = _query; \
(pq)->shared = 0; \
(pq)->own = _own; \
+ (pq)->temp = 0; \
} while (0)
"fn(1); arr"),
njs_str("1,2,3,4,5,6") },
+ { njs_str("function f(){};"
+ "Object.defineProperty(f, 'length', {set: () => {}});"
+ "Object.defineProperty(f, 'length', {value: 42});"
+ "f.length"),
+ njs_str("42") },
+
/* Function nesting depth. */
{ njs_str("() => () => () => () => () => () => () => () => () => () => () =>"