This closes #172 issue on Github.
njs_ret_t
-njs_method_private_copy(njs_vm_t *vm, njs_property_query_t *pq)
+njs_prop_private_copy(njs_vm_t *vm, njs_property_query_t *pq)
{
nxt_int_t ret;
njs_function_t *function;
shared = pq->lhq.value;
*prop = *shared;
+ pq->lhq.replace = 0;
+ pq->lhq.value = prop;
+ pq->lhq.pool = vm->mem_pool;
+
+ ret = nxt_lvlhsh_insert(&pq->prototype->hash, &pq->lhq);
+ if (nxt_slow_path(ret != NXT_OK)) {
+ njs_internal_error(vm, "lvlhsh insert failed");
+ return NXT_ERROR;
+ }
+
+ if (!njs_is_function(&prop->value)) {
+ return NXT_OK;
+ }
+
function = njs_function_value_copy(vm, &prop->value);
if (nxt_slow_path(function == NULL)) {
return NXT_ERROR;
return NXT_ERROR;
}
- pq->lhq.replace = 0;
- pq->lhq.value = prop;
- pq->lhq.pool = vm->mem_pool;
-
- return nxt_lvlhsh_insert(&pq->prototype->hash, &pq->lhq);
+ return NXT_OK;
}
/* Updating existing prop. */
+ if (nxt_slow_path(pq.shared)) {
+ ret = njs_prop_private_copy(vm, &pq);
+
+ if (nxt_slow_path(ret != NXT_OK)) {
+ return ret;
+ }
+ }
+
current = pq.lhq.value;
switch (current->type) {
case NJS_PROPERTY:
+ case NJS_METHOD:
break;
case NJS_PROPERTY_REF:
case NJS_METHOD:
if (pq.shared) {
- ret = njs_method_private_copy(vm, &pq);
+ ret = njs_prop_private_copy(vm, &pq);
if (nxt_slow_path(ret != NXT_OK)) {
return ret;
njs_ret_t njs_object_prototype_to_string(njs_vm_t *vm, njs_value_t *args,
nxt_uint_t nargs, njs_index_t unused);
-njs_ret_t njs_method_private_copy(njs_vm_t *vm, njs_property_query_t *pq);
+njs_ret_t njs_prop_private_copy(njs_vm_t *vm, njs_property_query_t *pq);
const char * njs_prop_type_string(njs_object_property_type_t type);
extern const njs_object_init_t njs_object_constructor_init;
case NJS_METHOD:
if (pq.shared) {
- ret = njs_method_private_copy(vm, &pq);
+ ret = njs_prop_private_copy(vm, &pq);
if (nxt_slow_path(ret != NXT_OK)) {
return ret;
{ nxt_string("var o = {}; Object.defineProperty(o)"),
nxt_string("TypeError: descriptor is not an object") },
+ { nxt_string("Object.defineProperty(Function.prototype, 'name', {value:'x'}).name"),
+ nxt_string("x") },
+
+ { nxt_string("Object.defineProperty(Function.prototype, 'xxx', {value:'x'}).xxx"),
+ nxt_string("x") },
+
+ { nxt_string("Object.defineProperty(Object, 'name', {value:'x'}).name"),
+ nxt_string("x") },
+
+ { nxt_string("Object.defineProperty(Object.prototype, 'toString', {value:1}).toString"),
+ nxt_string("1") },
+
{ nxt_string("var o = Object.defineProperties({}, {a:{value:1}}); o.a"),
nxt_string("1") },