@Override public Object interpret( ThreadContext context, StaticScope currScope, DynamicScope currDynScope, IRubyObject self, Object[] temp) { ConstantCache cache = this.cache; // Store to temp so it does null out on us mid-stream if (!ConstantCache.isCached(cache)) return cache(context, currScope, currDynScope, self, temp); return cache.value; }
protected static void processOtherOp( ThreadContext context, Instr instr, Operation operation, DynamicScope currDynScope, StaticScope currScope, Object[] temp, IRubyObject self, Block.Type blockType) { switch (operation) { case RECV_SELF: break; case COPY: { CopyInstr c = (CopyInstr) instr; setResult( temp, currDynScope, c.getResult(), retrieveOp(c.getSource(), context, self, currDynScope, currScope, temp)); break; } case GET_FIELD: { GetFieldInstr gfi = (GetFieldInstr) instr; IRubyObject object = (IRubyObject) gfi.getSource().retrieve(context, self, currScope, currDynScope, temp); VariableAccessor a = gfi.getAccessor(object); Object result = a == null ? null : (IRubyObject) a.get(object); if (result == null) { if (context.runtime.isVerbose()) { context .runtime .getWarnings() .warning( IRubyWarnings.ID.IVAR_NOT_INITIALIZED, "instance variable " + gfi.getRef() + " not initialized"); } result = context.nil; } setResult(temp, currDynScope, gfi.getResult(), result); break; } case SEARCH_CONST: { SearchConstInstr sci = (SearchConstInstr) instr; ConstantCache cache = sci.getConstantCache(); Object result = !ConstantCache.isCached(cache) ? sci.cache(context, currScope, currDynScope, self, temp) : cache.value; setResult(temp, currDynScope, sci.getResult(), result); break; } case RUNTIME_HELPER: { RuntimeHelperCall rhc = (RuntimeHelperCall) instr; setResult( temp, currDynScope, rhc.getResult(), rhc.callHelper(context, currScope, currDynScope, self, temp, blockType)); break; } case CHECK_FOR_LJE: ((CheckForLJEInstr) instr).check(context, currDynScope, blockType); break; case LOAD_FRAME_CLOSURE: setResult(temp, currDynScope, instr, context.getFrameBlock()); return; // ---------- All the rest --------- default: setResult( temp, currDynScope, instr, instr.interpret(context, currScope, currDynScope, self, temp)); break; } }