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