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

Side by Side Diff: vm/object.h

Issue 10827209: Unify class ids and snapshot object ids list so that we don't have disparate and sometimes confusin… (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/runtime/
Patch Set: Created 8 years, 4 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 | « vm/intrinsifier_x64.cc ('k') | vm/object.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 #ifndef VM_OBJECT_H_ 5 #ifndef VM_OBJECT_H_
6 #define VM_OBJECT_H_ 6 #define VM_OBJECT_H_
7 7
8 #include "include/dart_api.h" 8 #include "include/dart_api.h"
9 #include "platform/assert.h" 9 #include "platform/assert.h"
10 #include "platform/utils.h" 10 #include "platform/utils.h"
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
99 /* is not setup for type T, although some methods are supposed to work */ \ 99 /* is not setup for type T, although some methods are supposed to work */ \
100 /* with null, for example Instance::Equals(). */ \ 100 /* with null, for example Instance::Equals(). */ \
101 static const object& Cast(const Object& obj) { \ 101 static const object& Cast(const Object& obj) { \
102 ASSERT(obj.Is##object()); \ 102 ASSERT(obj.Is##object()); \
103 return reinterpret_cast<const object&>(obj); \ 103 return reinterpret_cast<const object&>(obj); \
104 } \ 104 } \
105 static Raw##object* null() { \ 105 static Raw##object* null() { \
106 return reinterpret_cast<Raw##object*>(Object::null()); \ 106 return reinterpret_cast<Raw##object*>(Object::null()); \
107 } \ 107 } \
108 virtual const char* ToCString() const; \ 108 virtual const char* ToCString() const; \
109 static const ObjectKind kInstanceKind = k##object; \ 109 static const ClassId kClassId = k##object##Cid; \
110 protected: /* NOLINT */ \ 110 protected: /* NOLINT */ \
111 object() : super() {} \ 111 object() : super() {} \
112 private: /* NOLINT */ \ 112 private: /* NOLINT */ \
113 /* Initialize the handle based on the raw_ptr in the presence of null. */ \ 113 /* Initialize the handle based on the raw_ptr in the presence of null. */ \
114 static void initializeHandle(object* obj, RawObject* raw_ptr) { \ 114 static void initializeHandle(object* obj, RawObject* raw_ptr) { \
115 if (raw_ptr != Object::null()) { \ 115 if (raw_ptr != Object::null()) { \
116 obj->SetRaw(raw_ptr); \ 116 obj->SetRaw(raw_ptr); \
117 } else { \ 117 } else { \
118 obj->raw_ = Object::null(); \ 118 obj->raw_ = Object::null(); \
119 object fake_object; \ 119 object fake_object; \
(...skipping 18 matching lines...) Expand all
138 OBJECT_IMPLEMENTATION(object, super); \ 138 OBJECT_IMPLEMENTATION(object, super); \
139 Raw##object* raw_ptr() const { \ 139 Raw##object* raw_ptr() const { \
140 ASSERT(raw() != null()); \ 140 ASSERT(raw() != null()); \
141 return raw()->ptr(); \ 141 return raw()->ptr(); \
142 } \ 142 } \
143 SNAPSHOT_READER_SUPPORT(object) \ 143 SNAPSHOT_READER_SUPPORT(object) \
144 friend class StackFrame; \ 144 friend class StackFrame; \
145 145
146 class Object { 146 class Object {
147 public: 147 public:
148 // Index for Singleton internal VM classes,
149 // this index is used in snapshots to refer to these classes directly.
150 enum {
151 kNullObject = 0,
152 kSentinelObject,
153 kClassClass,
154 kNullClass,
155 kDynamicClass,
156 kVoidClass,
157 kUnresolvedClassClass,
158 kTypeClass,
159 kTypeParameterClass,
160 kTypeArgumentsClass,
161 kInstantiatedTypeArgumentsClass,
162 kFunctionClass,
163 kFieldClass,
164 kLiteralTokenClass,
165 kTokenStreamClass,
166 kScriptClass,
167 kLibraryClass,
168 kLibraryPrefixClass,
169 kCodeClass,
170 kInstructionsClass,
171 kPcDescriptorsClass,
172 kStackmapClass,
173 kLocalVarDescriptorsClass,
174 kExceptionHandlersClass,
175 kDeoptInfoClass,
176 kContextClass,
177 kContextScopeClass,
178 kICDataClass,
179 kSubtypeTestCacheClass,
180 kApiErrorClass,
181 kLanguageErrorClass,
182 kUnhandledExceptionClass,
183 kUnwindErrorClass,
184 kMaxId,
185 kInvalidIndex = -1,
186 };
187
188 virtual ~Object() { } 148 virtual ~Object() { }
189 149
190 RawObject* raw() const { return raw_; } 150 RawObject* raw() const { return raw_; }
191 void operator=(RawObject* value) { SetRaw(value); } 151 void operator=(RawObject* value) { SetRaw(value); }
192 152
193 void set_tags(intptr_t value) const { 153 void set_tags(intptr_t value) const {
194 // TODO(asiva): Remove the capability of setting tags in general. The mask 154 // TODO(asiva): Remove the capability of setting tags in general. The mask
195 // here only allows for canonical and from_snapshot flags to be set. 155 // here only allows for canonical and from_snapshot flags to be set.
196 ASSERT(!IsNull()); 156 ASSERT(!IsNull());
197 uword tags = raw()->ptr()->tags_ & ~0x0000000c; 157 uword tags = raw()->ptr()->tags_ & ~0x0000000c;
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
317 static RawClass* context_scope_class() { return context_scope_class_; } 277 static RawClass* context_scope_class() { return context_scope_class_; }
318 static RawClass* api_error_class() { return api_error_class_; } 278 static RawClass* api_error_class() { return api_error_class_; }
319 static RawClass* language_error_class() { return language_error_class_; } 279 static RawClass* language_error_class() { return language_error_class_; }
320 static RawClass* unhandled_exception_class() { 280 static RawClass* unhandled_exception_class() {
321 return unhandled_exception_class_; 281 return unhandled_exception_class_;
322 } 282 }
323 static RawClass* unwind_error_class() { return unwind_error_class_; } 283 static RawClass* unwind_error_class() { return unwind_error_class_; }
324 static RawClass* icdata_class() { return icdata_class_; } 284 static RawClass* icdata_class() { return icdata_class_; }
325 static RawClass* subtypetestcache_class() { return subtypetestcache_class_; } 285 static RawClass* subtypetestcache_class() { return subtypetestcache_class_; }
326 286
327 static int GetSingletonClassIndex(const RawClass* raw_class); 287 static const char* GetSingletonClassName(intptr_t class_id);
328 static RawClass* GetSingletonClass(int index);
329 static const char* GetSingletonClassName(int index);
330 288
331 static RawClass* CreateAndRegisterInterface(const char* cname, 289 static RawClass* CreateAndRegisterInterface(const char* cname,
332 const Script& script, 290 const Script& script,
333 const Library& lib); 291 const Library& lib);
334 static void RegisterClass(const Class& cls, 292 static void RegisterClass(const Class& cls,
335 const char* cname, 293 const char* cname,
336 const Script& script, 294 const Script& script,
337 const Library& lib); 295 const Library& lib);
338 296
339 static void RegisterPrivateClass(const Class& cls, 297 static void RegisterPrivateClass(const Class& cls,
340 const char* cname, 298 const char* cname,
341 const Script& script, 299 const Script& script,
342 const Library& lib); 300 const Library& lib);
343 301
344 static RawError* Init(Isolate* isolate); 302 static RawError* Init(Isolate* isolate);
345 static void InitFromSnapshot(Isolate* isolate); 303 static void InitFromSnapshot(Isolate* isolate);
346 static void InitOnce(); 304 static void InitOnce();
347 305
348 static intptr_t InstanceSize() { 306 static intptr_t InstanceSize() {
349 return RoundedAllocationSize(sizeof(RawObject)); 307 return RoundedAllocationSize(sizeof(RawObject));
350 } 308 }
351 309
352 static const ObjectKind kInstanceKind = kObject; 310 static const ClassId kClassId = kObjectCid;
353 311
354 // Different kinds of type tests. 312 // Different kinds of type tests.
355 enum TypeTestKind { 313 enum TypeTestKind {
356 kIsSubtypeOf = 0, 314 kIsSubtypeOf = 0,
357 kIsMoreSpecificThan 315 kIsMoreSpecificThan
358 }; 316 };
359 317
360 // Different kinds of name visibility. 318 // Different kinds of name visibility.
361 enum NameVisibility { 319 enum NameVisibility {
362 kInternalName = 0, 320 kInternalName = 0,
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
406 364
407 private: 365 private:
408 static void InitializeObject(uword address, intptr_t id, intptr_t size); 366 static void InitializeObject(uword address, intptr_t id, intptr_t size);
409 367
410 cpp_vtable* vtable_address() const { 368 cpp_vtable* vtable_address() const {
411 uword vtable_addr = reinterpret_cast<uword>(this); 369 uword vtable_addr = reinterpret_cast<uword>(this);
412 return reinterpret_cast<cpp_vtable*>(vtable_addr); 370 return reinterpret_cast<cpp_vtable*>(vtable_addr);
413 } 371 }
414 372
415 static cpp_vtable handle_vtable_; 373 static cpp_vtable handle_vtable_;
416 static cpp_vtable builtin_vtables_[kNumPredefinedKinds]; 374 static cpp_vtable builtin_vtables_[kNumPredefinedCids];
417 375
418 // The static values below are singletons shared between the different 376 // The static values below are singletons shared between the different
419 // isolates. They are all allocated in the non-GC'd Dart::vm_isolate_. 377 // isolates. They are all allocated in the non-GC'd Dart::vm_isolate_.
420 static RawObject* null_; 378 static RawObject* null_;
421 static RawInstance* sentinel_; 379 static RawInstance* sentinel_;
422 static RawInstance* transition_sentinel_; 380 static RawInstance* transition_sentinel_;
423 381
424 static RawClass* class_class_; // Class of the Class vm object. 382 static RawClass* class_class_; // Class of the Class vm object.
425 static RawClass* null_class_; // Class of the null object. 383 static RawClass* null_class_; // Class of the null object.
426 static RawClass* dynamic_class_; // Class of the 'Dynamic' type. 384 static RawClass* dynamic_class_; // Class of the 'Dynamic' type.
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
488 (!Utils::IsAligned(value, kObjectAlignment) && 446 (!Utils::IsAligned(value, kObjectAlignment) &&
489 (value + kWordSize == raw_ptr()->instance_size_))); 447 (value + kWordSize == raw_ptr()->instance_size_)));
490 raw_ptr()->next_field_offset_ = value; 448 raw_ptr()->next_field_offset_ = value;
491 } 449 }
492 450
493 cpp_vtable handle_vtable() const { return raw_ptr()->handle_vtable_; } 451 cpp_vtable handle_vtable() const { return raw_ptr()->handle_vtable_; }
494 void set_handle_vtable(cpp_vtable value) const { 452 void set_handle_vtable(cpp_vtable value) const {
495 raw_ptr()->handle_vtable_ = value; 453 raw_ptr()->handle_vtable_ = value;
496 } 454 }
497 455
498 ObjectKind instance_kind() const { return raw_ptr()->instance_kind_; }
499 void set_instance_kind(ObjectKind value) const {
500 raw_ptr()->instance_kind_ = value;
501 }
502
503 intptr_t id() const { return raw_ptr()->id_; } 456 intptr_t id() const { return raw_ptr()->id_; }
504 void set_id(intptr_t value) const { 457 void set_id(intptr_t value) const {
505 raw_ptr()->id_ = value; 458 raw_ptr()->id_ = value;
506 } 459 }
507 460
508 RawString* Name() const; 461 RawString* Name() const;
509 462
510 RawString* UserVisibleName() const; 463 RawString* UserVisibleName() const;
511 464
512 RawScript* script() const { return raw_ptr()->script_; } 465 RawScript* script() const { return raw_ptr()->script_; }
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
617 // Check if this class represents the 'void' class. 570 // Check if this class represents the 'void' class.
618 bool IsVoidClass() const { return raw() == Object::void_class(); } 571 bool IsVoidClass() const { return raw() == Object::void_class(); }
619 572
620 // Check if this class represents the 'Object' class. 573 // Check if this class represents the 'Object' class.
621 bool IsObjectClass() const; 574 bool IsObjectClass() const;
622 575
623 // Check if this class represents a signature class. 576 // Check if this class represents a signature class.
624 bool IsSignatureClass() const { 577 bool IsSignatureClass() const {
625 return signature_function() != Object::null(); 578 return signature_function() != Object::null();
626 } 579 }
580 static bool IsSignatureClass(RawClass* cls) {
581 return cls->ptr()->signature_function_ != Object::null();
582 }
627 583
628 // Check if this class represents a canonical signature class, i.e. not an 584 // Check if this class represents a canonical signature class, i.e. not an
629 // alias as defined in a typedef. 585 // alias as defined in a typedef.
630 bool IsCanonicalSignatureClass() const; 586 bool IsCanonicalSignatureClass() const;
631 587
632 // Check the subtype relationship. 588 // Check the subtype relationship.
633 bool IsSubtypeOf(const AbstractTypeArguments& type_arguments, 589 bool IsSubtypeOf(const AbstractTypeArguments& type_arguments,
634 const Class& other, 590 const Class& other,
635 const AbstractTypeArguments& other_type_arguments, 591 const AbstractTypeArguments& other_type_arguments,
636 Error* malformed_error) const { 592 Error* malformed_error) const {
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
751 // The class may be type parameterized unless the signature_function is in a 707 // The class may be type parameterized unless the signature_function is in a
752 // static scope. In that case, the type parameters are copied from the owner 708 // static scope. In that case, the type parameters are copied from the owner
753 // class of signature_function. 709 // class of signature_function.
754 static RawClass* NewSignatureClass(const String& name, 710 static RawClass* NewSignatureClass(const String& name,
755 const Function& signature_function, 711 const Function& signature_function,
756 const Script& script); 712 const Script& script);
757 713
758 // Return a class object corresponding to the specified kind. If 714 // Return a class object corresponding to the specified kind. If
759 // a canonicalized version of it exists then that object is returned 715 // a canonicalized version of it exists then that object is returned
760 // otherwise a new object is allocated and returned. 716 // otherwise a new object is allocated and returned.
761 static RawClass* GetClass(ObjectKind kind); 717 static RawClass* GetClass(intptr_t class_id, bool is_signature_class);
762 718
763 private: 719 private:
764 void set_name(const String& value) const; 720 void set_name(const String& value) const;
765 void set_script(const Script& value) const; 721 void set_script(const Script& value) const;
766 void set_token_pos(intptr_t value) const; 722 void set_token_pos(intptr_t value) const;
767 void set_signature_function(const Function& value) const; 723 void set_signature_function(const Function& value) const;
768 void set_signature_type(const AbstractType& value) const; 724 void set_signature_type(const AbstractType& value) const;
769 void set_class_state(int8_t state) const; 725 void set_class_state(int8_t state) const;
770 726
771 void set_constants(const Array& value) const; 727 void set_constants(const Array& value) const;
(...skipping 4607 matching lines...) Expand 10 before | Expand all | Expand 10 after
5379 } 5335 }
5380 5336
5381 #if defined(DEBUG) 5337 #if defined(DEBUG)
5382 Isolate* isolate = Isolate::Current(); 5338 Isolate* isolate = Isolate::Current();
5383 Heap* isolate_heap = isolate->heap(); 5339 Heap* isolate_heap = isolate->heap();
5384 Heap* vm_isolate_heap = Dart::vm_isolate()->heap(); 5340 Heap* vm_isolate_heap = Dart::vm_isolate()->heap();
5385 ASSERT(isolate_heap->Contains(reinterpret_cast<uword>(raw_->ptr())) || 5341 ASSERT(isolate_heap->Contains(reinterpret_cast<uword>(raw_->ptr())) ||
5386 vm_isolate_heap->Contains(reinterpret_cast<uword>(raw_->ptr()))); 5342 vm_isolate_heap->Contains(reinterpret_cast<uword>(raw_->ptr())));
5387 #endif 5343 #endif
5388 intptr_t cid = raw_->GetClassId(); 5344 intptr_t cid = raw_->GetClassId();
5389 if (cid < kNumPredefinedKinds) { 5345 if (cid < kNumPredefinedCids) {
5390 #if defined(DEBUG) 5346 #if defined(DEBUG)
5391 ASSERT(builtin_vtables_[cid] == 5347 ASSERT(builtin_vtables_[cid] ==
5392 isolate->class_table()->At(cid)->ptr()->handle_vtable_); 5348 isolate->class_table()->At(cid)->ptr()->handle_vtable_);
5393 #endif 5349 #endif
5394 set_vtable(builtin_vtables_[cid]); 5350 set_vtable(builtin_vtables_[cid]);
5395 } else { 5351 } else {
5396 #if !defined(DEBUG) 5352 #if !defined(DEBUG)
5397 Isolate* isolate = Isolate::Current(); 5353 Isolate* isolate = Isolate::Current();
5398 #endif 5354 #endif
5399 RawClass* raw_class = isolate->class_table()->At(cid); 5355 RawClass* raw_class = isolate->class_table()->At(cid);
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
5459 if (this->CharAt(i) != str.CharAt(begin_index + i)) { 5415 if (this->CharAt(i) != str.CharAt(begin_index + i)) {
5460 return false; 5416 return false;
5461 } 5417 }
5462 } 5418 }
5463 return true; 5419 return true;
5464 } 5420 }
5465 5421
5466 } // namespace dart 5422 } // namespace dart
5467 5423
5468 #endif // VM_OBJECT_H_ 5424 #endif // VM_OBJECT_H_
OLDNEW
« no previous file with comments | « vm/intrinsifier_x64.cc ('k') | vm/object.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698