| Index: src/types-inl.h
|
| diff --git a/src/types-inl.h b/src/types-inl.h
|
| index 941fda797c880e4d66fd37a4f0abcf1093b8fdf2..d6c69c44009f64ddf8ce29d98b11d79f37d241f4 100644
|
| --- a/src/types-inl.h
|
| +++ b/src/types-inl.h
|
| @@ -14,92 +14,32 @@ namespace v8 {
|
| 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);
|
| - return tagged;
|
| -}
|
| -
|
| -
|
| -// static
|
| -void ZoneTypeConfig::tagged_shrink(Tagged* tagged, int size) {
|
| - tagged->Rewind(size + 1);
|
| -}
|
| -
|
| -
|
| -// static
|
| -ZoneTypeConfig::Tag ZoneTypeConfig::tagged_tag(Tagged* tagged) {
|
| - return static_cast<Tag>(reinterpret_cast<intptr_t>(tagged->at(0)));
|
| -}
|
| -
|
| -
|
| -// static
|
| -template<class T>
|
| -T ZoneTypeConfig::tagged_get(Tagged* tagged, int i) {
|
| - return reinterpret_cast<T>(tagged->at(i + 1));
|
| -}
|
| -
|
| -
|
| -// static
|
| -template<class T>
|
| -void ZoneTypeConfig::tagged_set(Tagged* tagged, int i, T value) {
|
| - tagged->at(i + 1) = reinterpret_cast<void*>(value);
|
| -}
|
| -
|
| -
|
| -// static
|
| -int ZoneTypeConfig::tagged_length(Tagged* tagged) {
|
| - return tagged->length() - 1;
|
| -}
|
| -
|
| -
|
| -// static
|
| Type* ZoneTypeConfig::handle(Type* type) {
|
| return type;
|
| }
|
|
|
|
|
| // static
|
| -bool ZoneTypeConfig::is(Type* type, Tag tag) {
|
| - return is_tagged(type) && tagged_tag(as_tagged(type)) == tag;
|
| -}
|
| -
|
| -
|
| -// static
|
| bool ZoneTypeConfig::is_bitset(Type* type) {
|
| return reinterpret_cast<intptr_t>(type) & 1;
|
| }
|
|
|
|
|
| // static
|
| -bool ZoneTypeConfig::is_tagged(Type* type) {
|
| +bool ZoneTypeConfig::is_struct(Type* type) {
|
| return !is_bitset(type);
|
| }
|
|
|
|
|
| // static
|
| bool ZoneTypeConfig::is_class(Type* type) {
|
| - return is(type, kClassTag);
|
| + return is_struct(type) && struct_tag(as_struct(type)) == Type::kClassTag;
|
| }
|
|
|
|
|
| // static
|
| bool ZoneTypeConfig::is_constant(Type* type) {
|
| - return is(type, kConstantTag);
|
| -}
|
| -
|
| -
|
| -// static
|
| -bool ZoneTypeConfig::is_union(Type* type) {
|
| - return is(type, kUnionTag);
|
| -}
|
| -
|
| -
|
| -// static
|
| -bool ZoneTypeConfig::tagged_is_union(Tagged* tagged) {
|
| - return is(from_tagged(tagged), kUnionTag);
|
| + return is_struct(type) && struct_tag(as_struct(type)) == Type::kConstantTag;
|
| }
|
|
|
|
|
| @@ -111,37 +51,24 @@ int ZoneTypeConfig::as_bitset(Type* type) {
|
|
|
|
|
| // static
|
| -ZoneTypeConfig::Tagged* ZoneTypeConfig::as_tagged(Type* type) {
|
| - ASSERT(is_tagged(type));
|
| - return reinterpret_cast<Tagged*>(type);
|
| +ZoneTypeConfig::Struct* ZoneTypeConfig::as_struct(Type* type) {
|
| + ASSERT(is_struct(type));
|
| + return reinterpret_cast<Struct*>(type);
|
| }
|
|
|
|
|
| // static
|
| i::Handle<i::Map> ZoneTypeConfig::as_class(Type* type) {
|
| ASSERT(is_class(type));
|
| - return i::Handle<i::Map>(tagged_get<i::Map**>(as_tagged(type), 1));
|
| + return i::Handle<i::Map>(static_cast<i::Map**>(as_struct(type)[3]));
|
| }
|
|
|
|
|
| // static
|
| i::Handle<i::Object> ZoneTypeConfig::as_constant(Type* type) {
|
| ASSERT(is_constant(type));
|
| - return i::Handle<i::Object>(tagged_get<i::Object**>(as_tagged(type), 1));
|
| -}
|
| -
|
| -
|
| -// static
|
| -ZoneTypeConfig::Unioned* ZoneTypeConfig::as_union(Type* type) {
|
| - ASSERT(is_union(type));
|
| - return tagged_as_union(as_tagged(type));
|
| -}
|
| -
|
| -
|
| -// static
|
| -ZoneTypeConfig::Unioned* ZoneTypeConfig::tagged_as_union(Tagged* tagged) {
|
| - ASSERT(tagged_is_union(tagged));
|
| - return reinterpret_cast<Unioned*>(tagged);
|
| + return i::Handle<i::Object>(
|
| + static_cast<i::Object**>(as_struct(type)[3]));
|
| }
|
|
|
|
|
| @@ -158,80 +85,81 @@ ZoneTypeConfig::Type* ZoneTypeConfig::from_bitset(int bitset, Zone* Zone) {
|
|
|
|
|
| // static
|
| -ZoneTypeConfig::Type* ZoneTypeConfig::from_tagged(Tagged* tagged) {
|
| - return reinterpret_cast<Type*>(tagged);
|
| +ZoneTypeConfig::Type* ZoneTypeConfig::from_struct(Struct* structured) {
|
| + return reinterpret_cast<Type*>(structured);
|
| }
|
|
|
|
|
| // static
|
| ZoneTypeConfig::Type* ZoneTypeConfig::from_class(
|
| i::Handle<i::Map> map, int lub, Zone* zone) {
|
| - Tagged* tagged = tagged_create(kClassTag, 2, zone);
|
| - tagged_set(tagged, 0, lub);
|
| - tagged_set(tagged, 1, map.location());
|
| - return from_tagged(tagged);
|
| + Struct* structured = struct_create(Type::kClassTag, 2, zone);
|
| + structured[2] = from_bitset(lub);
|
| + structured[3] = map.location();
|
| + return from_struct(structured);
|
| }
|
|
|
|
|
| // static
|
| ZoneTypeConfig::Type* ZoneTypeConfig::from_constant(
|
| i::Handle<i::Object> value, int lub, Zone* zone) {
|
| - Tagged* tagged = tagged_create(kConstantTag, 2, zone);
|
| - tagged_set(tagged, 0, lub);
|
| - tagged_set(tagged, 1, value.location());
|
| - return from_tagged(tagged);
|
| + Struct* structured = struct_create(Type::kConstantTag, 2, zone);
|
| + structured[2] = from_bitset(lub);
|
| + structured[3] = value.location();
|
| + return from_struct(structured);
|
| }
|
|
|
|
|
| // static
|
| -ZoneTypeConfig::Type* ZoneTypeConfig::from_union(Unioned* unioned) {
|
| - return from_tagged(tagged_from_union(unioned));
|
| +ZoneTypeConfig::Struct* ZoneTypeConfig::struct_create(
|
| + int tag, int length, Zone* zone) {
|
| + Struct* structured = reinterpret_cast<Struct*>(
|
| + zone->New(sizeof(void*) * (length + 2))); // NOLINT
|
| + structured[0] = reinterpret_cast<void*>(tag);
|
| + structured[1] = reinterpret_cast<void*>(length);
|
| + return structured;
|
| }
|
|
|
|
|
| // static
|
| -ZoneTypeConfig::Tagged* ZoneTypeConfig::tagged_from_union(Unioned* unioned) {
|
| - return reinterpret_cast<Tagged*>(unioned);
|
| +void ZoneTypeConfig::struct_shrink(Struct* structured, int length) {
|
| + ASSERT(0 <= length && length <= struct_length(structured));
|
| + structured[1] = reinterpret_cast<void*>(length);
|
| }
|
|
|
|
|
| // static
|
| -ZoneTypeConfig::Unioned* ZoneTypeConfig::union_create(int size, Zone* zone) {
|
| - return tagged_as_union(tagged_create(kUnionTag, size, zone));
|
| +int ZoneTypeConfig::struct_tag(Struct* structured) {
|
| + int tag = reinterpret_cast<intptr_t>(structured[0]);
|
| + return tag;
|
| }
|
|
|
|
|
| // static
|
| -void ZoneTypeConfig::union_shrink(Unioned* unioned, int size) {
|
| - tagged_shrink(tagged_from_union(unioned), size);
|
| +int ZoneTypeConfig::struct_length(Struct* structured) {
|
| + int length = reinterpret_cast<intptr_t>(structured[1]);
|
| + return length;
|
| }
|
|
|
|
|
| // static
|
| -ZoneTypeConfig::Type* ZoneTypeConfig::union_get(Unioned* unioned, int i) {
|
| - Type* type = tagged_get<Type*>(tagged_from_union(unioned), i);
|
| - ASSERT(!is_union(type));
|
| - return type;
|
| +Type* ZoneTypeConfig::struct_get(Struct* structured, int i) {
|
| + ASSERT(0 <= i && i <= struct_length(structured));
|
| + return static_cast<Type*>(structured[2 + i]);
|
| }
|
|
|
|
|
| // static
|
| -void ZoneTypeConfig::union_set(Unioned* unioned, int i, Type* type) {
|
| - ASSERT(!is_union(type));
|
| - tagged_set(tagged_from_union(unioned), i, type);
|
| -}
|
| -
|
| -
|
| -// static
|
| -int ZoneTypeConfig::union_length(Unioned* unioned) {
|
| - return tagged_length(tagged_from_union(unioned));
|
| +void ZoneTypeConfig::struct_set(Struct* structured, int i, Type* type) {
|
| + ASSERT(0 <= i && i <= struct_length(structured));
|
| + structured[2 + i] = type;
|
| }
|
|
|
|
|
| // static
|
| int ZoneTypeConfig::lub_bitset(Type* type) {
|
| ASSERT(is_class(type) || is_constant(type));
|
| - return static_cast<int>(tagged_get<intptr_t>(as_tagged(type), 0));
|
| + return as_bitset(struct_get(as_struct(type), 0));
|
| }
|
|
|
| // -------------------------------------------------------------------------- //
|
| @@ -261,7 +189,7 @@ bool HeapTypeConfig::is_constant(Type* type) {
|
|
|
|
|
| // static
|
| -bool HeapTypeConfig::is_union(Type* type) {
|
| +bool HeapTypeConfig::is_struct(Type* type) {
|
| return type->IsFixedArray();
|
| }
|
|
|
| @@ -286,8 +214,8 @@ i::Handle<i::Object> HeapTypeConfig::as_constant(Type* type) {
|
|
|
|
|
| // static
|
| -i::Handle<HeapTypeConfig::Unioned> HeapTypeConfig::as_union(Type* type) {
|
| - return i::handle(i::FixedArray::cast(type));
|
| +i::Handle<HeapTypeConfig::Struct> HeapTypeConfig::as_struct(Type* type) {
|
| + return i::handle(Struct::cast(type));
|
| }
|
|
|
|
|
| @@ -320,45 +248,51 @@ i::Handle<HeapTypeConfig::Type> HeapTypeConfig::from_constant(
|
|
|
|
|
| // static
|
| -i::Handle<HeapTypeConfig::Type> HeapTypeConfig::from_union(
|
| - i::Handle<Unioned> unioned) {
|
| - return i::Handle<Type>::cast(i::Handle<Object>::cast(unioned));
|
| +i::Handle<HeapTypeConfig::Type> HeapTypeConfig::from_struct(
|
| + i::Handle<Struct> structured) {
|
| + return i::Handle<Type>::cast(i::Handle<Object>::cast(structured));
|
| +}
|
| +
|
| +
|
| +// static
|
| +i::Handle<HeapTypeConfig::Struct> HeapTypeConfig::struct_create(
|
| + int tag, int length, Isolate* isolate) {
|
| + i::Handle<Struct> structured = isolate->factory()->NewFixedArray(length + 1);
|
| + structured->set(0, i::Smi::FromInt(tag));
|
| + return structured;
|
| }
|
|
|
|
|
| // static
|
| -i::Handle<HeapTypeConfig::Unioned> HeapTypeConfig::union_create(
|
| - int size, Isolate* isolate) {
|
| - return isolate->factory()->NewFixedArray(size);
|
| +void HeapTypeConfig::struct_shrink(i::Handle<Struct> structured, int length) {
|
| + structured->Shrink(length + 1);
|
| }
|
|
|
|
|
| // static
|
| -void HeapTypeConfig::union_shrink(i::Handle<Unioned> unioned, int size) {
|
| - unioned->Shrink(size);
|
| +int HeapTypeConfig::struct_tag(i::Handle<Struct> structured) {
|
| + return static_cast<i::Smi*>(structured->get(0))->value();
|
| }
|
|
|
|
|
| // static
|
| -i::Handle<HeapTypeConfig::Type> HeapTypeConfig::union_get(
|
| - i::Handle<Unioned> unioned, int i) {
|
| - Type* type = static_cast<Type*>(unioned->get(i));
|
| - ASSERT(!is_union(type));
|
| - return i::handle(type, unioned->GetIsolate());
|
| +int HeapTypeConfig::struct_length(i::Handle<Struct> structured) {
|
| + return structured->length() - 1;
|
| }
|
|
|
|
|
| // static
|
| -void HeapTypeConfig::union_set(
|
| - i::Handle<Unioned> unioned, int i, i::Handle<Type> type) {
|
| - ASSERT(!is_union(*type));
|
| - unioned->set(i, *type);
|
| +i::Handle<HeapTypeConfig::Type> HeapTypeConfig::struct_get(
|
| + i::Handle<Struct> structured, int i) {
|
| + Type* type = static_cast<Type*>(structured->get(i + 1));
|
| + return i::handle(type, structured->GetIsolate());
|
| }
|
|
|
|
|
| // static
|
| -int HeapTypeConfig::union_length(i::Handle<Unioned> unioned) {
|
| - return unioned->length();
|
| +void HeapTypeConfig::struct_set(
|
| + i::Handle<Struct> structured, int i, i::Handle<Type> type) {
|
| + structured->set(i + 1, *type);
|
| }
|
|
|
|
|
|
|