Index: runtime/vm/object.cc |
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc |
index 3ad9de1e8beb6c646a19597c1de7316e0e7cf5af..fcd9c15333de76bf06a2fd5362630e76702756b7 100644 |
--- a/runtime/vm/object.cc |
+++ b/runtime/vm/object.cc |
@@ -151,6 +151,8 @@ RawClass* Object::exception_handlers_class_ = |
reinterpret_cast<RawClass*>(RAW_NULL); |
RawClass* Object::context_class_ = reinterpret_cast<RawClass*>(RAW_NULL); |
RawClass* Object::context_scope_class_ = reinterpret_cast<RawClass*>(RAW_NULL); |
+RawClass* Object::singletargetcache_class_ = |
+ reinterpret_cast<RawClass*>(RAW_NULL); |
RawClass* Object::icdata_class_ = reinterpret_cast<RawClass*>(RAW_NULL); |
RawClass* Object::megamorphic_cache_class_ = |
reinterpret_cast<RawClass*>(RAW_NULL); |
@@ -651,6 +653,9 @@ void Object::InitOnce(Isolate* isolate) { |
cls = Class::New<ContextScope>(); |
context_scope_class_ = cls.raw(); |
+ cls = Class::New<SingleTargetCache>(); |
+ singletargetcache_class_ = cls.raw(); |
+ |
cls = Class::New<ICData>(); |
icdata_class_ = cls.raw(); |
@@ -992,6 +997,7 @@ void Object::FinalizeVMIsolate(Isolate* isolate) { |
SET_CLASS_NAME(exception_handlers, ExceptionHandlers); |
SET_CLASS_NAME(context, Context); |
SET_CLASS_NAME(context_scope, ContextScope); |
+ SET_CLASS_NAME(singletargetcache, SingleTargetCache); |
SET_CLASS_NAME(icdata, ICData); |
SET_CLASS_NAME(megamorphic_cache, MegamorphicCache); |
SET_CLASS_NAME(subtypetestcache, SubtypeTestCache); |
@@ -3427,6 +3433,8 @@ NOT_IN_PRODUCT( |
return Symbols::Context().raw(); |
case kContextScopeCid: |
return Symbols::ContextScope().raw(); |
+ case kSingleTargetCacheCid: |
+ return Symbols::SingleTargetCache().raw(); |
case kICDataCid: |
return Symbols::ICData().raw(); |
case kMegamorphicCacheCid: |
@@ -12491,6 +12499,34 @@ bool DeoptInfo::VerifyDecompression(const GrowableArray<DeoptInstr*>& original, |
} |
+void SingleTargetCache::set_target(const Code& value) const { |
+ StorePointer(&raw_ptr()->target_, value.raw()); |
+} |
+ |
+ |
+const char* SingleTargetCache::ToCString() const { |
+ return "SingleTargetCache"; |
+} |
+ |
+ |
+RawSingleTargetCache* SingleTargetCache::New() { |
+ SingleTargetCache& result = SingleTargetCache::Handle(); |
+ { |
+ // IC data objects are long living objects, allocate them in old generation. |
+ RawObject* raw = Object::Allocate(SingleTargetCache::kClassId, |
+ SingleTargetCache::InstanceSize(), |
+ Heap::kOld); |
+ NoSafepointScope no_safepoint; |
+ result ^= raw; |
+ } |
+ result.set_target(Code::Handle()); |
+ result.set_entry_point(0); |
+ result.set_lower_limit(kIllegalCid); |
+ result.set_upper_limit(kIllegalCid); |
+ return result.raw(); |
+} |
+ |
+ |
void ICData::ResetSwitchable(Zone* zone) const { |
ASSERT(NumArgsTested() == 1); |
set_ic_data_array(Array::Handle(zone, CachedEmptyICDataArray(1))); |