1109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// Copyright 2016 the V8 project authors. All rights reserved. 2109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// found in the LICENSE file. 4109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 5109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#include "src/field-type.h" 6109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 7f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include "src/ast/ast-types.h" 8109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#include "src/handles-inl.h" 962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/objects-inl.h" 10109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#include "src/ostreams.h" 11109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 12109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochnamespace v8 { 13109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochnamespace internal { 14109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 15109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// static 16109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochFieldType* FieldType::None() { 17c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Do not Smi::kZero here or for Any(), as that may translate 18f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // as `nullptr` which is not a valid value for `this`. 19f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return reinterpret_cast<FieldType*>(Smi::FromInt(2)); 20109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch} 21109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 22109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// static 23109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochFieldType* FieldType::Any() { 24109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return reinterpret_cast<FieldType*>(Smi::FromInt(1)); 25109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch} 26109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 27109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// static 28109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochHandle<FieldType> FieldType::None(Isolate* isolate) { 29109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return handle(None(), isolate); 30109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch} 31109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 32109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// static 33109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochHandle<FieldType> FieldType::Any(Isolate* isolate) { 34109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return handle(Any(), isolate); 35109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch} 36109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 37109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// static 38109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochFieldType* FieldType::Class(i::Map* map) { return FieldType::cast(map); } 39109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 40109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// static 41109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochHandle<FieldType> FieldType::Class(i::Handle<i::Map> map, Isolate* isolate) { 42109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return handle(Class(*map), isolate); 43109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch} 44109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 45109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// static 46109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochFieldType* FieldType::cast(Object* object) { 47109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch DCHECK(object == None() || object == Any() || object->IsMap()); 48109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return reinterpret_cast<FieldType*>(object); 49109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch} 50109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 51109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochbool FieldType::IsClass() { return this->IsMap(); } 52109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 53109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochHandle<i::Map> FieldType::AsClass() { 54109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch DCHECK(IsClass()); 55109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch i::Map* map = Map::cast(this); 56109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return handle(map, map->GetIsolate()); 57109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch} 58109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 59109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochbool FieldType::NowStable() { 60109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return !this->IsClass() || this->AsClass()->is_stable(); 61109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch} 62109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 63109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochbool FieldType::NowIs(FieldType* other) { 64109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch if (other->IsAny()) return true; 65109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch if (IsNone()) return true; 66109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch if (other->IsNone()) return false; 67109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch if (IsAny()) return false; 68109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch DCHECK(IsClass()); 69109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch DCHECK(other->IsClass()); 70109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return this == other; 71109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch} 72109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 73109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochbool FieldType::NowIs(Handle<FieldType> other) { return NowIs(*other); } 74109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 75f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochAstType* FieldType::Convert(Zone* zone) { 76f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch if (IsAny()) return AstType::NonInternal(); 77f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch if (IsNone()) return AstType::None(); 78109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch DCHECK(IsClass()); 79f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return AstType::Class(AsClass(), zone); 80109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch} 81109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 82109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochvoid FieldType::PrintTo(std::ostream& os) { 83109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch if (IsAny()) { 84109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch os << "Any"; 85109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch } else if (IsNone()) { 86109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch os << "None"; 87109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch } else { 88109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch DCHECK(IsClass()); 89109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch os << "Class(" << static_cast<void*>(*AsClass()) << ")"; 90109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch } 91109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch} 92109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 93109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch} // namespace internal 94109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch} // namespace v8 95