} while (proto != NULL);
if (njs_slow_path(proto == NULL)) {
- njs_internal_error(vm, "no array in proto chain");
- return NJS_ERROR;
+ njs_set_undefined(retval);
+ return NJS_DECLINED;
}
array = (njs_array_t *) proto;
}
if (proto->type != NJS_ARRAY) {
+ njs_set_undefined(retval);
return NJS_DECLINED;
}
if (njs_is_valid(&prop->value)) {
if (prev->type == NJS_PROPERTY_HANDLER) {
if (njs_is_data_descriptor(prev) && prev->writable) {
- ret = prev->value.data.u.prop_handler(vm, object,
- &prop->value,
- &vm->retval);
- if (njs_slow_path(ret != NJS_OK)) {
+ ret = prev->value.data.u.prop_handler(vm, object, &prop->value,
+ &vm->retval);
+ if (njs_slow_path(ret == NJS_ERROR)) {
return ret;
}
}
prop = &pq.scratch;
ret = prop->value.data.u.prop_handler(vm, value, NULL,
&prop->value);
- if (njs_slow_path(ret != NJS_OK)) {
+ if (njs_slow_path(ret == NJS_ERROR)) {
return ret;
}
ret = prop->value.data.u.prop_handler(vm, value, NULL,
&prop->value);
- if (njs_slow_path(ret != NJS_OK)) {
+ if (njs_slow_path(ret == NJS_ERROR)) {
return ret;
}
*retval = prop->value;
+
break;
default:
if (prop->type == NJS_PROPERTY_HANDLER) {
ret = prop->value.data.u.prop_handler(vm, value, setval,
&vm->retval);
- if (ret != NJS_DECLINED) {
+ if (njs_slow_path(ret != NJS_DECLINED)) {
return ret;
}
}
* njs_prop_handler_t is expected to return:
* NJS_OK - handler executed successfully;
* NJS_ERROR - some error, vm->retval contains appropriate exception;
- * NJS_DECLINED - handler was applied to inappropriate object.
+ * NJS_DECLINED - handler was applied to inappropriate object, vm->retval
+ * contains undefined value.
*/
typedef njs_int_t (*njs_prop_handler_t) (njs_vm_t *vm, njs_value_t *value,
njs_value_t *setval, njs_value_t *retval);
if (prop->type == NJS_PROPERTY_HANDLER) {
ret = prop->value.data.u.prop_handler(vm, value, init,
&vm->retval);
- if (njs_slow_path(ret != NJS_OK)) {
+ if (njs_slow_path(ret == NJS_ERROR)) {
return ret;
}
- break;
+ if (ret == NJS_OK) {
+ break;
+ }
+
+ /* NJS_DECLINED */
}
}
}
if (njs_is_external(value)) {
ret = prop->value.data.u.prop_handler(vm, value, NULL, NULL);
if (njs_slow_path(ret != NJS_OK)) {
- return ret;
+ return NJS_ERROR;
}
goto done;
"Object.getPrototypeOf(o) === Object.prototype"),
njs_str("true") },
+ { njs_str("var o = {__proto__: Array.prototype, length:3}; o.fill('a')[2]"),
+ njs_str("a") },
+
{ njs_str("({}).__proto__.constructor === Object"),
njs_str("true") },