]> git.kaiwu.me - njs.git/commitdiff
Fixed property setter lookup.
authorArtem S. Povalyukhin <artem.povaluhin@gmail.com>
Sat, 20 Jul 2019 10:31:59 +0000 (13:31 +0300)
committerArtem S. Povalyukhin <artem.povaluhin@gmail.com>
Sat, 20 Jul 2019 10:31:59 +0000 (13:31 +0300)
njs/njs_object_property.c
njs/test/njs_unit_test.c

index 1934c0c5c79fed2bd558d919eb405c248ee25d24..90c94b6f3607116bc47b7787beebf170aca75745 100644 (file)
@@ -599,7 +599,12 @@ njs_value_property_set(njs_vm_t *vm, njs_value_t *object,
                 return NXT_ERROR;
             }
 
-        } else if (!njs_is_function(&prop->setter)) {
+        } else {
+            if (njs_is_function(&prop->setter)) {
+                return njs_function_call(vm, njs_function(&prop->setter),
+                                         object, value, 1, &vm->retval);
+            }
+
             njs_type_error(vm,
                      "Cannot set property \"%V\" of %s which has only a getter",
                            &pq.lhq.key, njs_type_string(object->type));
@@ -623,11 +628,6 @@ njs_value_property_set(njs_vm_t *vm, njs_value_t *object,
                     break;
                 }
 
-                if (njs_is_function(&prop->setter)) {
-                    return njs_function_call(vm, njs_function(&prop->setter),
-                                             object, value, 1, &vm->retval);
-                }
-
                 goto found;
 
             case NJS_PROPERTY_REF:
index 9b922bd4cef184396820452b7d2f73394fbb236f..f5d1f9ed4056fe7865443db8601a58f8e61a749b 100644 (file)
@@ -9629,6 +9629,10 @@ static njs_unit_test_t  njs_test[] =
                  "Object.defineProperty(o, 'a', {get:()=>1}); o.a = 2"),
       nxt_string("TypeError: Cannot set property \"a\" of object which has only a getter") },
 
+    { nxt_string("var o = Object.create(Object.defineProperty({}, 'x', { set: function(v) { this.y = v; }})); "
+                 "o.x = 123; Object.getOwnPropertyDescriptor(o, 'y').value"),
+      nxt_string("123") },
+
     { nxt_string("var o = {};"
                  "Object.defineProperty(o, 'a', { configurable: true, value: 0 });"
                  "Object.defineProperty(o, 'a', { value: 1 });"