Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(546)

Unified Diff: runtime/vm/object.cc

Issue 2598623002: Cache hash code for closures. (Closed)
Patch Set: remove redundant assertion Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/object.h ('k') | runtime/vm/raw_object.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/object.cc
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index d447c93c07974800b1b7eed09d92a695f0fbbebd..516c6ded8ae27ceb7a6eaad1129fe7d3b1767d8b 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -6845,6 +6845,28 @@ RawInstance* Function::ImplicitInstanceClosure(const Instance& receiver) const {
}
+RawSmi* Function::GetClosureHashCode() const {
+ ASSERT(IsClosureFunction());
+ const Object& obj = Object::Handle(raw_ptr()->data_);
+ ASSERT(!obj.IsNull());
+ if (ClosureData::Cast(obj).hash() != Object::null()) {
+ return Smi::RawCast(ClosureData::Cast(obj).hash());
+ }
+ // Hash not yet computed. Compute and cache it.
+ const Class& cls = Class::Handle(Owner());
+ intptr_t result = String::Handle(name()).Hash();
+ result += String::Handle(Signature()).Hash();
+ result += String::Handle(cls.Name()).Hash();
+ // Finalize hash value like for strings so that it fits into a smi.
+ result += result << 3;
+ result ^= result >> 11;
+ result += result << 15;
+ result &= ((static_cast<intptr_t>(1) << String::kHashBits) - 1);
+ ClosureData::Cast(obj).set_hash(result);
+ return Smi::New(result);
+}
+
+
RawString* Function::BuildSignature(bool instantiate,
NameVisibility name_visibility,
const TypeArguments& instantiator) const {
@@ -7221,6 +7243,11 @@ void ClosureData::set_implicit_static_closure(const Instance& closure) const {
}
+void ClosureData::set_hash(intptr_t value) const {
+ StorePointer(&raw_ptr()->hash_, static_cast<RawObject*>(Smi::New(value)));
+}
+
+
void ClosureData::set_parent_function(const Function& value) const {
StorePointer(&raw_ptr()->parent_function_, value.raw());
}
« no previous file with comments | « runtime/vm/object.h ('k') | runtime/vm/raw_object.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698