Object* CompiledCode::specialized_executor(STATE, Executable* exec, Module* mod, Arguments& args) { CompiledCode* code = as<CompiledCode>(exec); Class* cls = args.recv()->direct_class(state); uint64_t class_data = cls->data_raw(); MachineCode* v = code->machine_code(); executor target = v->unspecialized; for(int i = 0; i < MachineCode::cMaxSpecializations; i++) { uint64_t c_id = v->specializations[i].class_data.raw; executor x = v->specializations[i].execute; if(c_id == class_data && x != 0) { target = x; break; } } // This is a bug. We should not have this setup if there are no // specializations. FIX THIS BUG! if(!target) target = v->fallback; return target(state, exec, mod, args); }
Object* CompiledCode::primitive_failed(STATE, Executable* exec, Module* mod, Arguments& args) { CompiledCode* code = as<CompiledCode>(exec); Class* cls = args.recv()->direct_class(state); uint64_t class_data = cls->data_raw(); MachineCode* v = code->machine_code(); executor target = v->unspecialized; for(int i = 0; i < MachineCode::cMaxSpecializations; i++) { uint64_t c_id = v->specializations[i].class_data.raw; executor x = v->specializations[i].execute; if(c_id == class_data && x != 0) { target = x; break; } } if(target) { return target(state, exec, mod, args); } else { return MachineCode::execute(state, exec, mod, args); } }