nxt_noinline njs_ret_t njs_object_method(njs_vm_t *vm, njs_param_t *param, nxt_lvlhsh_query_t *lhq) { njs_object_prop_t *prop; prop = njs_object_property(vm, param->this->data.u.object, lhq); if (nxt_fast_path(prop != NULL)) { return njs_function_apply(vm, &prop->value, param); } return NXT_ERROR; }
static njs_ret_t njs_array_prototype_to_string(njs_vm_t *vm, njs_param_t *param) { njs_object_t *object; 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); if (nxt_fast_path(prop != NULL && (njs_is_function(&prop->value) || njs_is_native(&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]; prop = njs_object_property(vm, object, &lhq); if (nxt_fast_path(prop != NULL)) { return njs_function_apply(vm, &prop->value, param); } return NXT_ERROR; }
static njs_ret_t njs_array_prototype_every(njs_vm_t *vm, njs_param_t *param) { nxt_int_t n; uintptr_t nargs; njs_param_t p; njs_array_t *array; njs_value_t *object, *args, *func, arguments[3]; njs_array_each_t *each; object = param->object; if (!vm->frame->reentrant) { vm->frame->reentrant = 1; if (!njs_is_array(object)) { vm->exception = &njs_exception_type_error; return NXT_ERROR; } array = object->data.u.array; n = njs_array_next(array->start, 0, array->length); each = njs_native_data(vm->frame); each->index = n; each->length = array->length; } else { each = njs_native_data(vm->frame); if (!njs_is_true(&each->retval)) { vm->retval = njs_value_false; return NXT_OK; } } n = each->index; if (n < 0) { vm->retval = njs_value_true; return NXT_OK; } /* GC: array elt, array */ array = object->data.u.array; arguments[0] = array->start[n]; njs_number_set(&arguments[1], n); arguments[2] = *object; each->index = njs_array_next(array->start, ++n, each->length); nargs = param->nargs; args = param->args; p.object = (nargs > 1) ? &args[1] : (njs_value_t *) &njs_value_void; p.args = arguments; p.nargs = 3; p.retval = (njs_index_t) &each->retval; func = (nargs != 0) ? &args[0] : (njs_value_t *) &njs_value_void; vm->current -= sizeof(njs_vmcode_call_t); return njs_function_apply(vm, func, &p); }