]> git.kaiwu.me - njs.git/commitdiff
Object.prototype.hasOwnProperty() method.
authorDmitry Volyntsev <xeioex@nginx.com>
Thu, 8 Jun 2017 11:18:37 +0000 (14:18 +0300)
committerDmitry Volyntsev <xeioex@nginx.com>
Thu, 8 Jun 2017 11:18:37 +0000 (14:18 +0300)
njs/njs_object.c
njs/njs_vm.h
njs/test/njs_unit_test.c

index d2f1c3823eee65977f6fe6c3eab1fec698e58c63..e83255eaecb323f9f75fbd148a72dd910ab8289f 100644 (file)
@@ -882,6 +882,49 @@ found:
 }
 
 
+static njs_ret_t
+njs_object_prototype_has_own_property(njs_vm_t *vm, njs_value_t *args,
+    nxt_uint_t nargs, njs_index_t unused)
+{
+    uint32_t            index;
+    nxt_int_t           ret;
+    njs_array_t         *array;
+    const njs_value_t   *retval;
+    nxt_lvlhsh_query_t  lhq;
+
+    retval = &njs_string_false;
+
+    if (njs_is_object(&args[0])) {
+
+        if (njs_is_array(&args[0])) {
+            array = args[0].data.u.array;
+            index = njs_string_to_index(&args[1]);
+
+            if (index < array->length && njs_is_valid(&array->start[index])) {
+                retval = &njs_string_true;
+                goto done;
+            }
+        }
+
+        njs_string_get(&args[1], &lhq.key);
+        lhq.key_hash = nxt_djb_hash(lhq.key.start, lhq.key.length);
+        lhq.proto = &njs_object_hash_proto;
+
+        ret = nxt_lvlhsh_find(&args[0].data.u.object->hash, &lhq);
+
+        if (ret == NXT_OK) {
+            retval = &njs_string_true;
+        }
+    }
+
+done:
+
+    vm->retval = *retval;
+
+    return NXT_OK;
+}
+
+
 static const njs_object_prop_t  njs_object_prototype_properties[] =
 {
     {
@@ -907,6 +950,13 @@ static const njs_object_prop_t  njs_object_prototype_properties[] =
         .name = njs_string("toString"),
         .value = njs_native_function(njs_object_prototype_to_string, 0, 0),
     },
+
+    {
+        .type = NJS_METHOD,
+        .name = njs_string("hasOwnProperty"),
+        .value = njs_native_function(njs_object_prototype_has_own_property, 0,
+                                     NJS_OBJECT_ARG, NJS_STRING_ARG),
+    },
 };
 
 
index 61d06189b77274983a87bfdef465331d5c49681d..057920a9083db9581bb0c6a7b96b92d1d5def3b7 100644 (file)
@@ -408,6 +408,19 @@ typedef njs_ret_t (*njs_vmcode_operation_t)(njs_vm_t *vm, njs_value_t *value1,
 #define njs_string_truth(value, size)
 
 
+#define njs_string_get(value, str)                                            \
+    do {                                                                      \
+        if ((value)->short_string.size != NJS_STRING_LONG) {                  \
+            (str)->length = (value)->short_string.size;                       \
+            (str)->start = (value)->short_string.start;                       \
+                                                                              \
+        } else {                                                              \
+            (str)->length = (value)->data.string_size;                        \
+            (str)->start = (value)->data.u.string->start;                     \
+        }                                                                     \
+    } while (0)
+
+
 #define njs_string_short_start(value)                                         \
     (value)->short_string.start
 
index 97a82a9ca49c8651060db069e8e37e684f084e7e..ffcedc27f2a642b3a322e65b39c734a03c543f7f 100644 (file)
@@ -5932,6 +5932,48 @@ static njs_unit_test_t  njs_test[] =
     { nxt_string("var o = {}; Object.defineProperty(o)"),
       nxt_string("TypeError") },
 
+    { nxt_string("var o = {a:1}; o.hasOwnProperty('a')"),
+      nxt_string("true") },
+
+    { nxt_string("var o = Object.create({a:2}); o.hasOwnProperty('a')"),
+      nxt_string("false") },
+
+    { nxt_string("var o = {a:1}; o.hasOwnProperty('b')"),
+      nxt_string("false") },
+
+    { nxt_string("var a = []; a.hasOwnProperty('0')"),
+      nxt_string("false") },
+
+    { nxt_string("var a = [,,]; a.hasOwnProperty('0')"),
+      nxt_string("false") },
+
+    { nxt_string("var a = [3,,]; a.hasOwnProperty('0')"),
+      nxt_string("true") },
+
+    { nxt_string("var a = [,4]; a.hasOwnProperty('1')"),
+      nxt_string("true") },
+
+    { nxt_string("var a = [3,4]; a.hasOwnProperty('2')"),
+      nxt_string("false") },
+
+    { nxt_string("var a = [3,4]; a.one = 1; a.hasOwnProperty('one')"),
+      nxt_string("true") },
+
+    { nxt_string("var o = {a:1}; o.hasOwnProperty(o)"),
+      nxt_string("false") },
+
+    { nxt_string("var o = {a:1}; o.hasOwnProperty(1)"),
+      nxt_string("false") },
+
+    { nxt_string("var o = {a:1}; o.hasOwnProperty()"),
+      nxt_string("false") },
+
+    { nxt_string("1..hasOwnProperty('b')"),
+      nxt_string("false") },
+
+    { nxt_string("'s'.hasOwnProperty('b')"),
+      nxt_string("false") },
+
     { nxt_string("var d = new Date(''); d +' '+ d.getTime()"),
       nxt_string("Invalid Date NaN") },