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 1792874 : FieldType FieldType::None() { return FieldType(Smi::FromInt(2).ptr()); }
17 :
18 : // static
19 4516779 : FieldType FieldType::Any() { return FieldType(Smi::FromInt(1).ptr()); }
20 :
21 : // static
22 224273 : Handle<FieldType> FieldType::None(Isolate* isolate) {
23 224273 : return handle(None(), isolate);
24 : }
25 :
26 : // static
27 12717153 : Handle<FieldType> FieldType::Any(Isolate* isolate) {
28 12717164 : return handle(Any(), isolate);
29 : }
30 :
31 : // static
32 40 : FieldType FieldType::Class(Map map) { return FieldType::cast(map); }
33 :
34 : // static
35 5839984 : Handle<FieldType> FieldType::Class(Handle<Map> map, Isolate* isolate) {
36 5839985 : return handle(Class(*map), isolate);
37 : }
38 :
39 : // static
40 37188801 : FieldType FieldType::cast(Object object) {
41 : DCHECK(object == None() || object == Any() || object->IsMap());
42 37188801 : return FieldType(object->ptr());
43 : }
44 :
45 34769392 : bool FieldType::IsClass() const { return this->IsMap(); }
46 :
47 5817105 : Map FieldType::AsClass() const {
48 : DCHECK(IsClass());
49 5817105 : return Map::cast(*this);
50 : }
51 :
52 0 : bool FieldType::NowStable() const {
53 0 : return !this->IsClass() || AsClass()->is_stable();
54 : }
55 :
56 31013 : bool FieldType::NowIs(FieldType other) const {
57 1169886 : if (other->IsAny()) return true;
58 196047 : if (IsNone()) return true;
59 134793 : if (other->IsNone()) return false;
60 108500 : if (IsAny()) return false;
61 : DCHECK(IsClass());
62 : DCHECK(other->IsClass());
63 140 : return *this == other;
64 : }
65 :
66 2277746 : bool FieldType::NowIs(Handle<FieldType> other) const { return NowIs(*other); }
67 :
68 32105 : void FieldType::PrintTo(std::ostream& os) const {
69 32105 : if (IsAny()) {
70 30995 : os << "Any";
71 1110 : } else if (IsNone()) {
72 25 : os << "None";
73 : } else {
74 : DCHECK(IsClass());
75 2170 : os << "Class(" << reinterpret_cast<void*>(AsClass()->ptr()) << ")";
76 : }
77 32105 : }
78 :
79 34159400 : bool FieldType::NowContains(Object value) const {
80 34159400 : if (*this == Any()) return true;
81 1183847 : if (*this == None()) return false;
82 1183846 : if (!value->IsHeapObject()) return false;
83 : return HeapObject::cast(value)->map() == Map::cast(*this);
84 : }
85 :
86 : } // namespace internal
87 122036 : } // namespace v8
|