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.