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 "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 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
284 | 284 |
285 // Allocate and initialize the null class. | 285 // Allocate and initialize the null class. |
286 cls = Class::New<Instance>(); | 286 cls = Class::New<Instance>(); |
287 cls.set_is_finalized(); | 287 cls.set_is_finalized(); |
288 null_class_ = cls.raw(); | 288 null_class_ = cls.raw(); |
289 | 289 |
290 // Complete initialization of null_ instance, i.e. initialize its class_ | 290 // Complete initialization of null_ instance, i.e. initialize its class_ |
291 // field. | 291 // field. |
292 null_->ptr()->class_ = null_class_; | 292 null_->ptr()->class_ = null_class_; |
293 | 293 |
294 // Allocate and initialize the sentinel values of an instance class. | 294 // Allocate and initialize the sentinel values of Null class. |
295 { | 295 { |
296 cls = Class::New<Instance>(); | 296 cls = null_class_; |
297 Instance& sentinel = Instance::Handle(); | 297 Instance& sentinel = Instance::Handle(); |
298 sentinel ^= Object::Allocate(cls, Instance::InstanceSize(), Heap::kOld); | 298 sentinel ^= Object::Allocate(cls, Instance::InstanceSize(), Heap::kOld); |
299 sentinel_ = sentinel.raw(); | 299 sentinel_ = sentinel.raw(); |
300 | 300 |
301 Instance& transition_sentinel = Instance::Handle(); | 301 Instance& transition_sentinel = Instance::Handle(); |
302 transition_sentinel ^= | 302 transition_sentinel ^= |
303 Object::Allocate(cls, Instance::InstanceSize(), Heap::kOld); | 303 Object::Allocate(cls, Instance::InstanceSize(), Heap::kOld); |
304 transition_sentinel_ = transition_sentinel.raw(); | 304 transition_sentinel_ = transition_sentinel.raw(); |
305 } | 305 } |
306 | 306 |
(...skipping 6205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6512 const AbstractType& instantiated_other = | 6512 const AbstractType& instantiated_other = |
6513 AbstractType::Handle(other_instantiator.TypeAt(other.Index())); | 6513 AbstractType::Handle(other_instantiator.TypeAt(other.Index())); |
6514 ASSERT(instantiated_other.IsInstantiated()); | 6514 ASSERT(instantiated_other.IsInstantiated()); |
6515 other_class = instantiated_other.type_class(); | 6515 other_class = instantiated_other.type_class(); |
6516 } else { | 6516 } else { |
6517 other_class = other.type_class(); | 6517 other_class = other.type_class(); |
6518 } | 6518 } |
6519 return other_class.IsObjectClass() || other_class.IsDynamicClass(); | 6519 return other_class.IsObjectClass() || other_class.IsDynamicClass(); |
6520 } | 6520 } |
6521 const Class& cls = Class::Handle(clazz()); | 6521 const Class& cls = Class::Handle(clazz()); |
| 6522 // We must not encounter Object::sentinel() or Object::transition_sentinel(), |
| 6523 // both instances of class NullClass, but not instance Object::null(). |
| 6524 ASSERT(!cls.IsNullClass()); |
6522 AbstractTypeArguments& type_arguments = AbstractTypeArguments::Handle(); | 6525 AbstractTypeArguments& type_arguments = AbstractTypeArguments::Handle(); |
6523 const intptr_t num_type_arguments = cls.NumTypeArguments(); | 6526 const intptr_t num_type_arguments = cls.NumTypeArguments(); |
6524 if (num_type_arguments > 0) { | 6527 if (num_type_arguments > 0) { |
6525 type_arguments = GetTypeArguments(); | 6528 type_arguments = GetTypeArguments(); |
6526 // Verify that the number of type arguments in the instance matches the | 6529 // Verify that the number of type arguments in the instance matches the |
6527 // number of type arguments expected by the instance class. | 6530 // number of type arguments expected by the instance class. |
6528 // A discrepancy is allowed for closures, which borrow the type argument | 6531 // A discrepancy is allowed for closures, which borrow the type argument |
6529 // vector of their instantiator, which may be of a super class of the class | 6532 // vector of their instantiator, which may be of a super class of the class |
6530 // defining the closure. Truncating the vector to the correct length on | 6533 // defining the closure. Truncating the vector to the correct length on |
6531 // instantiation is unnecessary. The vector may therefore be longer. | 6534 // instantiation is unnecessary. The vector may therefore be longer. |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6595 | 6598 |
6596 bool Instance::IsValidFieldOffset(int offset) const { | 6599 bool Instance::IsValidFieldOffset(int offset) const { |
6597 const Class& cls = Class::Handle(clazz()); | 6600 const Class& cls = Class::Handle(clazz()); |
6598 return (offset >= 0 && offset <= (cls.instance_size() - kWordSize)); | 6601 return (offset >= 0 && offset <= (cls.instance_size() - kWordSize)); |
6599 } | 6602 } |
6600 | 6603 |
6601 | 6604 |
6602 const char* Instance::ToCString() const { | 6605 const char* Instance::ToCString() const { |
6603 if (IsNull()) { | 6606 if (IsNull()) { |
6604 return "null"; | 6607 return "null"; |
| 6608 } else if (raw() == Object::sentinel()) { |
| 6609 return "sentinel"; |
| 6610 } else if (raw() == Object::transition_sentinel()) { |
| 6611 return "transition_sentinel"; |
6605 } else if (Isolate::Current()->no_gc_scope_depth() > 0) { | 6612 } else if (Isolate::Current()->no_gc_scope_depth() > 0) { |
6606 // Can occur when running disassembler. | 6613 // Can occur when running disassembler. |
6607 return "Instance"; | 6614 return "Instance"; |
6608 } else { | 6615 } else { |
6609 const char* kFormat = "Instance of '%s'"; | 6616 const char* kFormat = "Instance of '%s'"; |
6610 Class& cls = Class::Handle(clazz()); | 6617 Class& cls = Class::Handle(clazz()); |
6611 AbstractTypeArguments& type_arguments = AbstractTypeArguments::Handle(); | 6618 AbstractTypeArguments& type_arguments = AbstractTypeArguments::Handle(); |
6612 const intptr_t num_type_arguments = cls.NumTypeArguments(); | 6619 const intptr_t num_type_arguments = cls.NumTypeArguments(); |
6613 if (num_type_arguments > 0) { | 6620 if (num_type_arguments > 0) { |
6614 type_arguments = GetTypeArguments(); | 6621 type_arguments = GetTypeArguments(); |
(...skipping 2515 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9130 const String& str = String::Handle(pattern()); | 9137 const String& str = String::Handle(pattern()); |
9131 const char* format = "JSRegExp: pattern=%s flags=%s"; | 9138 const char* format = "JSRegExp: pattern=%s flags=%s"; |
9132 intptr_t len = OS::SNPrint(NULL, 0, format, str.ToCString(), Flags()); | 9139 intptr_t len = OS::SNPrint(NULL, 0, format, str.ToCString(), Flags()); |
9133 char* chars = reinterpret_cast<char*>( | 9140 char* chars = reinterpret_cast<char*>( |
9134 Isolate::Current()->current_zone()->Allocate(len + 1)); | 9141 Isolate::Current()->current_zone()->Allocate(len + 1)); |
9135 OS::SNPrint(chars, (len + 1), format, str.ToCString(), Flags()); | 9142 OS::SNPrint(chars, (len + 1), format, str.ToCString(), Flags()); |
9136 return chars; | 9143 return chars; |
9137 } | 9144 } |
9138 | 9145 |
9139 } // namespace dart | 9146 } // namespace dart |
OLD | NEW |