Line data Source code
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/handles-inl.h"
8 : #include "src/objects-inl.h"
9 : #include "src/objects/smi.h"
10 : #include "src/ostreams.h"
11 :
12 : namespace v8 {
13 : namespace internal {
14 :
15 : // static
16 1372846 : FieldType FieldType::None() { return FieldType(Smi::FromInt(2).ptr()); }
17 :
18 : // static
19 237992 : FieldType FieldType::Any() { return FieldType(Smi::FromInt(1).ptr()); }
20 :
21 : // static
22 237756 : Handle<FieldType> FieldType::None(Isolate* isolate) {
23 237756 : return handle(None(), isolate);
24 : }
25 :
26 : // static
27 6892472 : Handle<FieldType> FieldType::Any(Isolate* isolate) {
28 6892471 : return handle(Any(), isolate);
29 : }
30 :
31 : // static
32 0 : FieldType FieldType::Class(Map map) { return FieldType::cast(map); }
33 :
34 : // static
35 782117 : Handle<FieldType> FieldType::Class(Handle<Map> map, Isolate* isolate) {
36 782118 : return handle(Class(*map), isolate);
37 : }
38 :
39 : // static
40 39430272 : FieldType FieldType::cast(Object object) {
41 : DCHECK(object == None() || object == Any() || object->IsMap());
42 39430272 : return FieldType(object->ptr());
43 : }
44 :
45 15214768 : bool FieldType::IsClass() const { return this->IsMap(); }
46 :
47 749051 : Map FieldType::AsClass() const {
48 : DCHECK(IsClass());
49 749051 : return Map::cast(*this);
50 : }
51 :
52 0 : bool FieldType::NowStable() const {
53 0 : return !this->IsClass() || AsClass()->is_stable();
54 : }
55 :
56 43572 : bool FieldType::NowIs(FieldType other) const {
57 878183 : if (other->IsAny()) return true;
58 187574 : if (IsNone()) return true;
59 122722 : if (other->IsNone()) return false;
60 97218 : if (IsAny()) return false;
61 : DCHECK(IsClass());
62 : DCHECK(other->IsClass());
63 1390 : return *this == other;
64 : }
65 :
66 1669215 : bool FieldType::NowIs(Handle<FieldType> other) const { return NowIs(*other); }
67 :
68 10744 : void FieldType::PrintTo(std::ostream& os) const {
69 10744 : if (IsAny()) {
70 10744 : os << "Any";
71 0 : } else if (IsNone()) {
72 0 : os << "None";
73 : } else {
74 : DCHECK(IsClass());
75 0 : os << "Class(" << reinterpret_cast<void*>(AsClass()->ptr()) << ")";
76 : }
77 10744 : }
78 :
79 37006182 : bool FieldType::NowContains(Object value) const {
80 37006182 : if (*this == Any()) return true;
81 2492112 : if (*this == None()) return false;
82 2492100 : if (!value->IsHeapObject()) return false;
83 : return HeapObject::cast(value)->map() == Map::cast(*this);
84 : }
85 :
86 : } // namespace internal
87 183867 : } // namespace v8
|