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); }
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); }
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); }
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); }
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); }
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 */ }
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); }