static void hookup_prim(STATE, Symbol* meth, Symbol* prim) { MethodTable* tbl = G(rubinius)->metaclass(state)->method_table(); Executable* oc = Executable::allocate(state, Qnil); oc->primitive(state, prim); assert(oc->resolve_primitive(state)); tbl->store(state, meth, oc, G(sym_public)); }
Executable* Executable::allocate(STATE, Object* self) { Executable* executable = state->new_object<Executable>(G(executable)); executable->primitive(state, (Symbol*)Qnil); executable->serial(state, Fixnum::from(0)); executable->set_executor(Executable::default_executor); if(kind_of<Class>(self)) { state->om->set_class(executable, self); } return executable; }
Executable* Executable::allocate(STATE, Object* self) { Executable* executable = state->new_object<Executable>(G(executable)); executable->primitive(state, nil<Symbol>()); executable->serial(state, Fixnum::from(0)); executable->inliners_ = 0; executable->prim_index_ = -1; executable->set_executor(Executable::default_executor); if(Class* cls = try_as<Class>(self)) { executable->klass(state, cls); } return executable; }
void System::attach_primitive(STATE, Module* mod, bool meta, Symbol* name, Symbol* prim) { MethodTable* tbl; if(meta) { tbl = mod->singleton_class(state)->method_table(); } else { tbl = mod->method_table(); } Executable* oc = Executable::allocate(state, Qnil); oc->primitive(state, prim); oc->resolve_primitive(state); tbl->store(state, name, oc, G(sym_public)); }