NativeMethod* NativeMethod::create(State* state, String* file_name, Module* module, Symbol* method_name, void* func, Fixnum* arity) { NativeMethod* nmethod = state->new_object<NativeMethod>(G(nmethod)); nmethod->arity(state, arity); nmethod->file(state, file_name); nmethod->name(state, method_name); nmethod->module(state, module); nmethod->func_ = func; switch(arity->to_native()) { case 0: nmethod->set_executor(&NativeMethod::executor_implementation<ZeroArguments>); break; case 1: nmethod->set_executor(&NativeMethod::executor_implementation<OneArgument>); break; case 2: nmethod->set_executor(&NativeMethod::executor_implementation<TwoArguments>); break; case 3: nmethod->set_executor(&NativeMethod::executor_implementation<ThreeArguments>); break; default: nmethod->set_executor(&NativeMethod::executor_implementation<GenericArguments>); break; } nmethod->primitive(state, state->symbol("nativemethod_call")); nmethod->serial(state, Fixnum::from(0)); nmethod->inliners_ = 0; return nmethod; }
static NativeMethod* create(VM* state, String* file_name = as<String>(Qnil), Module* module = as<Module>(Qnil), Symbol* method_name = as<Symbol>(Qnil), FunctorType functor = static_cast<GenericFunctor>(NULL), Fixnum* arity = as<Fixnum>(Qnil)) { NativeMethod* nmethod = state->new_object<NativeMethod>(G(nmethod)); nmethod->arity(state, arity); nmethod->file_name(state, file_name); nmethod->method_name(state, method_name); nmethod->module(state, module); nmethod->functor(state, MemoryPointer::create(state, reinterpret_cast<void*>(functor))); nmethod->set_executor(&NativeMethod::executor_implementation); nmethod->primitive(state, state->symbol("nativemethod_call")); nmethod->serial(state, Fixnum::from(0)); return nmethod; }