示例#1
0
static SLVAL
method_apply(sl_vm_t* vm, SLVAL method, size_t argc, SLVAL* argv)
{
    sl_method_t* methp = (sl_method_t*)sl_get_ptr(method);
    if(!methp->initialized) {
        sl_throw_message2(vm, vm->lib.TypeError, "Can't apply uninitialized Method");
    }
    return sl_apply_method(vm, argv[0], methp, argc - 1, argv + 1);
}
示例#2
0
static SLVAL
bound_method_call(sl_vm_t* vm, SLVAL bmethod, size_t argc, SLVAL* argv)
{
    sl_bound_method_t* bmethp = (sl_bound_method_t*)sl_get_ptr(bmethod);
    if(!bmethp->method.initialized) {
        sl_throw_message2(vm, vm->lib.TypeError, "Can't call uninitialized BoundMethod");
    }
    return sl_apply_method(vm, bmethp->self, &bmethp->method, argc, argv);
}
示例#3
0
文件: method.c 项目: Hmaal/slash
static SLVAL
method_apply(sl_vm_t* vm, SLVAL method, size_t argc, SLVAL* argv)
{
    sl_method_t* methp = (sl_method_t*)sl_get_ptr(method);
    if(!(methp->base.user_flags & SL_FLAG_METHOD_INITIALIZED)) {
        sl_throw_message2(vm, vm->lib.TypeError, "Can't apply uninitialized Method");
    }
    return sl_apply_method(vm, argv[0], methp, argc - 1, argv + 1);
}
示例#4
0
文件: method.c 项目: Hmaal/slash
static SLVAL
bound_method_call(sl_vm_t* vm, SLVAL bmethod, size_t argc, SLVAL* argv)
{
    sl_method_t* methp = (sl_method_t*)sl_get_ptr(bmethod);
    if(!(methp->base.user_flags & SL_FLAG_METHOD_INITIALIZED)) {
        sl_throw_message2(vm, vm->lib.TypeError, "Can't call uninitialized BoundMethod");
    }
    return sl_apply_method(vm, methp->extra->bound_self, methp, argc, argv);
}
示例#5
0
文件: dispatch.c 项目: Hmaal/slash
SLVAL
sl_send2(sl_vm_t* vm, SLVAL recv, SLID id, int argc, SLVAL* argv)
{
    sl_method_t* method = sl_lookup_method(vm, recv, id);
    if(sl_likely(method != NULL)) {
        return sl_apply_method(vm, recv, method, argc, argv);
    }
    return sl_send_missing(vm, recv, id, argc, argv);
}
示例#6
0
文件: dispatch.c 项目: Hmaal/slash
static SLVAL
sl_send_missing(sl_vm_t* vm, SLVAL recv, SLID id, int argc, SLVAL* argv)
{
    /* look for method_missing method */
    SLVAL argv2[argc + 1];
    memcpy(&argv2[1], argv, sizeof(SLVAL) * argc);
    argv2[0] = sl_id_to_string(vm, id);

    sl_method_t* method = sl_lookup_method(vm, recv, vm->id.method_missing);
    if(method) {
        return sl_apply_method(vm, recv, method, argc + 1, argv2);
    }

    /* nope */

    sl_error(vm, vm->lib.NoMethodError, "Undefined method %QI on %X", id, recv);
    return vm->lib.nil; /* shutup gcc */
}
示例#7
0
文件: dispatch.c 项目: Hmaal/slash
static SLVAL
sl_imc_cached_call(sl_vm_t* vm, sl_vm_inline_method_cache_t* imc, SLVAL recv, SLVAL* argv)
{
    return sl_apply_method(vm, recv, imc->method, imc->argc, argv);
}