Reviewers: rossberg,

Message:
As discussed offline... PTAL

Description:
Compact representation for tagged zone types.

[email protected]

Please review this at https://codereview.chromium.org/220923002/

SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge

Affected files (+25, -12 lines):
  M src/types.h
  M src/types-inl.h


Index: src/types-inl.h
diff --git a/src/types-inl.h b/src/types-inl.h
index f318c0cc53c7b46aadd33cc870236dc8caf70948..256821c56123e48bee698471f0a914f224729104 100644
--- a/src/types-inl.h
+++ b/src/types-inl.h
@@ -15,42 +15,51 @@ namespace internal {
 // static
 ZoneTypeConfig::Tagged* ZoneTypeConfig::tagged_create(
     Tag tag, int size, Zone* zone) {
-  Tagged* tagged = new(zone) Tagged(size + 1, zone);
-  tagged->Add(reinterpret_cast<void*>(tag), zone);
-  tagged->AddBlock(NULL, size, zone);
+  ASSERT(size >= 0);
+  Tagged* tagged;
+  tagged = reinterpret_cast<Tagged*>(zone->New(
+          sizeof(Tagged) + sizeof(tagged->elements[0]) * (size - 1)));
+  tagged->tag = tag;
+  tagged->length = size;
   return tagged;
 }


 // static
 void ZoneTypeConfig::tagged_shrink(Tagged* tagged, int size) {
-  tagged->Rewind(size + 1);
+  ASSERT(size >= 0);
+  ASSERT(size <= tagged->length);
+  tagged->length = size;
 }


 // static
 ZoneTypeConfig::Tag ZoneTypeConfig::tagged_tag(Tagged* tagged) {
-  return static_cast<Tag>(reinterpret_cast<intptr_t>(tagged->at(0)));
+  return tagged->tag;
 }


 // static
 template<class T>
 T ZoneTypeConfig::tagged_get(Tagged* tagged, int i) {
-  return reinterpret_cast<T>(tagged->at(i + 1));
+  ASSERT(i >= 0);
+  ASSERT(i < tagged->length);
+  return reinterpret_cast<T>(tagged->elements[i]);
 }


 // static
 template<class T>
 void ZoneTypeConfig::tagged_set(Tagged* tagged, int i, T value) {
-  tagged->at(i + 1) = reinterpret_cast<void*>(value);
+  ASSERT(i >= 0);
+  ASSERT(i < tagged->length);
+  tagged->elements[i] = reinterpret_cast<void*>(value);
 }


 // static
 int ZoneTypeConfig::tagged_length(Tagged* tagged) {
-  return tagged->length() - 1;
+  return tagged->length;
 }


Index: src/types.h
diff --git a/src/types.h b/src/types.h
index dda78d363c8816d910ab44bdd6e8ac9834744c77..0ba21e346b8fabd44b91c0cc588e38a8934bed63 100644
--- a/src/types.h
+++ b/src/types.h
@@ -344,18 +344,22 @@ class TypeImpl : public Config::Base {


 // Zone-allocated types are either (odd) integers to represent bitsets, or
-// (even) pointers to zone lists for everything else. The first slot of every
-// list is an explicit tag value to distinguish representation.
+// (even) pointers to tagged structures for everything else. The first slot of
+// every structure is an explicit tag value to distinguish representation.
 struct ZoneTypeConfig {
  private:
-  typedef i::ZoneList<void*> Tagged;
-
   enum Tag {
     kClassTag,
     kConstantTag,
     kUnionTag
   };

+  struct Tagged V8_FINAL {
+    Tag tag;
+    int length;
+    void* elements[1];
+  };
+
   static inline Tagged* tagged_create(Tag tag, int size, Zone* zone);
   static inline void tagged_shrink(Tagged* tagged, int size);
   static inline Tag tagged_tag(Tagged* tagged);


--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to