]> git.kaiwu.me - njs.git/commitdiff
String.toString() and String.valueOf() methods.
authorIgor Sysoev <igor@sysoev.ru>
Mon, 23 Nov 2015 19:36:59 +0000 (22:36 +0300)
committerIgor Sysoev <igor@sysoev.ru>
Mon, 23 Nov 2015 19:36:59 +0000 (22:36 +0300)
njs/njs_string.c
njs/njs_string.h
njs/test/njs_unit_test.c

index e5f3fe246398989948571255027606b4530cd4a9..20fae972db3f1a0ec888df92ceed6a29adcba111 100644 (file)
@@ -439,7 +439,31 @@ njs_string_cmp(const njs_value_t *v1, const njs_value_t *v2)
 }
 
 
-njs_ret_t
+static njs_ret_t
+njs_string_prototype_value_of(njs_vm_t *vm, njs_param_t *param)
+{
+    njs_value_t         *value;
+    njs_object_value_t  *object;
+
+    value = param->object;
+
+    if (value->type == NJS_STRING) {
+        vm->retval = *value;
+
+    } else if (value->type == NJS_OBJECT_STRING) {
+        object = value->data.u.object_value;
+        vm->retval = object->value;
+
+    } else {
+        vm->exception = &njs_exception_type_error;
+        return NXT_ERROR;
+    }
+
+    return NXT_OK;
+}
+
+
+static njs_ret_t
 njs_string_prototype_concat(njs_vm_t *vm, njs_param_t *param)
 {
     u_char             *p, *start;
@@ -1584,6 +1608,14 @@ static const njs_object_prop_t  njs_string_prototype_properties[] =
       njs_string("length"),
       NJS_NATIVE_GETTER, 0, 0, 0, },
 
+    { njs_native_function(njs_string_prototype_value_of, 0),
+      njs_string("valueOf"),
+      NJS_METHOD, 0, 0, 0, },
+
+    { njs_native_function(njs_string_prototype_value_of, 0),
+      njs_string("toString"),
+      NJS_METHOD, 0, 0, 0, },
+
     { njs_native_function(njs_string_prototype_concat, 0),
       njs_string("concat"),
       NJS_METHOD, 0, 0, 0, },
index d26b147f28d0c74a109a1abcb0d57cba7009518f..01199202d7c1542abc840ab2950815ffc64d591d 100644 (file)
@@ -99,7 +99,6 @@ const u_char *njs_string_offset(const u_char *start, const u_char *end,
     size_t index);
 nxt_noinline uint32_t njs_string_index(njs_string_prop_t *string,
     uint32_t offset);
-njs_ret_t njs_string_prototype_concat(njs_vm_t *vm, njs_param_t *param);
 njs_ret_t njs_value_to_string(njs_vm_t *vm, njs_value_t *dst,
     const njs_value_t *src);
 njs_ret_t njs_value_to_ext_string(njs_vm_t *vm, nxt_str_t *dst,
index 438265aad29da7181394c59dc9a0cf9d0fd03fb2..4e5da51258a1186d2037c71e684b5b8827f27079 100644 (file)
@@ -2073,6 +2073,26 @@ static njs_unit_test_t  njs_test[] =
 
     /**/
 
+    { nxt_string("'abc'.toString()"),
+      nxt_string("abc") },
+
+    { nxt_string("''.toString.call('abc')"),
+      nxt_string("abc") },
+
+    { nxt_string("String.prototype.toString.call('abc')"),
+      nxt_string("abc") },
+
+    { nxt_string("String.prototype.toString.call(new String('abc'))"),
+      nxt_string("abc") },
+
+    { nxt_string("String.prototype.toString.call(1)"),
+      nxt_string("TypeError") },
+
+    { nxt_string("'abc'.valueOf()"),
+      nxt_string("abc") },
+
+    /**/
+
     { nxt_string("var n = { toString: function() { return 1 } };   '12'[n]"),
       nxt_string("2") },