OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/object.h" | 5 #include "vm/object.h" |
6 | 6 |
7 #include "include/dart_api.h" | 7 #include "include/dart_api.h" |
8 #include "platform/assert.h" | 8 #include "platform/assert.h" |
9 #include "vm/assembler.h" | 9 #include "vm/assembler.h" |
10 #include "vm/become.h" | 10 #include "vm/become.h" |
(...skipping 12830 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12841 // Set count to 0 as this is called during compilation, before the | 12841 // Set count to 0 as this is called during compilation, before the |
12842 // call has been executed. | 12842 // call has been executed. |
12843 const Smi& value = Smi::Handle(Smi::New(0)); | 12843 const Smi& value = Smi::Handle(Smi::New(0)); |
12844 data.SetAt(data_pos, value); | 12844 data.SetAt(data_pos, value); |
12845 // Multithreaded access to ICData requires setting of array to be the last | 12845 // Multithreaded access to ICData requires setting of array to be the last |
12846 // operation. | 12846 // operation. |
12847 set_ic_data_array(data); | 12847 set_ic_data_array(data); |
12848 } | 12848 } |
12849 | 12849 |
12850 | 12850 |
| 12851 bool ICData::ValidateInterceptor(const Function& target) const { |
| 12852 ObjectStore* store = Isolate::Current()->object_store(); |
| 12853 ASSERT((target.raw() == store->simple_instance_of_true_function()) || |
| 12854 (target.raw() == store->simple_instance_of_false_function())); |
| 12855 const String& instance_of_name = String::Handle( |
| 12856 Library::PrivateCoreLibName(Symbols::_simpleInstanceOf()).raw()); |
| 12857 ASSERT(target_name() == instance_of_name.raw()); |
| 12858 return true; |
| 12859 } |
| 12860 |
12851 void ICData::AddCheck(const GrowableArray<intptr_t>& class_ids, | 12861 void ICData::AddCheck(const GrowableArray<intptr_t>& class_ids, |
12852 const Function& target) const { | 12862 const Function& target) const { |
12853 ASSERT(!target.IsNull()); | 12863 ASSERT(!target.IsNull()); |
12854 ASSERT(target.name() == target_name()); | 12864 ASSERT((target.name() == target_name()) || ValidateInterceptor(target)); |
12855 DEBUG_ASSERT(!HasCheck(class_ids)); | 12865 DEBUG_ASSERT(!HasCheck(class_ids)); |
12856 ASSERT(NumArgsTested() > 1); // Otherwise use 'AddReceiverCheck'. | 12866 ASSERT(NumArgsTested() > 1); // Otherwise use 'AddReceiverCheck'. |
12857 ASSERT(class_ids.length() == NumArgsTested()); | 12867 ASSERT(class_ids.length() == NumArgsTested()); |
12858 const intptr_t old_num = NumberOfChecks(); | 12868 const intptr_t old_num = NumberOfChecks(); |
12859 Array& data = Array::Handle(ic_data()); | 12869 Array& data = Array::Handle(ic_data()); |
12860 // ICData of static calls with NumArgsTested() > 0 have initially a | 12870 // ICData of static calls with NumArgsTested() > 0 have initially a |
12861 // dummy set of cids entered (see ICData::AddTarget). That entry is | 12871 // dummy set of cids entered (see ICData::AddTarget). That entry is |
12862 // overwritten by first real type feedback data. | 12872 // overwritten by first real type feedback data. |
12863 if (old_num == 1) { | 12873 if (old_num == 1) { |
12864 bool has_dummy_entry = true; | 12874 bool has_dummy_entry = true; |
(...skipping 9729 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
22594 return UserTag::null(); | 22604 return UserTag::null(); |
22595 } | 22605 } |
22596 | 22606 |
22597 | 22607 |
22598 const char* UserTag::ToCString() const { | 22608 const char* UserTag::ToCString() const { |
22599 const String& tag_label = String::Handle(label()); | 22609 const String& tag_label = String::Handle(label()); |
22600 return tag_label.ToCString(); | 22610 return tag_label.ToCString(); |
22601 } | 22611 } |
22602 | 22612 |
22603 } // namespace dart | 22613 } // namespace dart |
OLD | NEW |