1 // Copyright 2016 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "src/field-type.h" 6 7 #include "src/ast/ast-types.h" 8 #include "src/handles-inl.h" 9 #include "src/objects-inl.h" 10 #include "src/ostreams.h" 11 12 namespace v8 { 13 namespace internal { 14 15 // static 16 FieldType* FieldType::None() { 17 // Do not Smi::kZero here or for Any(), as that may translate 18 // as `nullptr` which is not a valid value for `this`. 19 return reinterpret_cast<FieldType*>(Smi::FromInt(2)); 20 } 21 22 // static 23 FieldType* FieldType::Any() { 24 return reinterpret_cast<FieldType*>(Smi::FromInt(1)); 25 } 26 27 // static 28 Handle<FieldType> FieldType::None(Isolate* isolate) { 29 return handle(None(), isolate); 30 } 31 32 // static 33 Handle<FieldType> FieldType::Any(Isolate* isolate) { 34 return handle(Any(), isolate); 35 } 36 37 // static 38 FieldType* FieldType::Class(i::Map* map) { return FieldType::cast(map); } 39 40 // static 41 Handle<FieldType> FieldType::Class(i::Handle<i::Map> map, Isolate* isolate) { 42 return handle(Class(*map), isolate); 43 } 44 45 // static 46 FieldType* FieldType::cast(Object* object) { 47 DCHECK(object == None() || object == Any() || object->IsMap()); 48 return reinterpret_cast<FieldType*>(object); 49 } 50 51 bool FieldType::IsClass() { return this->IsMap(); } 52 53 Handle<i::Map> FieldType::AsClass() { 54 DCHECK(IsClass()); 55 i::Map* map = Map::cast(this); 56 return handle(map, map->GetIsolate()); 57 } 58 59 bool FieldType::NowStable() { 60 return !this->IsClass() || this->AsClass()->is_stable(); 61 } 62 63 bool FieldType::NowIs(FieldType* other) { 64 if (other->IsAny()) return true; 65 if (IsNone()) return true; 66 if (other->IsNone()) return false; 67 if (IsAny()) return false; 68 DCHECK(IsClass()); 69 DCHECK(other->IsClass()); 70 return this == other; 71 } 72 73 bool FieldType::NowIs(Handle<FieldType> other) { return NowIs(*other); } 74 75 AstType* FieldType::Convert(Zone* zone) { 76 if (IsAny()) return AstType::NonInternal(); 77 if (IsNone()) return AstType::None(); 78 DCHECK(IsClass()); 79 return AstType::Class(AsClass(), zone); 80 } 81 82 void FieldType::PrintTo(std::ostream& os) { 83 if (IsAny()) { 84 os << "Any"; 85 } else if (IsNone()) { 86 os << "None"; 87 } else { 88 DCHECK(IsClass()); 89 os << "Class(" << static_cast<void*>(*AsClass()) << ")"; 90 } 91 } 92 93 } // namespace internal 94 } // namespace v8 95