示例#1
0
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;
}
示例#2
0
文件: njs_array.c 项目: AsamQi/njs
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;
}
示例#3
0
文件: njs_array.c 项目: AsamQi/njs
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);
}