OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <iomanip> | 5 #include <iomanip> |
6 | 6 |
7 #include "src/types.h" | 7 #include "src/types.h" |
8 | 8 |
9 #include "src/ostreams.h" | 9 #include "src/ostreams.h" |
10 #include "src/types-inl.h" | 10 #include "src/types-inl.h" |
11 | 11 |
12 namespace v8 { | 12 namespace v8 { |
13 namespace internal { | 13 namespace internal { |
14 | 14 |
15 | 15 |
16 // NOTE: If code is marked as being a "shortcut", this means that removing | 16 // NOTE: If code is marked as being a "shortcut", this means that removing |
17 // the code won't affect the semantics of the surrounding function definition. | 17 // the code won't affect the semantics of the surrounding function definition. |
18 | 18 |
19 | 19 |
20 // ----------------------------------------------------------------------------- | 20 // ----------------------------------------------------------------------------- |
21 // Range-related helper functions. | 21 // Range-related helper functions. |
22 | 22 |
23 // The result may be invalid (max < min). | 23 // The result may be invalid (max < min). |
24 template<class Config> | 24 template<class Config> |
25 typename TypeImpl<Config>::Limits TypeImpl<Config>::Intersect( | 25 typename TypeImpl<Config>::Limits TypeImpl<Config>::Intersect( |
26 Limits lhs, Limits rhs) { | 26 Limits lhs, Limits rhs) { |
27 DisallowHeapAllocation no_allocation; | 27 DisallowHeapAllocation no_allocation; |
28 Limits result(lhs); | 28 Limits result(lhs); |
29 if (lhs.min->Number() < rhs.min->Number()) result.min = rhs.min; | 29 if (lhs.min < rhs.min) result.min = rhs.min; |
30 if (lhs.max->Number() > rhs.max->Number()) result.max = rhs.max; | 30 if (lhs.max > rhs.max) result.max = rhs.max; |
31 result.representation = lhs.representation & rhs.representation; | 31 result.representation = lhs.representation & rhs.representation; |
32 return result; | 32 return result; |
33 } | 33 } |
34 | 34 |
35 | 35 |
36 template <class Config> | 36 template <class Config> |
37 bool TypeImpl<Config>::IsEmpty(Limits lim) { | 37 bool TypeImpl<Config>::IsEmpty(Limits lim) { |
38 return lim.min->Number() > lim.max->Number(); | 38 return lim.min > lim.max; |
39 } | 39 } |
40 | 40 |
41 | 41 |
42 template <class Config> | 42 template <class Config> |
43 typename TypeImpl<Config>::Limits TypeImpl<Config>::Union(Limits lhs, | 43 typename TypeImpl<Config>::Limits TypeImpl<Config>::Union(Limits lhs, |
44 Limits rhs) { | 44 Limits rhs) { |
45 DisallowHeapAllocation no_allocation; | 45 DisallowHeapAllocation no_allocation; |
46 Limits result(lhs); | 46 Limits result(lhs); |
47 if (lhs.min->Number() > rhs.min->Number()) result.min = rhs.min; | 47 if (lhs.min > rhs.min) result.min = rhs.min; |
48 if (lhs.max->Number() < rhs.max->Number()) result.max = rhs.max; | 48 if (lhs.max < rhs.max) result.max = rhs.max; |
49 result.representation = lhs.representation | rhs.representation; | 49 result.representation = lhs.representation | rhs.representation; |
50 return result; | 50 return result; |
51 } | 51 } |
52 | 52 |
53 | 53 |
54 template<class Config> | 54 template<class Config> |
55 bool TypeImpl<Config>::Overlap( | 55 bool TypeImpl<Config>::Overlap( |
56 typename TypeImpl<Config>::RangeType* lhs, | 56 typename TypeImpl<Config>::RangeType* lhs, |
57 typename TypeImpl<Config>::RangeType* rhs) { | 57 typename TypeImpl<Config>::RangeType* rhs) { |
58 DisallowHeapAllocation no_allocation; | 58 DisallowHeapAllocation no_allocation; |
59 typename TypeImpl<Config>::Limits lim = Intersect(Limits(lhs), Limits(rhs)); | 59 typename TypeImpl<Config>::Limits lim = Intersect(Limits(lhs), Limits(rhs)); |
60 return lim.min->Number() <= lim.max->Number(); | 60 return lim.min <= lim.max; |
61 } | 61 } |
62 | 62 |
63 | 63 |
64 template<class Config> | 64 template<class Config> |
65 bool TypeImpl<Config>::Contains( | 65 bool TypeImpl<Config>::Contains( |
66 typename TypeImpl<Config>::RangeType* lhs, | 66 typename TypeImpl<Config>::RangeType* lhs, |
67 typename TypeImpl<Config>::RangeType* rhs) { | 67 typename TypeImpl<Config>::RangeType* rhs) { |
68 DisallowHeapAllocation no_allocation; | 68 DisallowHeapAllocation no_allocation; |
69 return rhs->Bound()->Is(lhs->Bound()) && | 69 return BitsetType::Is(rhs->Bound(), lhs->Bound()) && |
70 lhs->Min()->Number() <= rhs->Min()->Number() && | 70 lhs->Min() <= rhs->Min() && rhs->Max() <= lhs->Max(); |
71 rhs->Max()->Number() <= lhs->Max()->Number(); | |
72 } | 71 } |
73 | 72 |
74 | 73 |
75 template <class Config> | 74 template <class Config> |
76 bool TypeImpl<Config>::Contains(typename TypeImpl<Config>::RangeType* lhs, | 75 bool TypeImpl<Config>::Contains(typename TypeImpl<Config>::RangeType* lhs, |
77 typename TypeImpl<Config>::ConstantType* rhs) { | 76 typename TypeImpl<Config>::ConstantType* rhs) { |
78 DisallowHeapAllocation no_allocation; | 77 DisallowHeapAllocation no_allocation; |
79 return IsInteger(*rhs->Value()) && rhs->Bound()->Is(lhs->Bound()) && | 78 return IsInteger(*rhs->Value()) && |
80 lhs->Min()->Number() <= rhs->Value()->Number() && | 79 BitsetType::Is(rhs->Bound()->AsBitset(), lhs->Bound()) && |
81 rhs->Value()->Number() <= lhs->Max()->Number(); | 80 lhs->Min() <= rhs->Value()->Number() && |
| 81 rhs->Value()->Number() <= lhs->Max(); |
82 } | 82 } |
83 | 83 |
84 | 84 |
85 template<class Config> | 85 template<class Config> |
86 bool TypeImpl<Config>::Contains( | 86 bool TypeImpl<Config>::Contains( |
87 typename TypeImpl<Config>::RangeType* range, i::Object* val) { | 87 typename TypeImpl<Config>::RangeType* range, i::Object* val) { |
88 DisallowHeapAllocation no_allocation; | 88 DisallowHeapAllocation no_allocation; |
89 return IsInteger(val) && | 89 return IsInteger(val) && |
90 BitsetType::Is(BitsetType::Lub(val), range->Bound()->AsBitset()) && | 90 BitsetType::Is(BitsetType::Lub(val), range->Bound()) && |
91 range->Min()->Number() <= val->Number() && | 91 range->Min() <= val->Number() && val->Number() <= range->Max(); |
92 val->Number() <= range->Max()->Number(); | |
93 } | 92 } |
94 | 93 |
95 | 94 |
96 // ----------------------------------------------------------------------------- | 95 // ----------------------------------------------------------------------------- |
97 // Min and Max computation. | 96 // Min and Max computation. |
98 | 97 |
99 template<class Config> | 98 template<class Config> |
100 double TypeImpl<Config>::Min() { | 99 double TypeImpl<Config>::Min() { |
101 DCHECK(this->Is(Number())); | 100 DCHECK(this->Is(Number())); |
102 if (this->IsBitset()) return BitsetType::Min(this->AsBitset()); | 101 if (this->IsBitset()) return BitsetType::Min(this->AsBitset()); |
103 if (this->IsUnion()) { | 102 if (this->IsUnion()) { |
104 double min = +V8_INFINITY; | 103 double min = +V8_INFINITY; |
105 for (int i = 0, n = this->AsUnion()->Length(); i < n; ++i) { | 104 for (int i = 0, n = this->AsUnion()->Length(); i < n; ++i) { |
106 min = std::min(min, this->AsUnion()->Get(i)->Min()); | 105 min = std::min(min, this->AsUnion()->Get(i)->Min()); |
107 } | 106 } |
108 return min; | 107 return min; |
109 } | 108 } |
110 if (this->IsRange()) return this->AsRange()->Min()->Number(); | 109 if (this->IsRange()) return this->AsRange()->Min(); |
111 if (this->IsConstant()) return this->AsConstant()->Value()->Number(); | 110 if (this->IsConstant()) return this->AsConstant()->Value()->Number(); |
112 UNREACHABLE(); | 111 UNREACHABLE(); |
113 return 0; | 112 return 0; |
114 } | 113 } |
115 | 114 |
116 | 115 |
117 template<class Config> | 116 template<class Config> |
118 double TypeImpl<Config>::Max() { | 117 double TypeImpl<Config>::Max() { |
119 DCHECK(this->Is(Number())); | 118 DCHECK(this->Is(Number())); |
120 if (this->IsBitset()) return BitsetType::Max(this->AsBitset()); | 119 if (this->IsBitset()) return BitsetType::Max(this->AsBitset()); |
121 if (this->IsUnion()) { | 120 if (this->IsUnion()) { |
122 double max = -V8_INFINITY; | 121 double max = -V8_INFINITY; |
123 for (int i = 0, n = this->AsUnion()->Length(); i < n; ++i) { | 122 for (int i = 0, n = this->AsUnion()->Length(); i < n; ++i) { |
124 max = std::max(max, this->AsUnion()->Get(i)->Max()); | 123 max = std::max(max, this->AsUnion()->Get(i)->Max()); |
125 } | 124 } |
126 return max; | 125 return max; |
127 } | 126 } |
128 if (this->IsRange()) return this->AsRange()->Max()->Number(); | 127 if (this->IsRange()) return this->AsRange()->Max(); |
129 if (this->IsConstant()) return this->AsConstant()->Value()->Number(); | 128 if (this->IsConstant()) return this->AsConstant()->Value()->Number(); |
130 UNREACHABLE(); | 129 UNREACHABLE(); |
131 return 0; | 130 return 0; |
132 } | 131 } |
133 | 132 |
134 | 133 |
135 // ----------------------------------------------------------------------------- | 134 // ----------------------------------------------------------------------------- |
136 // Glb and lub computation. | 135 // Glb and lub computation. |
137 | 136 |
138 | 137 |
139 // The largest bitset subsumed by this type. | 138 // The largest bitset subsumed by this type. |
140 template<class Config> | 139 template<class Config> |
141 typename TypeImpl<Config>::bitset | 140 typename TypeImpl<Config>::bitset |
142 TypeImpl<Config>::BitsetType::Glb(TypeImpl* type) { | 141 TypeImpl<Config>::BitsetType::Glb(TypeImpl* type) { |
143 DisallowHeapAllocation no_allocation; | 142 DisallowHeapAllocation no_allocation; |
144 if (type->IsBitset()) { | 143 if (type->IsBitset()) { |
145 return type->AsBitset(); | 144 return type->AsBitset(); |
146 } else if (type->IsUnion()) { | 145 } else if (type->IsUnion()) { |
147 SLOW_DCHECK(type->AsUnion()->Wellformed()); | 146 SLOW_DCHECK(type->AsUnion()->Wellformed()); |
148 return type->AsUnion()->Get(0)->BitsetGlb() | | 147 return type->AsUnion()->Get(0)->BitsetGlb() | |
149 type->AsUnion()->Get(1)->BitsetGlb(); // Shortcut. | 148 type->AsUnion()->Get(1)->BitsetGlb(); // Shortcut. |
150 } else if (type->IsRange()) { | 149 } else if (type->IsRange()) { |
151 bitset glb = SEMANTIC(BitsetType::Glb(type->AsRange()->Min()->Number(), | 150 bitset glb = SEMANTIC( |
152 type->AsRange()->Max()->Number())); | 151 BitsetType::Glb(type->AsRange()->Min(), type->AsRange()->Max())); |
153 if (glb == 0) { | 152 if (glb == 0) { |
154 return kNone; | 153 return kNone; |
155 } else { | 154 } else { |
156 return glb | REPRESENTATION(type->BitsetLub()); | 155 return glb | REPRESENTATION(type->BitsetLub()); |
157 } | 156 } |
158 } else { | 157 } else { |
159 // (The remaining BitsetGlb's are None anyway). | 158 // (The remaining BitsetGlb's are None anyway). |
160 return kNone; | 159 return kNone; |
161 } | 160 } |
162 } | 161 } |
(...skipping 11 matching lines...) Expand all Loading... |
174 bitset |= type->AsUnion()->Get(i)->BitsetLub(); | 173 bitset |= type->AsUnion()->Get(i)->BitsetLub(); |
175 } | 174 } |
176 return bitset; | 175 return bitset; |
177 } | 176 } |
178 if (type->IsClass()) { | 177 if (type->IsClass()) { |
179 // Little hack to avoid the need for a region for handlification here... | 178 // Little hack to avoid the need for a region for handlification here... |
180 return Config::is_class(type) ? Lub(*Config::as_class(type)) : | 179 return Config::is_class(type) ? Lub(*Config::as_class(type)) : |
181 type->AsClass()->Bound(NULL)->AsBitset(); | 180 type->AsClass()->Bound(NULL)->AsBitset(); |
182 } | 181 } |
183 if (type->IsConstant()) return type->AsConstant()->Bound()->AsBitset(); | 182 if (type->IsConstant()) return type->AsConstant()->Bound()->AsBitset(); |
184 if (type->IsRange()) return type->AsRange()->Bound()->AsBitset(); | 183 if (type->IsRange()) return type->AsRange()->Bound(); |
185 if (type->IsContext()) return kInternal & kTaggedPointer; | 184 if (type->IsContext()) return kInternal & kTaggedPointer; |
186 if (type->IsArray()) return kArray; | 185 if (type->IsArray()) return kArray; |
187 if (type->IsFunction()) return kOtherObject; // TODO(rossberg): kFunction | 186 if (type->IsFunction()) return kOtherObject; // TODO(rossberg): kFunction |
188 UNREACHABLE(); | 187 UNREACHABLE(); |
189 return kNone; | 188 return kNone; |
190 } | 189 } |
191 | 190 |
192 | 191 |
193 template<class Config> | 192 template<class Config> |
194 typename TypeImpl<Config>::bitset | 193 typename TypeImpl<Config>::bitset |
(...skipping 563 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
758 template <class Config> | 757 template <class Config> |
759 typename TypeImpl<Config>::Limits TypeImpl<Config>::ToLimits(bitset bits, | 758 typename TypeImpl<Config>::Limits TypeImpl<Config>::ToLimits(bitset bits, |
760 Region* region) { | 759 Region* region) { |
761 bitset representation = REPRESENTATION(bits); | 760 bitset representation = REPRESENTATION(bits); |
762 bitset number_bits = BitsetType::NumberBits(bits); | 761 bitset number_bits = BitsetType::NumberBits(bits); |
763 | 762 |
764 if (representation == BitsetType::kNone && number_bits == BitsetType::kNone) { | 763 if (representation == BitsetType::kNone && number_bits == BitsetType::kNone) { |
765 return Limits::Empty(region); | 764 return Limits::Empty(region); |
766 } | 765 } |
767 | 766 |
768 double bitset_min = BitsetType::Min(number_bits); | 767 return Limits(BitsetType::Min(number_bits), BitsetType::Max(number_bits), |
769 double bitset_max = BitsetType::Max(number_bits); | |
770 | |
771 // TODO(jarin) Get rid of the heap numbers. | |
772 i::Factory* f = i::Isolate::Current()->factory(); | |
773 | |
774 return Limits(f->NewNumber(bitset_min), f->NewNumber(bitset_max), | |
775 representation); | 768 representation); |
776 } | 769 } |
777 | 770 |
778 | 771 |
779 template <class Config> | 772 template <class Config> |
780 typename TypeImpl<Config>::Limits TypeImpl<Config>::IntersectRangeAndBitset( | 773 typename TypeImpl<Config>::Limits TypeImpl<Config>::IntersectRangeAndBitset( |
781 TypeHandle range, TypeHandle bitset, Region* region) { | 774 TypeHandle range, TypeHandle bitset, Region* region) { |
782 Limits range_lims(range->AsRange()); | 775 Limits range_lims(range->AsRange()); |
783 Limits bitset_lims = ToLimits(bitset->AsBitset(), region); | 776 Limits bitset_lims = ToLimits(bitset->AsBitset(), region); |
784 return Intersect(range_lims, bitset_lims); | 777 return Intersect(range_lims, bitset_lims); |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
867 bitset range_lub = range->BitsetLub(); | 860 bitset range_lub = range->BitsetLub(); |
868 if (BitsetType::Is(BitsetType::NumberBits(range_lub), *bits)) { | 861 if (BitsetType::Is(BitsetType::NumberBits(range_lub), *bits)) { |
869 *bits |= range_lub; | 862 *bits |= range_lub; |
870 return None(region); | 863 return None(region); |
871 } | 864 } |
872 | 865 |
873 // Slow path: reconcile the bitset range and the range. | 866 // Slow path: reconcile the bitset range and the range. |
874 double bitset_min = BitsetType::Min(number_bits); | 867 double bitset_min = BitsetType::Min(number_bits); |
875 double bitset_max = BitsetType::Max(number_bits); | 868 double bitset_max = BitsetType::Max(number_bits); |
876 | 869 |
877 i::Handle<i::Object> range_min_obj = range->Min(); | 870 double range_min = range->Min(); |
878 i::Handle<i::Object> range_max_obj = range->Max(); | 871 double range_max = range->Max(); |
879 double range_min = range_min_obj->Number(); | |
880 double range_max = range_max_obj->Number(); | |
881 | 872 |
882 bitset range_representation = REPRESENTATION(range->BitsetLub()); | 873 bitset range_representation = REPRESENTATION(range->BitsetLub()); |
883 bitset bits_representation = REPRESENTATION(*bits); | 874 bitset bits_representation = REPRESENTATION(*bits); |
884 bitset representation = | 875 bitset representation = |
885 (bits_representation | range_representation) & BitsetType::kNumber; | 876 (bits_representation | range_representation) & BitsetType::kNumber; |
886 | 877 |
887 // Remove the number bits from the bitset, they would just confuse us now. | 878 // Remove the number bits from the bitset, they would just confuse us now. |
888 *bits &= ~number_bits; | 879 *bits &= ~number_bits; |
889 if (bits_representation == *bits) { | 880 if (bits_representation == *bits) { |
890 *bits = BitsetType::kNone; | 881 *bits = BitsetType::kNone; |
891 } | 882 } |
892 | 883 |
893 if (representation == range_representation && range_min <= bitset_min && | 884 if (representation == range_representation && range_min <= bitset_min && |
894 range_max >= bitset_max) { | 885 range_max >= bitset_max) { |
895 // Bitset is contained within the range, just return the range. | 886 // Bitset is contained within the range, just return the range. |
896 return range; | 887 return range; |
897 } | 888 } |
898 | 889 |
899 if (bitset_min < range_min) { | 890 if (bitset_min < range_min) { |
900 // TODO(jarin) Get rid of the heap numbers. | 891 range_min = bitset_min; |
901 range_min_obj = i::Isolate::Current()->factory()->NewNumber(bitset_min); | |
902 } | 892 } |
903 if (bitset_max > range_max) { | 893 if (bitset_max > range_max) { |
904 // TODO(jarin) Get rid of the heap numbers. | 894 range_max = bitset_max; |
905 range_max_obj = i::Isolate::Current()->factory()->NewNumber(bitset_max); | |
906 } | 895 } |
907 return RangeType::New(range_min_obj, range_max_obj, | 896 return RangeType::New(range_min, range_max, |
908 BitsetType::New(representation, region), region); | 897 BitsetType::New(representation, region), region); |
909 } | 898 } |
910 | 899 |
911 | 900 |
912 template<class Config> | 901 template<class Config> |
913 typename TypeImpl<Config>::TypeHandle TypeImpl<Config>::Union( | 902 typename TypeImpl<Config>::TypeHandle TypeImpl<Config>::Union( |
914 TypeHandle type1, TypeHandle type2, Region* region) { | 903 TypeHandle type1, TypeHandle type2, Region* region) { |
915 | 904 |
916 // Fast case: bit sets. | 905 // Fast case: bit sets. |
917 if (type1->IsBitset() && type2->IsBitset()) { | 906 if (type1->IsBitset() && type2->IsBitset()) { |
(...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1220 BitsetType::Print(os, SEMANTIC(this->AsBitset())); | 1209 BitsetType::Print(os, SEMANTIC(this->AsBitset())); |
1221 } else if (this->IsClass()) { | 1210 } else if (this->IsClass()) { |
1222 os << "Class(" << static_cast<void*>(*this->AsClass()->Map()) << " < "; | 1211 os << "Class(" << static_cast<void*>(*this->AsClass()->Map()) << " < "; |
1223 BitsetType::New(BitsetType::Lub(this))->PrintTo(os, dim); | 1212 BitsetType::New(BitsetType::Lub(this))->PrintTo(os, dim); |
1224 os << ")"; | 1213 os << ")"; |
1225 } else if (this->IsConstant()) { | 1214 } else if (this->IsConstant()) { |
1226 os << "Constant(" << Brief(*this->AsConstant()->Value()) << ")"; | 1215 os << "Constant(" << Brief(*this->AsConstant()->Value()) << ")"; |
1227 } else if (this->IsRange()) { | 1216 } else if (this->IsRange()) { |
1228 std::ostream::fmtflags saved_flags = os.setf(std::ios::fixed); | 1217 std::ostream::fmtflags saved_flags = os.setf(std::ios::fixed); |
1229 std::streamsize saved_precision = os.precision(0); | 1218 std::streamsize saved_precision = os.precision(0); |
1230 os << "Range(" << this->AsRange()->Min()->Number() << ", " | 1219 os << "Range(" << this->AsRange()->Min() << ", " << this->AsRange()->Max() |
1231 << this->AsRange()->Max()->Number() << ")"; | 1220 << ")"; |
1232 os.flags(saved_flags); | 1221 os.flags(saved_flags); |
1233 os.precision(saved_precision); | 1222 os.precision(saved_precision); |
1234 } else if (this->IsContext()) { | 1223 } else if (this->IsContext()) { |
1235 os << "Context("; | 1224 os << "Context("; |
1236 this->AsContext()->Outer()->PrintTo(os, dim); | 1225 this->AsContext()->Outer()->PrintTo(os, dim); |
1237 os << ")"; | 1226 os << ")"; |
1238 } else if (this->IsUnion()) { | 1227 } else if (this->IsUnion()) { |
1239 os << "("; | 1228 os << "("; |
1240 for (int i = 0, n = this->AsUnion()->Length(); i < n; ++i) { | 1229 for (int i = 0, n = this->AsUnion()->Length(); i < n; ++i) { |
1241 TypeHandle type_i = this->AsUnion()->Get(i); | 1230 TypeHandle type_i = this->AsUnion()->Get(i); |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1298 template class TypeImpl<HeapTypeConfig>::Iterator<i::Object>; | 1287 template class TypeImpl<HeapTypeConfig>::Iterator<i::Object>; |
1299 | 1288 |
1300 template TypeImpl<ZoneTypeConfig>::TypeHandle | 1289 template TypeImpl<ZoneTypeConfig>::TypeHandle |
1301 TypeImpl<ZoneTypeConfig>::Convert<HeapType>( | 1290 TypeImpl<ZoneTypeConfig>::Convert<HeapType>( |
1302 TypeImpl<HeapTypeConfig>::TypeHandle, TypeImpl<ZoneTypeConfig>::Region*); | 1291 TypeImpl<HeapTypeConfig>::TypeHandle, TypeImpl<ZoneTypeConfig>::Region*); |
1303 template TypeImpl<HeapTypeConfig>::TypeHandle | 1292 template TypeImpl<HeapTypeConfig>::TypeHandle |
1304 TypeImpl<HeapTypeConfig>::Convert<Type>( | 1293 TypeImpl<HeapTypeConfig>::Convert<Type>( |
1305 TypeImpl<ZoneTypeConfig>::TypeHandle, TypeImpl<HeapTypeConfig>::Region*); | 1294 TypeImpl<ZoneTypeConfig>::TypeHandle, TypeImpl<HeapTypeConfig>::Region*); |
1306 | 1295 |
1307 } } // namespace v8::internal | 1296 } } // namespace v8::internal |
OLD | NEW |