/* GC */
prop->value = *retval;
- prop->enumerable = 0;
+ prop->enumerable = self->enumerable;
lhq.value = prop;
njs_string_get(&self->name, &lhq.key);
.value = njs_prop_handler2(njs_top_level_object, NJS_OBJECT_NJS,
NJS_NJS_HASH),
.writable = 1,
+ .enumerable = 1,
.configurable = 1,
},
.value = njs_prop_handler2(njs_top_level_object, NJS_OBJECT_PROCESS,
NJS_PROCESS_HASH),
.writable = 1,
+ .enumerable = 1,
.configurable = 1,
},
{ njs_str("Object.getOwnPropertyNames(this).includes('NaN')"),
njs_str("true") },
+ { njs_str("Object.keys(this)"),
+ njs_str("njs,process") },
+
{ njs_str("this.a = 1; this.a"),
njs_str("1") },
{ njs_str("var global = this;"
"function isMutableObject(v) {"
" var d = Object.getOwnPropertyDescriptor(global, v);"
- " return d.writable && !d.enumerable && d.configurable;"
+ " /* Custom top-level objects are enumerable. */"
+ " var enumerable = (v in {'njs':1, 'process':1}) ^ !d.enumerable;"
+ " return d.writable && enumerable && d.configurable;"
"};"
"['njs', 'process', 'Math', 'JSON'].every((v)=>isMutableObject(v))"),
njs_str("true") },