From: Dmitry Volyntsev Date: Thu, 31 Oct 2019 16:53:21 +0000 (+0300) Subject: Fixed getter/setter proto. X-Git-Url: http://www.kaiwu.me/postgresql/commit/?a=commitdiff_plain;h=45e04212e441c571292db120b52c6ce611218c31;p=njs.git Fixed getter/setter proto. This closes #238 issue on Github. --- diff --git a/src/njs_function.c b/src/njs_function.c index d43bfb28..e72d8cdb 100644 --- a/src/njs_function.c +++ b/src/njs_function.c @@ -90,6 +90,13 @@ njs_function_value_copy(njs_vm_t *vm, njs_value_t *value) return NULL; } + if (copy->ctor) { + copy->object.shared_hash = vm->shared->function_instance_hash; + + } else { + copy->object.shared_hash = vm->shared->arrow_instance_hash; + } + value->data.u.function = copy; return copy; diff --git a/src/njs_object_prop.c b/src/njs_object_prop.c index 546b9023..87bbbbd5 100644 --- a/src/njs_object_prop.c +++ b/src/njs_object_prop.c @@ -381,8 +381,6 @@ njs_prop_private_copy(njs_vm_t *vm, njs_property_query_t *pq) njs_object_prop_t *prop, *shared, *name; njs_lvlhsh_query_t lhq; - static const njs_value_t name_string = njs_string("name"); - prop = njs_mp_align(vm->mem_pool, sizeof(njs_value_t), sizeof(njs_object_prop_t)); if (njs_slow_path(prop == NULL)) { @@ -403,6 +401,32 @@ njs_prop_private_copy(njs_vm_t *vm, njs_property_query_t *pq) return NJS_ERROR; } + if (njs_is_accessor_descriptor(prop)) { + if (njs_is_function(&prop->getter)) { + function = njs_function_value_copy(vm, &prop->getter); + if (njs_slow_path(function == NULL)) { + return NJS_ERROR; + } + + if (njs_is_function(&prop->setter) + && function->native && njs_function(&prop->setter)->native + && function->u.native == njs_function(&prop->setter)->u.native) + { + prop->setter = prop->getter; + return NJS_OK; + } + } + + if (njs_is_function(&prop->setter)) { + function = njs_function_value_copy(vm, &prop->setter); + if (njs_slow_path(function == NULL)) { + return NJS_ERROR; + } + } + + return NJS_OK; + } + if (!njs_is_function(&prop->value)) { return NJS_OK; } @@ -412,14 +436,7 @@ njs_prop_private_copy(njs_vm_t *vm, njs_property_query_t *pq) return NJS_ERROR; } - if (function->ctor) { - function->object.shared_hash = vm->shared->function_instance_hash; - - } else { - function->object.shared_hash = vm->shared->arrow_instance_hash; - } - - name = njs_object_prop_alloc(vm, &name_string, &prop->name, 0); + name = njs_object_prop_alloc(vm, &njs_string_name, &prop->name, 0); if (njs_slow_path(name == NULL)) { return NJS_ERROR; } diff --git a/src/test/njs_unit_test.c b/src/test/njs_unit_test.c index ad5133ef..65c3b19e 100644 --- a/src/test/njs_unit_test.c +++ b/src/test/njs_unit_test.c @@ -8111,6 +8111,14 @@ static njs_unit_test_t njs_test[] = { njs_str("(function() {}).arguments"), njs_str("TypeError: \"caller\", \"callee\", \"arguments\" properties may not be accessed") }, + { njs_str("var desc = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(Math.min), 'caller');" + "desc.get === desc.set"), + njs_str("true") }, + + { njs_str("var desc = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(Math.min), 'caller');" + "1/desc.get"), + njs_str("NaN") }, + { njs_str("var p = Object.getPrototypeOf(function() {});" "var d = Object.getOwnPropertyDescriptor(p, 'caller');" "typeof d.get == 'function' && typeof d.get == typeof d.set"