oop* InterpretedIC::inline_cache_miss() { NoGCVerifier noGC; // get ic info frame f = DeltaProcess::active()->last_frame(); InterpretedIC* ic = f.current_interpretedIC(); Bytecodes::Code send_code = ic->send_code(); oop receiver = ic->argument_spec() == Bytecodes::args_only // Are we at a self or super send? ? f.receiver() // yes: take receiver of frame : f.expr(ic->nof_arguments()); // no: take receiver pushed before the arguments // do the lookup klassOop klass = receiver->klass(); LookupResult result = Bytecodes::is_super_send(send_code) ? interpreter_super_lookup(ic->selector()) : interpreter_normal_lookup(klass, ic->selector()); // tracing if (TraceInlineCacheMiss) { std->print("IC miss, "); trace_inline_cache_miss(ic, klass, result); } // handle the lookup result if (!result.is_empty()) { update_inline_cache(ic, &f, ic->send_code(), klass, result); return NULL; } else { return cacheMissResult(does_not_understand(receiver, ic, &f), ic->nof_arguments() + (ic->argument_spec() == Bytecodes::args_only ? 0 : 1))->objs(1); } }
void InterpretedIC::inline_cache_miss() { NoGCVerifier noGC; // get ic info frame f = DeltaProcess::active()->last_frame(); InterpretedIC* ic = f.current_interpretedIC(); Bytecodes::Code send_code = ic->send_code(); oop receiver = ic->argument_spec() == Bytecodes::args_only // Are we at a self or super send? ? f.receiver() // yes: take receiver of frame : f.expr(ic->nof_arguments()); // no: take receiver pushed before the arguments // do the lookup klassOop klass = receiver->klass(); LookupResult result = Bytecodes::is_super_send(send_code) ? interpreter_super_lookup(ic->selector()) : interpreter_normal_lookup(klass, ic->selector()); // tracing if (TraceMessageSend) std->print_cr("inline cache miss"); if (TraceLookup) trace_inline_cache_miss(ic, klass, result); // handle the lookup result if (!result.is_empty()) update_inline_cache(ic, &f, send_code, klass, result); else { does_not_understand(receiver, ic, &f); // If the program continues we'll redo the inline_cache_miss if (!have_nlr_through_C) inline_cache_miss(); } }