]> git.kaiwu.me - njs.git/commitdiff
Added Object.prototype.propertyIsEnumerable().
authorDmitry Volyntsev <xeioex@nginx.com>
Mon, 11 Mar 2019 15:31:40 +0000 (18:31 +0300)
committerDmitry Volyntsev <xeioex@nginx.com>
Mon, 11 Mar 2019 15:31:40 +0000 (18:31 +0300)
njs/njs_object.c
njs/test/njs_unit_test.c

index 4ca98f1a78dc284f43d3bbb6928401a4358598b0..d15a4e1f2ec0e714527c5636ad3a709e80fb56d3 100644 (file)
@@ -2457,6 +2457,51 @@ njs_object_prototype_has_own_property(njs_vm_t *vm, njs_value_t *args,
 }
 
 
+static njs_ret_t
+njs_object_prototype_prop_is_enumerable(njs_vm_t *vm, njs_value_t *args,
+    nxt_uint_t nargs, njs_index_t unused)
+{
+    nxt_int_t             ret;
+    const njs_value_t     *value, *property, *retval;
+    njs_object_prop_t     *prop;
+    njs_property_query_t  pq;
+
+    value = njs_arg(args, nargs, 0);
+
+    if (njs_is_null_or_void(value)) {
+        njs_type_error(vm, "cannot convert %s argument to object",
+                       njs_type_string(value->type));
+        return NXT_ERROR;
+    }
+
+    property = njs_arg(args, nargs, 1);
+
+    njs_property_query_init(&pq, NJS_PROPERTY_QUERY_GET, 1);
+
+    ret = njs_property_query(vm, &pq, (njs_value_t *) value, property);
+
+    switch (ret) {
+    case NXT_OK:
+        prop = pq.lhq.value;
+        retval = prop->enumerable ? &njs_value_true : &njs_value_false;
+        break;
+
+    case NXT_DECLINED:
+        retval = &njs_value_false;
+        break;
+
+    case NJS_TRAP:
+    case NXT_ERROR:
+    default:
+        return ret;
+    }
+
+    vm->retval = *retval;
+
+    return NXT_OK;
+}
+
+
 static njs_ret_t
 njs_object_prototype_is_prototype_of(njs_vm_t *vm, njs_value_t *args,
     nxt_uint_t nargs, njs_index_t unused)
@@ -2522,6 +2567,13 @@ static const njs_object_prop_t  njs_object_prototype_properties[] =
                                      NJS_OBJECT_ARG, NJS_STRING_ARG),
     },
 
+    {
+        .type = NJS_METHOD,
+        .name = njs_long_string("propertyIsEnumerable"),
+        .value = njs_native_function(njs_object_prototype_prop_is_enumerable, 0,
+                                     NJS_OBJECT_ARG, NJS_STRING_ARG),
+    },
+
     {
         .type = NJS_METHOD,
         .name = njs_string("isPrototypeOf"),
index 8db3fe9363246f3c52b630c5d139fd5e66d80400..1c1e26dcc83239e2abd6cd8936d1502581dee16f 100644 (file)
@@ -8464,6 +8464,12 @@ static njs_unit_test_t  njs_test[] =
     { nxt_string("[1,2].hasOwnProperty('len')"),
       nxt_string("false") },
 
+    { nxt_string("[1,2].hasOwnProperty('0')"),
+      nxt_string("true") },
+
+    { nxt_string("[1,2].hasOwnProperty('2')"),
+      nxt_string("false") },
+
     { nxt_string("[].hasOwnProperty('length')"),
       nxt_string("true") },
 
@@ -8485,6 +8491,12 @@ static njs_unit_test_t  njs_test[] =
     { nxt_string("'s'.hasOwnProperty('b')"),
       nxt_string("false") },
 
+    { nxt_string("'s'.hasOwnProperty('0')"),
+      nxt_string("true") },
+
+    { nxt_string("'s'.hasOwnProperty('1')"),
+      nxt_string("false") },
+
     { nxt_string("var p = { a:5 }; var o = Object.create(p);"
                  "Object.getPrototypeOf(o) === p"),
       nxt_string("true") },
@@ -8607,6 +8619,18 @@ static njs_unit_test_t  njs_test[] =
     { nxt_string("Object.getOwnPropertyDescriptor(1, '0')"),
       nxt_string("undefined") },
 
+    { nxt_string("'αβγδ'.propertyIsEnumerable('0')"),
+      nxt_string("true") },
+
+    { nxt_string("({a:1}).propertyIsEnumerable({toString:function () {return 'a';}})"),
+      nxt_string("true") },
+
+    { nxt_string("'αβγδ'.propertyIsEnumerable('a')"),
+      nxt_string("false") },
+
+    { nxt_string("'αβγδ'.propertyIsEnumerable('length')"),
+      nxt_string("false") },
+
     { nxt_string("var min = Object.getOwnPropertyDescriptor(Math, 'min').value;"
                  "[min(1,2), min(2,1), min(-1,1)]"),
       nxt_string("1,1,-1") },