Index: src/unique.h |
diff --git a/src/unique.h b/src/unique.h |
index 4668128e19c1e4f264e38d15bffec2c2f4291efc..3c1c0aab87aa375b75cba4621461199546f1f15b 100644 |
--- a/src/unique.h |
+++ b/src/unique.h |
@@ -7,6 +7,7 @@ |
#include "src/handles.h" |
#include "src/objects.h" |
+#include "src/string-stream.h" |
#include "src/utils.h" |
#include "src/zone.h" |
@@ -29,7 +30,7 @@ class UniqueSet; |
// Careful! Comparison of two Uniques is only correct if both were created |
// in the same "era" of GC or if at least one is a non-movable object. |
template <typename T> |
-class Unique V8_FINAL { |
+class Unique { |
public: |
// TODO(titzer): make private and introduce a uniqueness scope. |
explicit Unique(Handle<T> handle) { |
@@ -117,8 +118,10 @@ class Unique V8_FINAL { |
friend class UniqueSet<T>; // Uses internal details for speed. |
template <class U> |
friend class Unique; // For comparing raw_address values. |
+ template <class U> |
+ friend class PrintableUnique; // For automatic up casting. |
- private: |
+ protected: |
Unique<T>() : raw_address_(NULL) { } |
Address raw_address_; |
@@ -128,6 +131,70 @@ class Unique V8_FINAL { |
}; |
+// TODO(danno): At some point if all of the uses of Unique end up using |
+// PrintableUnique, then we should merge PrintableUnique into Unique and |
+// predicate generating the printable string on a "am I tracing" check. |
+template <class T> |
+class PrintableUnique : public Unique<T> { |
+ public: |
+ // TODO(titzer): make private and introduce a uniqueness scope. |
+ explicit PrintableUnique(Zone* zone, Handle<T> handle) : Unique<T>(handle) { |
+ InitializeString(zone); |
+ } |
+ |
+ // TODO(titzer): this is a hack to migrate to Unique<T> incrementally. |
+ PrintableUnique(Zone* zone, Address raw_address, Handle<T> handle) |
+ : Unique<T>(raw_address, handle) { |
+ InitializeString(zone); |
+ } |
+ |
+ // Constructor for handling automatic up casting. |
+ // Eg. PrintableUnique<JSFunction> can be passed when PrintableUnique<Object> |
+ // is expected. |
+ template <class S> |
+ PrintableUnique(PrintableUnique<S> uniq) // NOLINT |
+ : Unique<T>(Handle<T>()) { |
+#ifdef DEBUG |
+ T* a = NULL; |
+ S* b = NULL; |
+ a = b; // Fake assignment to enforce type checks. |
+ USE(a); |
+#endif |
+ this->raw_address_ = uniq.raw_address_; |
+ this->handle_ = uniq.handle_; |
+ string_ = uniq.string(); |
+ } |
+ |
+ // TODO(titzer): this is a hack to migrate to Unique<T> incrementally. |
+ static PrintableUnique<T> CreateUninitialized(Zone* zone, Handle<T> handle) { |
+ return PrintableUnique<T>(zone, reinterpret_cast<Address>(NULL), handle); |
+ } |
+ |
+ static PrintableUnique<T> CreateImmovable(Zone* zone, Handle<T> handle) { |
+ return PrintableUnique<T>(zone, reinterpret_cast<Address>(*handle), handle); |
+ } |
+ |
+ const char* string() { return string_; } |
+ |
+ private: |
+ const char* string_; |
+ |
+ void InitializeString(Zone* zone) { |
+ // The stringified version of the parameter must be calculated when the |
+ // Operator is constructed to avoid accessing the heap. |
+ HeapStringAllocator temp_allocator; |
+ StringStream stream(&temp_allocator); |
+ this->handle_->ShortPrint(&stream); |
+ SmartArrayPointer<const char> desc_string = stream.ToCString(); |
+ const char* desc_chars = desc_string.get(); |
+ int length = strlen(desc_chars); |
+ char* desc_copy = zone->NewArray<char>(length + 1); |
+ memcpy(desc_copy, desc_chars, length + 1); |
+ string_ = desc_copy; |
+ } |
+}; |
+ |
+ |
template <typename T> |
class UniqueSet V8_FINAL : public ZoneObject { |
public: |
@@ -341,7 +408,6 @@ class UniqueSet V8_FINAL : public ZoneObject { |
} |
}; |
- |
} } // namespace v8::internal |
#endif // V8_HYDROGEN_UNIQUE_H_ |