Index: vm/code_generator.cc |
=================================================================== |
--- vm/code_generator.cc (revision 10541) |
+++ vm/code_generator.cc (working copy) |
@@ -758,15 +758,6 @@ |
} else { |
receiver_class = receiver.clazz(); |
} |
- FunctionsCache functions_cache(receiver_class); |
- Code& code = Code::Handle(); |
- code = functions_cache.LookupCode(function_name, |
- num_arguments, |
- num_named_arguments); |
- if (!code.IsNull()) { |
- // Function's code found in the cache. |
- return code.raw(); |
- } |
Function& function = Function::Handle(); |
function = Resolver::ResolveDynamic(receiver, |
@@ -782,9 +773,6 @@ |
Exceptions::PropagateError(error); |
} |
} |
- functions_cache.AddCompiledFunction(function, |
- num_arguments, |
- num_named_arguments); |
return function.CurrentCode(); |
} |
} |
@@ -1632,99 +1620,4 @@ |
} |
END_LEAF_RUNTIME_ENTRY |
- |
-// We are entering function name for a valid argument count. |
-void FunctionsCache::EnterFunctionAt(int i, |
- const Array& cache, |
- const Function& function, |
- int num_arguments, |
- int num_named_arguments) { |
- ASSERT((i % kNumEntries) == 0); |
- ASSERT(function.AreValidArgumentCounts(num_arguments, |
- num_named_arguments, |
- NULL)); |
- cache.SetAt(i + FunctionsCache::kFunctionName, |
- String::Handle(function.name())); |
- cache.SetAt(i + FunctionsCache::kArgCount, |
- Smi::Handle(Smi::New(num_arguments))); |
- cache.SetAt(i + FunctionsCache::kNamedArgCount, |
- Smi::Handle(Smi::New(num_named_arguments))); |
- cache.SetAt(i + FunctionsCache::kFunction, function); |
-} |
- |
- |
-void FunctionsCache::AddCompiledFunction(const Function& function, |
- int num_arguments, |
- int num_named_arguments) { |
-// TODO(srdjan): Evaluate if populating the function cache is needed. |
-// It is turned off currently because we do not populate code objects |
-// in snapshot and hence end up in an inconsistent state as function |
-// cache is populated but there are no code objects. |
-#if 0 |
- ASSERT(function.HasCode()); |
- Array& cache = Array::Handle(class_.functions_cache()); |
- if (cache.IsNull()) { |
- class_.InitFunctionsCache(); |
- cache = class_.functions_cache(); |
- } |
- // Search for first free slot. Last entry is always NULL object. |
- for (intptr_t i = 0; i < (cache.Length() - kNumEntries); i += kNumEntries) { |
- if (Object::Handle(cache.At(i)).IsNull()) { |
- EnterFunctionAt(i, |
- cache, |
- function, |
- num_arguments, |
- num_named_arguments); |
- return; |
- } |
- } |
- intptr_t ix = cache.Length() - kNumEntries; |
- // Grow by 8 entries. |
- cache = Array::Grow(cache, cache.Length() + (8 * kNumEntries)); |
- class_.set_functions_cache(cache); |
- EnterFunctionAt(ix, |
- cache, |
- function, |
- num_arguments, |
- num_named_arguments); |
-#endif |
-} |
- |
- |
-// Only the number of named arguments is checked, but not the actual names. |
-RawCode* FunctionsCache::LookupCode(const String& function_name, |
- int num_arguments, |
- int num_named_arguments) { |
- const Array& cache = Array::Handle(class_.functions_cache()); |
- if (cache.IsNull()) { |
- return Code::null(); // Functions cache has not been populated yet. |
- } |
- String& test_name = String::Handle(); |
- for (intptr_t i = 0; i < cache.Length(); i += kNumEntries) { |
- test_name ^= cache.At(i + FunctionsCache::kFunctionName); |
- if (test_name.IsNull()) { |
- // Found NULL, no more entries to check, abort lookup. |
- return Code::null(); |
- } |
- if (function_name.Equals(test_name)) { |
- Smi& smi = Smi::Handle(); |
- smi ^= cache.At(i + FunctionsCache::kArgCount); |
- if (num_arguments == smi.Value()) { |
- smi ^= cache.At(i + FunctionsCache::kNamedArgCount); |
- if (num_named_arguments == smi.Value()) { |
- Function& result = Function::Handle(); |
- result ^= cache.At(i + FunctionsCache::kFunction); |
- ASSERT(!result.IsNull()); |
- ASSERT(result.HasCode()); |
- return result.CurrentCode(); |
- } |
- } |
- } |
- } |
- // The cache is null terminated, therefore the loop above should never |
- // terminate by itself. |
- UNREACHABLE(); |
- return Code::null(); |
-} |
- |
} // namespace dart |