}
+/*
+ * ECMAScript 5.1: try first to use object method "join", then
+ * use the standard built-in method Object.prototype.toString().
+ */
+
static njs_ret_t
njs_array_prototype_to_string(njs_vm_t *vm, njs_param_t *param)
{
- njs_object_t *object;
+ njs_value_t *this;
njs_object_prop_t *prop;
nxt_lvlhsh_query_t lhq;
- lhq.key_hash = NJS_JOIN_HASH;
- lhq.key.len = sizeof("join") - 1;
- lhq.key.data = (u_char *) "join";
-
- object = param->object->data.u.object;
-
- prop = njs_object_property(vm, object, &lhq);
+ this = param->object;
- if (nxt_fast_path(prop != NULL && njs_is_function(&prop->value))) {
- return njs_function_apply(vm, &prop->value, param);
- }
-
- lhq.key_hash = NJS_TO_STRING_HASH;
- lhq.key.len = sizeof("toString") - 1;
- lhq.key.data = (u_char *) "toString";
-
- object = &vm->prototypes[NJS_PROTOTYPE_OBJECT];
+ if (njs_is_object(this)) {
+ lhq.key_hash = NJS_JOIN_HASH;
+ lhq.key.len = sizeof("join") - 1;
+ lhq.key.data = (u_char *) "join";
- prop = njs_object_property(vm, object, &lhq);
+ prop = njs_object_property(vm, this->data.u.object, &lhq);
- if (nxt_fast_path(prop != NULL)) {
- return njs_function_apply(vm, &prop->value, param);
+ if (nxt_fast_path(prop != NULL && njs_is_function(&prop->value))) {
+ return njs_function_apply(vm, &prop->value, param);
+ }
}
- return NXT_ERROR;
+ return njs_object_prototype_to_string(vm, param);
}
njs_object_prop_t *njs_object_prop_alloc(njs_vm_t *vm, const njs_value_t *name);
njs_ret_t njs_primitive_prototype_get_proto(njs_vm_t *vm, njs_value_t *value);
njs_ret_t njs_object_prototype_create(njs_vm_t *vm, njs_value_t *value);
+njs_ret_t njs_object_prototype_to_string(njs_vm_t *vm, njs_param_t *param);
extern const njs_object_init_t njs_object_constructor_init;
extern const njs_object_init_t njs_object_prototype_init;
{ nxt_string("a = []; a.concat([]) +''"),
nxt_string("") },
- /**/
+ /* Array.toString(). */
+
+ { nxt_string("a = [1,2,3]; a.join = 'NO';"
+ "Object.prototype.toString = function () { return 'A' }; a"),
+ nxt_string("[object Array]") },
+
+ { nxt_string("Array.prototype.toString.call(1)"),
+ nxt_string("[object Number]") },
+
+ { nxt_string("Array.prototype.toString.call('abc')"),
+ nxt_string("[object String]") },
+
+ /* Empty array elements. */
{ nxt_string("[,,]"),
nxt_string(",") },
r.uri.data = (u_char *) "АБВ";
if (njs_vm_run(nvm) == NXT_OK) {
+
if (njs_vm_retval(nvm, &s) != NXT_OK) {
return NXT_ERROR;
}
}
if (njs_vm_run(nvm) == NXT_OK) {
+
if (njs_vm_retval(nvm, &s) != NXT_OK) {
return NXT_ERROR;
}