ret = njs_lvlhsh_find(&object->hash, lhq);
if (njs_fast_path(ret == NJS_OK)) {
- goto found;
+ prop = lhq->value;
+
+ if (prop->type != NJS_WHITEOUT) {
+ goto found;
+ }
}
ret = njs_lvlhsh_find(&object->shared_hash, lhq);
return NJS_ERROR;
}
- /* GC: release value. */
if (removed != NULL) {
- njs_value_assign(removed, njs_prop_value(prop));
+ if (njs_is_valid(njs_prop_value(prop))) {
+ njs_value_assign(removed, njs_prop_value(prop));
+
+ } else {
+ njs_set_undefined(removed);
+ }
}
prop->type = NJS_WHITEOUT;
- njs_set_invalid(njs_prop_value(prop));
return NJS_OK;
}
{ njs_str("var a = []; Object.defineProperty(a, 'b', {enumerable: true, get: Object}); a" ENTER),
njs_str("[\n b: '[Getter]'\n]") },
+ { njs_str("var e = Error()" ENTER
+ "Object.defineProperty(e, 'message', { configurable: true, set: Object })" ENTER
+ "delete e.message; e" ENTER),
+ njs_str("Error") },
+
+ { njs_str("var e = Error()" ENTER
+ "Object.defineProperty(e, 'message', { configurable: true, get(){ return 'foo'} })" ENTER
+ "e" ENTER),
+ njs_str("Error: foo") },
+
/* Temporary indexes */
{ njs_str("var a = [1,2,3], i; for (i in a) {Object.seal({});}" ENTER),