| Index: src/types-inl.h
|
| diff --git a/src/types-inl.h b/src/types-inl.h
|
| index c22dfd4fcc3bf365cdf68ac2ab1601f56a4ffa86..762a11df303d85f6c8289d8526564233140def4d 100644
|
| --- a/src/types-inl.h
|
| +++ b/src/types-inl.h
|
| @@ -96,7 +96,18 @@ bool ZoneTypeConfig::is_bitset(Type* type) {
|
|
|
| // static
|
| bool ZoneTypeConfig::is_struct(Type* type, int tag) {
|
| - return !is_bitset(type) && struct_tag(as_struct(type)) == tag;
|
| + DCHECK(tag != kRangeStructTag);
|
| + if (is_bitset(type)) return false;
|
| + int type_tag = struct_tag(as_struct(type));
|
| + return type_tag == tag;
|
| +}
|
| +
|
| +
|
| +// static
|
| +bool ZoneTypeConfig::is_range(Type* type) {
|
| + if (is_bitset(type)) return false;
|
| + int type_tag = struct_tag(as_struct(type));
|
| + return type_tag == kRangeStructTag;
|
| }
|
|
|
|
|
| @@ -121,6 +132,13 @@ ZoneTypeConfig::Struct* ZoneTypeConfig::as_struct(Type* type) {
|
|
|
|
|
| // static
|
| +ZoneTypeConfig::Range* ZoneTypeConfig::as_range(Type* type) {
|
| + DCHECK(!is_bitset(type));
|
| + return reinterpret_cast<Range*>(type);
|
| +}
|
| +
|
| +
|
| +// static
|
| i::Handle<i::Map> ZoneTypeConfig::as_class(Type* type) {
|
| UNREACHABLE();
|
| return i::Handle<i::Map>();
|
| @@ -147,6 +165,12 @@ ZoneTypeConfig::Type* ZoneTypeConfig::from_struct(Struct* structure) {
|
|
|
|
|
| // static
|
| +ZoneTypeConfig::Type* ZoneTypeConfig::from_range(Range* range) {
|
| + return reinterpret_cast<Type*>(range);
|
| +}
|
| +
|
| +
|
| +// static
|
| ZoneTypeConfig::Type* ZoneTypeConfig::from_class(
|
| i::Handle<i::Map> map, Zone* zone) {
|
| return from_bitset(0);
|
| @@ -156,6 +180,7 @@ ZoneTypeConfig::Type* ZoneTypeConfig::from_class(
|
| // static
|
| ZoneTypeConfig::Struct* ZoneTypeConfig::struct_create(
|
| int tag, int length, Zone* zone) {
|
| + DCHECK(tag != kRangeStructTag);
|
| Struct* structure = reinterpret_cast<Struct*>(
|
| zone->New(sizeof(void*) * (length + 2))); // NOLINT
|
| structure[0] = reinterpret_cast<void*>(tag);
|
| @@ -214,6 +239,45 @@ void ZoneTypeConfig::struct_set_value(
|
| }
|
|
|
|
|
| +// static
|
| +ZoneTypeConfig::Range* ZoneTypeConfig::range_create(Zone* zone) {
|
| + Range* range = reinterpret_cast<Range*>(zone->New(sizeof(Range))); // NOLINT
|
| + range->tag = reinterpret_cast<void*>(kRangeStructTag);
|
| + range->bitset = 0;
|
| + range->limits[0] = 1;
|
| + range->limits[1] = 0;
|
| + return range;
|
| +}
|
| +
|
| +
|
| +// static
|
| +int ZoneTypeConfig::range_get_bitset(ZoneTypeConfig::Range* range) {
|
| + return range->bitset;
|
| +}
|
| +
|
| +
|
| +// static
|
| +void ZoneTypeConfig::range_set_bitset(ZoneTypeConfig::Range* range, int value) {
|
| + range->bitset = value;
|
| +}
|
| +
|
| +
|
| +// static
|
| +double ZoneTypeConfig::range_get_double(ZoneTypeConfig::Range* range,
|
| + int index) {
|
| + DCHECK(index >= 0 && index < 2);
|
| + return range->limits[index];
|
| +}
|
| +
|
| +
|
| +// static
|
| +void ZoneTypeConfig::range_set_double(ZoneTypeConfig::Range* range, int index,
|
| + double value, Zone*) {
|
| + DCHECK(index >= 0 && index < 2);
|
| + range->limits[index] = value;
|
| +}
|
| +
|
| +
|
| // -----------------------------------------------------------------------------
|
| // HeapTypeConfig
|
|
|
| @@ -252,11 +316,18 @@ bool HeapTypeConfig::is_class(Type* type) {
|
|
|
| // static
|
| bool HeapTypeConfig::is_struct(Type* type, int tag) {
|
| + DCHECK(tag != kRangeStructTag);
|
| return type->IsFixedArray() && struct_tag(as_struct(type)) == tag;
|
| }
|
|
|
|
|
| // static
|
| +bool HeapTypeConfig::is_range(Type* type) {
|
| + return type->IsFixedArray() && struct_tag(as_struct(type)) == kRangeStructTag;
|
| +}
|
| +
|
| +
|
| +// static
|
| HeapTypeConfig::Type::bitset HeapTypeConfig::as_bitset(Type* type) {
|
| // TODO(rossberg): Breaks the Smi abstraction. Fix once there is a better way.
|
| return static_cast<Type::bitset>(reinterpret_cast<uintptr_t>(type));
|
| @@ -276,6 +347,12 @@ i::Handle<HeapTypeConfig::Struct> HeapTypeConfig::as_struct(Type* type) {
|
|
|
|
|
| // static
|
| +i::Handle<HeapTypeConfig::Range> HeapTypeConfig::as_range(Type* type) {
|
| + return i::handle(Range::cast(type));
|
| +}
|
| +
|
| +
|
| +// static
|
| HeapTypeConfig::Type* HeapTypeConfig::from_bitset(Type::bitset bitset) {
|
| // TODO(rossberg): Breaks the Smi abstraction. Fix once there is a better way.
|
| return reinterpret_cast<Type*>(static_cast<uintptr_t>(bitset));
|
| @@ -304,6 +381,13 @@ i::Handle<HeapTypeConfig::Type> HeapTypeConfig::from_struct(
|
|
|
|
|
| // static
|
| +i::Handle<HeapTypeConfig::Type> HeapTypeConfig::from_range(
|
| + i::Handle<Range> range) {
|
| + return i::Handle<Type>::cast(i::Handle<Object>::cast(range));
|
| +}
|
| +
|
| +
|
| +// static
|
| i::Handle<HeapTypeConfig::Struct> HeapTypeConfig::struct_create(
|
| int tag, int length, Isolate* isolate) {
|
| i::Handle<Struct> structure = isolate->factory()->NewFixedArray(length + 1);
|
| @@ -361,6 +445,46 @@ void HeapTypeConfig::struct_set_value(
|
| structure->set(i + 1, *x);
|
| }
|
|
|
| +
|
| +// static
|
| +i::Handle<HeapTypeConfig::Range> HeapTypeConfig::range_create(
|
| + Isolate* isolate) {
|
| + i::Handle<Range> range = isolate->factory()->NewFixedArray(4);
|
| + range->set(0, i::Smi::FromInt(kRangeStructTag));
|
| + return range;
|
| +}
|
| +
|
| +
|
| +// static
|
| +int HeapTypeConfig::range_get_bitset(i::Handle<HeapTypeConfig::Range> range) {
|
| + Type* v = static_cast<Type*>(range->get(1));
|
| + return as_bitset(v);
|
| +}
|
| +
|
| +
|
| +// static
|
| +void HeapTypeConfig::range_set_bitset(i::Handle<HeapTypeConfig::Range> range,
|
| + int value) {
|
| + range->set(1, from_bitset(value));
|
| +}
|
| +
|
| +
|
| +// static
|
| +double HeapTypeConfig::range_get_double(i::Handle<HeapTypeConfig::Range> range,
|
| + int index) {
|
| + DCHECK(index >= 0 && index < 2);
|
| + return range->get(index + 2)->Number();
|
| +}
|
| +
|
| +
|
| +// static
|
| +void HeapTypeConfig::range_set_double(i::Handle<HeapTypeConfig::Range> range,
|
| + int index, double value,
|
| + Isolate* isolate) {
|
| + DCHECK(index >= 0 && index < 2);
|
| + i::Handle<Object> number = isolate->factory()->NewNumber(value);
|
| + range->set(index + 2, *number);
|
| +}
|
| } } // namespace v8::internal
|
|
|
| #endif // V8_TYPES_INL_H_
|
|
|