From: Igor Sysoev Date: Mon, 23 Nov 2015 19:36:59 +0000 (+0300) Subject: String.toString() and String.valueOf() methods. X-Git-Tag: 0.1.0~111 X-Git-Url: http://git.kaiwu.me/%7B@url%7D?a=commitdiff_plain;h=5aa2346d7c8eadb98686543c4201be87ea010f9d;p=njs.git String.toString() and String.valueOf() methods. --- diff --git a/njs/njs_string.c b/njs/njs_string.c index e5f3fe24..20fae972 100644 --- a/njs/njs_string.c +++ b/njs/njs_string.c @@ -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, }, diff --git a/njs/njs_string.h b/njs/njs_string.h index d26b147f..01199202 100644 --- a/njs/njs_string.h +++ b/njs/njs_string.h @@ -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, diff --git a/njs/test/njs_unit_test.c b/njs/test/njs_unit_test.c index 438265aa..4e5da512 100644 --- a/njs/test/njs_unit_test.c +++ b/njs/test/njs_unit_test.c @@ -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") },