}
-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;
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, },
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,
/**/
+ { 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") },