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

Side by Side Diff: runtime/vm/object.cc

Issue 10352012: Using SubtypeTestCache object instead of an array, that way we do not need to patch and can communi… (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 7 months 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/vm/object.h ('k') | runtime/vm/object_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "platform/assert.h" 7 #include "platform/assert.h"
8 #include "vm/assembler.h" 8 #include "vm/assembler.h"
9 #include "vm/bigint_operations.h" 9 #include "vm/bigint_operations.h"
10 #include "vm/bootstrap.h" 10 #include "vm/bootstrap.h"
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
80 RawClass* Object::instructions_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 80 RawClass* Object::instructions_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
81 RawClass* Object::pc_descriptors_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 81 RawClass* Object::pc_descriptors_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
82 RawClass* Object::stackmap_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 82 RawClass* Object::stackmap_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
83 RawClass* Object::var_descriptors_class_ = 83 RawClass* Object::var_descriptors_class_ =
84 reinterpret_cast<RawClass*>(RAW_NULL); 84 reinterpret_cast<RawClass*>(RAW_NULL);
85 RawClass* Object::exception_handlers_class_ = 85 RawClass* Object::exception_handlers_class_ =
86 reinterpret_cast<RawClass*>(RAW_NULL); 86 reinterpret_cast<RawClass*>(RAW_NULL);
87 RawClass* Object::context_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 87 RawClass* Object::context_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
88 RawClass* Object::context_scope_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 88 RawClass* Object::context_scope_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
89 RawClass* Object::icdata_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 89 RawClass* Object::icdata_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
90 RawClass* Object::subtypetestcache_class_ =
91 reinterpret_cast<RawClass*>(RAW_NULL);
90 RawClass* Object::api_error_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 92 RawClass* Object::api_error_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
91 RawClass* Object::language_error_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 93 RawClass* Object::language_error_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
92 RawClass* Object::unhandled_exception_class_ = 94 RawClass* Object::unhandled_exception_class_ =
93 reinterpret_cast<RawClass*>(RAW_NULL); 95 reinterpret_cast<RawClass*>(RAW_NULL);
94 RawClass* Object::unwind_error_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 96 RawClass* Object::unwind_error_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
95 #undef RAW_NULL 97 #undef RAW_NULL
96 98
97 int Object::GetSingletonClassIndex(const RawClass* raw_class) { 99 int Object::GetSingletonClassIndex(const RawClass* raw_class) {
98 ASSERT(raw_class->IsHeapObject()); 100 ASSERT(raw_class->IsHeapObject());
99 if (raw_class == class_class()) { 101 if (raw_class == class_class()) {
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
143 } else if (raw_class == var_descriptors_class()) { 145 } else if (raw_class == var_descriptors_class()) {
144 return kLocalVarDescriptorsClass; 146 return kLocalVarDescriptorsClass;
145 } else if (raw_class == exception_handlers_class()) { 147 } else if (raw_class == exception_handlers_class()) {
146 return kExceptionHandlersClass; 148 return kExceptionHandlersClass;
147 } else if (raw_class == context_class()) { 149 } else if (raw_class == context_class()) {
148 return kContextClass; 150 return kContextClass;
149 } else if (raw_class == context_scope_class()) { 151 } else if (raw_class == context_scope_class()) {
150 return kContextScopeClass; 152 return kContextScopeClass;
151 } else if (raw_class == icdata_class()) { 153 } else if (raw_class == icdata_class()) {
152 return kICDataClass; 154 return kICDataClass;
155 } else if (raw_class == subtypetestcache_class()) {
156 return kSubtypeTestCacheClass;
153 } else if (raw_class == api_error_class()) { 157 } else if (raw_class == api_error_class()) {
154 return kApiErrorClass; 158 return kApiErrorClass;
155 } else if (raw_class == language_error_class()) { 159 } else if (raw_class == language_error_class()) {
156 return kLanguageErrorClass; 160 return kLanguageErrorClass;
157 } else if (raw_class == unhandled_exception_class()) { 161 } else if (raw_class == unhandled_exception_class()) {
158 return kUnhandledExceptionClass; 162 return kUnhandledExceptionClass;
159 } else if (raw_class == unwind_error_class()) { 163 } else if (raw_class == unwind_error_class()) {
160 return kUnwindErrorClass; 164 return kUnwindErrorClass;
161 } 165 }
162 return kInvalidIndex; 166 return kInvalidIndex;
(...skipping 23 matching lines...) Expand all
186 case kLibraryPrefixClass: return library_prefix_class(); 190 case kLibraryPrefixClass: return library_prefix_class();
187 case kCodeClass: return code_class(); 191 case kCodeClass: return code_class();
188 case kInstructionsClass: return instructions_class(); 192 case kInstructionsClass: return instructions_class();
189 case kPcDescriptorsClass: return pc_descriptors_class(); 193 case kPcDescriptorsClass: return pc_descriptors_class();
190 case kStackmapClass: return stackmap_class(); 194 case kStackmapClass: return stackmap_class();
191 case kLocalVarDescriptorsClass: return var_descriptors_class(); 195 case kLocalVarDescriptorsClass: return var_descriptors_class();
192 case kExceptionHandlersClass: return exception_handlers_class(); 196 case kExceptionHandlersClass: return exception_handlers_class();
193 case kContextClass: return context_class(); 197 case kContextClass: return context_class();
194 case kContextScopeClass: return context_scope_class(); 198 case kContextScopeClass: return context_scope_class();
195 case kICDataClass: return icdata_class(); 199 case kICDataClass: return icdata_class();
200 case kSubtypeTestCacheClass: return subtypetestcache_class();
196 case kApiErrorClass: return api_error_class(); 201 case kApiErrorClass: return api_error_class();
197 case kLanguageErrorClass: return language_error_class(); 202 case kLanguageErrorClass: return language_error_class();
198 case kUnhandledExceptionClass: return unhandled_exception_class(); 203 case kUnhandledExceptionClass: return unhandled_exception_class();
199 case kUnwindErrorClass: return unwind_error_class(); 204 case kUnwindErrorClass: return unwind_error_class();
200 default: break; 205 default: break;
201 } 206 }
202 UNREACHABLE(); 207 UNREACHABLE();
203 return reinterpret_cast<RawClass*>(kHeapObjectTag); // return RAW_NULL. 208 return reinterpret_cast<RawClass*>(kHeapObjectTag); // return RAW_NULL.
204 } 209 }
205 210
(...skipping 20 matching lines...) Expand all
226 case kLibraryPrefixClass: return "LibraryPrefix"; 231 case kLibraryPrefixClass: return "LibraryPrefix";
227 case kCodeClass: return "Code"; 232 case kCodeClass: return "Code";
228 case kInstructionsClass: return "Instructions"; 233 case kInstructionsClass: return "Instructions";
229 case kPcDescriptorsClass: return "PcDescriptors"; 234 case kPcDescriptorsClass: return "PcDescriptors";
230 case kStackmapClass: return "Stackmap"; 235 case kStackmapClass: return "Stackmap";
231 case kLocalVarDescriptorsClass: return "LocalVarDescriptors"; 236 case kLocalVarDescriptorsClass: return "LocalVarDescriptors";
232 case kExceptionHandlersClass: return "ExceptionHandlers"; 237 case kExceptionHandlersClass: return "ExceptionHandlers";
233 case kContextClass: return "Context"; 238 case kContextClass: return "Context";
234 case kContextScopeClass: return "ContextScope"; 239 case kContextScopeClass: return "ContextScope";
235 case kICDataClass: return "ICData"; 240 case kICDataClass: return "ICData";
241 case kSubtypeTestCacheClass: return "SubtypeTestCache";
236 case kApiErrorClass: return "ApiError"; 242 case kApiErrorClass: return "ApiError";
237 case kLanguageErrorClass: return "LanguageError"; 243 case kLanguageErrorClass: return "LanguageError";
238 case kUnhandledExceptionClass: return "UnhandledException"; 244 case kUnhandledExceptionClass: return "UnhandledException";
239 case kUnwindErrorClass: return "UnwindError"; 245 case kUnwindErrorClass: return "UnwindError";
240 default: break; 246 default: break;
241 } 247 }
242 UNREACHABLE(); 248 UNREACHABLE();
243 return NULL; 249 return NULL;
244 } 250 }
245 251
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
399 405
400 cls = Class::New<Context>(); 406 cls = Class::New<Context>();
401 context_class_ = cls.raw(); 407 context_class_ = cls.raw();
402 408
403 cls = Class::New<ContextScope>(); 409 cls = Class::New<ContextScope>();
404 context_scope_class_ = cls.raw(); 410 context_scope_class_ = cls.raw();
405 411
406 cls = Class::New<ICData>(); 412 cls = Class::New<ICData>();
407 icdata_class_ = cls.raw(); 413 icdata_class_ = cls.raw();
408 414
415 cls = Class::New<SubtypeTestCache>();
416 subtypetestcache_class_ = cls.raw();
417
409 cls = Class::New<ApiError>(); 418 cls = Class::New<ApiError>();
410 api_error_class_ = cls.raw(); 419 api_error_class_ = cls.raw();
411 420
412 cls = Class::New<LanguageError>(); 421 cls = Class::New<LanguageError>();
413 language_error_class_ = cls.raw(); 422 language_error_class_ = cls.raw();
414 423
415 cls = Class::New<UnhandledException>(); 424 cls = Class::New<UnhandledException>();
416 unhandled_exception_class_ = cls.raw(); 425 unhandled_exception_class_ = cls.raw();
417 426
418 cls = Class::New<UnwindError>(); 427 cls = Class::New<UnwindError>();
(...skipping 5203 matching lines...) Expand 10 before | Expand all | Expand 10 after
5622 } 5631 }
5623 5632
5624 5633
5625 const char* PcDescriptors::KindAsStr(intptr_t index) const { 5634 const char* PcDescriptors::KindAsStr(intptr_t index) const {
5626 switch (DescriptorKind(index)) { 5635 switch (DescriptorKind(index)) {
5627 case PcDescriptors::kDeopt: return "deopt"; 5636 case PcDescriptors::kDeopt: return "deopt";
5628 case PcDescriptors::kPatchCode: return "patch"; 5637 case PcDescriptors::kPatchCode: return "patch";
5629 case PcDescriptors::kIcCall: return "ic-call"; 5638 case PcDescriptors::kIcCall: return "ic-call";
5630 case PcDescriptors::kFuncCall: return "fn-call"; 5639 case PcDescriptors::kFuncCall: return "fn-call";
5631 case PcDescriptors::kReturn: return "return"; 5640 case PcDescriptors::kReturn: return "return";
5632 case PcDescriptors::kTypeTest: return "ty-test";
5633 case PcDescriptors::kOther: return "other"; 5641 case PcDescriptors::kOther: return "other";
5634 } 5642 }
5635 UNREACHABLE(); 5643 UNREACHABLE();
5636 return ""; 5644 return "";
5637 } 5645 }
5638 5646
5639 5647
5640 const char* PcDescriptors::ToCString() const { 5648 const char* PcDescriptors::ToCString() const {
5641 if (Length() == 0) { 5649 if (Length() == 0) {
5642 return "No pc descriptors\n"; 5650 return "No pc descriptors\n";
(...skipping 407 matching lines...) Expand 10 before | Expand all | Expand 10 after
6050 for (intptr_t i = 0; i < descriptors.Length(); i++) { 6058 for (intptr_t i = 0; i < descriptors.Length(); i++) {
6051 if ((descriptors.NodeId(i) == node_id) && 6059 if ((descriptors.NodeId(i) == node_id) &&
6052 (descriptors.DescriptorKind(i) == PcDescriptors::kDeopt)) { 6060 (descriptors.DescriptorKind(i) == PcDescriptors::kDeopt)) {
6053 return descriptors.PC(i); 6061 return descriptors.PC(i);
6054 } 6062 }
6055 } 6063 }
6056 return 0; 6064 return 0;
6057 } 6065 }
6058 6066
6059 6067
6060 uword Code::GetTypeTestAtNodeId(intptr_t node_id) const {
6061 const PcDescriptors& descriptors = PcDescriptors::Handle(pc_descriptors());
6062 for (intptr_t i = 0; i < descriptors.Length(); i++) {
6063 if ((descriptors.NodeId(i) == node_id) &&
6064 (descriptors.DescriptorKind(i) == PcDescriptors::kTypeTest)) {
6065 return descriptors.PC(i);
6066 }
6067 }
6068 return 0;
6069 }
6070
6071
6072 const char* Code::ToCString() const { 6068 const char* Code::ToCString() const {
6073 const char* kFormat = "Code entry:0x%d"; 6069 const char* kFormat = "Code entry:0x%d";
6074 intptr_t len = OS::SNPrint(NULL, 0, kFormat, EntryPoint()); 6070 intptr_t len = OS::SNPrint(NULL, 0, kFormat, EntryPoint());
6075 char* chars = reinterpret_cast<char*>( 6071 char* chars = reinterpret_cast<char*>(
6076 Isolate::Current()->current_zone()->Allocate(len)); 6072 Isolate::Current()->current_zone()->Allocate(len));
6077 OS::SNPrint(chars, len, kFormat, EntryPoint()); 6073 OS::SNPrint(chars, len, kFormat, EntryPoint());
6078 return chars; 6074 return chars;
6079 } 6075 }
6080 6076
6081 6077
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after
6355 6351
6356 RawICData* ICData::New(const Function& function, 6352 RawICData* ICData::New(const Function& function,
6357 const String& target_name, 6353 const String& target_name,
6358 intptr_t id, 6354 intptr_t id,
6359 intptr_t num_args_tested) { 6355 intptr_t num_args_tested) {
6360 ASSERT(num_args_tested > 0); 6356 ASSERT(num_args_tested > 0);
6361 const Class& cls = Class::Handle(Object::icdata_class()); 6357 const Class& cls = Class::Handle(Object::icdata_class());
6362 ASSERT(!cls.IsNull()); 6358 ASSERT(!cls.IsNull());
6363 ICData& result = ICData::Handle(); 6359 ICData& result = ICData::Handle();
6364 { 6360 {
6365 // IC data objects ar long living objects, allocate them in old generation. 6361 // IC data objects are long living objects, allocate them in old generation.
6366 RawObject* raw = 6362 RawObject* raw = Object::Allocate(cls, ICData::InstanceSize(), Heap::kOld);
6367 Object::Allocate(cls, ICData::InstanceSize(), Heap::kOld);
6368 NoGCScope no_gc; 6363 NoGCScope no_gc;
6369 result ^= raw; 6364 result ^= raw;
6370 } 6365 }
6371 result.set_function(function); 6366 result.set_function(function);
6372 result.set_target_name(target_name); 6367 result.set_target_name(target_name);
6373 result.set_id(id); 6368 result.set_id(id);
6374 result.set_num_args_tested(num_args_tested); 6369 result.set_num_args_tested(num_args_tested);
6375 // Number of array elements in one test entry (num_args_tested + 1) 6370 // Number of array elements in one test entry (num_args_tested + 1)
6376 intptr_t len = result.TestEntryLength(); 6371 intptr_t len = result.TestEntryLength();
6377 // IC data array must be null terminated (sentinel entry). 6372 // IC data array must be null terminated (sentinel entry).
6378 const Array& ic_data = Array::Handle(Array::New(len, Heap::kOld)); 6373 const Array& ic_data = Array::Handle(Array::New(len, Heap::kOld));
6379 result.set_ic_data(ic_data); 6374 result.set_ic_data(ic_data);
6380 return result.raw(); 6375 return result.raw();
6381 } 6376 }
6382 6377
6383 6378
6379 RawSubtypeTestCache* SubtypeTestCache::New() {
6380 const Class& cls = Class::Handle(Object::subtypetestcache_class());
6381 ASSERT(!cls.IsNull());
6382 SubtypeTestCache& result = SubtypeTestCache::Handle();
6383 {
6384 // SubtypeTestCache objects are long living objects, allocate them in the
6385 // old generation.
6386 RawObject* raw =
6387 Object::Allocate(cls, SubtypeTestCache::InstanceSize(), Heap::kOld);
6388 NoGCScope no_gc;
6389 result ^= raw;
6390 }
6391 const Array& cache = Array::Handle(Array::New(kTestEntryLength));
6392 result.set_cache(cache);
6393 return result.raw();
6394 }
6395
6396
6397 void SubtypeTestCache::set_cache(const Array& value) const {
6398 StorePointer(&raw_ptr()->cache_, value.raw());
6399 }
6400
6401
6402 intptr_t SubtypeTestCache::NumberOfChecks() const {
6403 // Do not count the sentinel;
6404 return (Array::Handle(cache()).Length() / kTestEntryLength) - 1;
6405 }
6406
6407
6408 void SubtypeTestCache::AddCheck(
6409 const Class& instance_class,
6410 const AbstractTypeArguments& instance_type_arguments,
6411 const AbstractTypeArguments& instantiator_type_arguments,
6412 const Bool& test_result) const {
6413 intptr_t old_num = NumberOfChecks();
6414 Array& data = Array::Handle(cache());
6415 intptr_t new_len = data.Length() + kTestEntryLength;
6416 data = Array::Grow(data, new_len);
6417 set_cache(data);
6418 intptr_t data_pos = old_num * kTestEntryLength;
6419 data.SetAt(data_pos + kInstanceClass, instance_class);
6420 data.SetAt(data_pos + kInstanceTypeArguments, instance_type_arguments);
6421 data.SetAt(data_pos + kInstantiatorTypeArguments,
6422 instantiator_type_arguments);
6423 data.SetAt(data_pos + kTestResult, test_result);
6424 }
6425
6426
6427 void SubtypeTestCache::GetCheck(
6428 intptr_t ix,
6429 Class* instance_class,
6430 AbstractTypeArguments* instance_type_arguments,
6431 AbstractTypeArguments* instantiator_type_arguments,
6432 Bool* test_result) const {
6433 Array& data = Array::Handle(cache());
6434 intptr_t data_pos = ix * kTestEntryLength;
6435 *instance_class ^= data.At(data_pos + kInstanceClass);
6436 *instance_type_arguments ^= data.At(data_pos + kInstanceTypeArguments);
6437 *instantiator_type_arguments ^=
6438 data.At(data_pos + kInstantiatorTypeArguments);
6439 *test_result ^= data.At(data_pos + kTestResult);
6440 }
6441
6442
6443 const char* SubtypeTestCache::ToCString() const {
6444 return "SubtypeTestCache";
6445 }
6446
6447
6384 const char* Error::ToErrorCString() const { 6448 const char* Error::ToErrorCString() const {
6385 UNREACHABLE(); 6449 UNREACHABLE();
6386 return "Internal Error"; 6450 return "Internal Error";
6387 } 6451 }
6388 6452
6389 6453
6390 const char* Error::ToCString() const { 6454 const char* Error::ToCString() const {
6391 // Error is an abstract class. We should never reach here. 6455 // Error is an abstract class. We should never reach here.
6392 UNREACHABLE(); 6456 UNREACHABLE();
6393 return "Error"; 6457 return "Error";
(...skipping 2910 matching lines...) Expand 10 before | Expand all | Expand 10 after
9304 const String& str = String::Handle(pattern()); 9368 const String& str = String::Handle(pattern());
9305 const char* format = "JSRegExp: pattern=%s flags=%s"; 9369 const char* format = "JSRegExp: pattern=%s flags=%s";
9306 intptr_t len = OS::SNPrint(NULL, 0, format, str.ToCString(), Flags()); 9370 intptr_t len = OS::SNPrint(NULL, 0, format, str.ToCString(), Flags());
9307 char* chars = reinterpret_cast<char*>( 9371 char* chars = reinterpret_cast<char*>(
9308 Isolate::Current()->current_zone()->Allocate(len + 1)); 9372 Isolate::Current()->current_zone()->Allocate(len + 1));
9309 OS::SNPrint(chars, (len + 1), format, str.ToCString(), Flags()); 9373 OS::SNPrint(chars, (len + 1), format, str.ToCString(), Flags());
9310 return chars; 9374 return chars;
9311 } 9375 }
9312 9376
9313 } // namespace dart 9377 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/object.h ('k') | runtime/vm/object_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698