Index: runtime/vm/code_generator.cc |
diff --git a/runtime/vm/code_generator.cc b/runtime/vm/code_generator.cc |
index ed9073110582af7dc30436a5ca5a3bc21c30357a..07d67b05a9bcc8aac9b21c1fe1c1dd075e9b1340 100644 |
--- a/runtime/vm/code_generator.cc |
+++ b/runtime/vm/code_generator.cc |
@@ -1011,6 +1011,55 @@ DEFINE_RUNTIME_ENTRY(InlineCacheMissHandlerThreeArgs, 3) { |
} |
+// Arg0: Receiver's class ID. |
srdjan
2012/12/03 19:10:46
This seems to be receiver not cid. Arg1 is ICData
Kevin Millikin (Google)
2012/12/06 14:03:11
Comment is fixed.
|
+// Arg1: Megamorphic cache. |
+// Arg2: Arguments descriptor. |
+// Arg3: IC data. |
srdjan
2012/12/03 19:10:46
Describe results (target not found vs found).
|
+DEFINE_RUNTIME_ENTRY(MegamorphicCacheMissHandler, 3) { |
+ ASSERT(arguments.ArgCount() == |
+ kMegamorphicCacheMissHandlerRuntimeEntry.argument_count()); |
+ const Instance& receiver = |
+ Instance::CheckedHandle(isolate, arguments.ArgAt(0)); |
+ const ICData& ic_data = ICData::CheckedHandle(isolate, arguments.ArgAt(1)); |
+ const Array& descriptor = Array::CheckedHandle(isolate, arguments.ArgAt(2)); |
+ const String& name = String::Handle(isolate, ic_data.target_name()); |
+ const MegamorphicCache& cache = MegamorphicCache::Handle(isolate, |
+ isolate->megamorphic_cache_table()->Lookup(name, descriptor)); |
+ Class& cls = Class::Handle(isolate, receiver.clazz()); |
+ if (cls.IsNullClass()) { |
Vyacheslav Egorov (Google)
2012/12/03 14:55:22
Please add a comment.
Kevin Millikin (Google)
2012/12/06 14:03:11
The comment at the site I took this from said "For
|
+ cls = isolate->object_store()->object_class(); |
+ } |
+ ASSERT(!cls.IsNull()); |
+ intptr_t arg_count = |
+ Smi::Cast(Object::Handle(isolate, descriptor.At(0))).Value(); |
Vyacheslav Egorov (Google)
2012/12/03 14:55:22
I know that this is not your code but I really don
Kevin Millikin (Google)
2012/12/06 14:03:11
I have fixed this in another change.
|
+ intptr_t named_arg_count = |
+ arg_count - Smi::Cast(Object::Handle(isolate, descriptor.At(1))).Value(); |
+ const Function& target = Function::Handle(isolate, |
+ Resolver::ResolveDynamicForReceiverClass(cls, |
+ name, |
+ arg_count, |
+ named_arg_count)); |
+ |
+ Instructions& instructions = Instructions::Handle(isolate); |
+ if (!target.IsNull()) { |
+ if (!target.HasCode()) { |
+ const Error& error = |
+ Error::Handle(isolate, Compiler::CompileFunction(target)); |
+ if (!error.IsNull()) Exceptions::PropagateError(error); |
+ } |
+ ASSERT(target.HasCode()); |
+ instructions = Code::Handle(isolate, target.CurrentCode()).instructions(); |
+ } |
+ arguments.SetReturn(instructions); |
+ if (instructions.IsNull()) return; |
srdjan
2012/12/03 19:10:46
Would the code above be simpler if changed to:
ar
Kevin Millikin (Google)
2012/12/06 14:03:11
Possibly. I think we can sort out the code duplic
|
+ |
+ cache.EnsureCapacity(); |
+ const Smi& class_id = Smi::Handle(isolate, Smi::New(cls.id())); |
+ cache.Insert(class_id, target); |
+ return; |
srdjan
2012/12/03 19:10:46
I also think that using isolate here explicitly ma
Kevin Millikin (Google)
2012/12/06 14:03:11
Removed.
|
+} |
srdjan
2012/12/03 19:10:46
Could you also add tracing flag and code to be abl
Kevin Millikin (Google)
2012/12/06 14:03:11
I just printed something for --trace-ic and --trac
|
+ |
+ |
// Updates IC data for two arguments. Used by the equality operation when |
// the control flow bypasses regular inline cache (null arguments). |
// Arg0: Receiver object. |