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 "src/types.h" | 5 #include "src/types.h" |
6 | 6 |
7 #include "src/ostreams.h" | 7 #include "src/ostreams.h" |
8 #include "src/types-inl.h" | 8 #include "src/types-inl.h" |
9 | 9 |
10 namespace v8 { | 10 namespace v8 { |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
73 | 73 |
74 // ----------------------------------------------------------------------------- | 74 // ----------------------------------------------------------------------------- |
75 // Min and Max computation. | 75 // Min and Max computation. |
76 | 76 |
77 template<class Config> | 77 template<class Config> |
78 double TypeImpl<Config>::Min() { | 78 double TypeImpl<Config>::Min() { |
79 DCHECK(this->Is(Number())); | 79 DCHECK(this->Is(Number())); |
80 if (this->IsBitset()) return BitsetType::Min(this->AsBitset()); | 80 if (this->IsBitset()) return BitsetType::Min(this->AsBitset()); |
81 if (this->IsUnion()) { | 81 if (this->IsUnion()) { |
82 double min = +V8_INFINITY; | 82 double min = +V8_INFINITY; |
83 for (int i = 0; i < this->AsUnion()->Length(); ++i) { | 83 for (int i = 0, n = this->AsUnion()->Length(); i < n; ++i) { |
84 min = std::min(min, this->AsUnion()->Get(i)->Min()); | 84 min = std::min(min, this->AsUnion()->Get(i)->Min()); |
85 } | 85 } |
86 return min; | 86 return min; |
87 } | 87 } |
88 if (this->IsRange()) return this->AsRange()->Min()->Number(); | 88 if (this->IsRange()) return this->AsRange()->Min()->Number(); |
89 if (this->IsConstant()) return this->AsConstant()->Value()->Number(); | 89 if (this->IsConstant()) return this->AsConstant()->Value()->Number(); |
90 UNREACHABLE(); | 90 UNREACHABLE(); |
91 return 0; | 91 return 0; |
92 } | 92 } |
93 | 93 |
94 | 94 |
95 template<class Config> | 95 template<class Config> |
96 double TypeImpl<Config>::Max() { | 96 double TypeImpl<Config>::Max() { |
97 DCHECK(this->Is(Number())); | 97 DCHECK(this->Is(Number())); |
98 if (this->IsBitset()) return BitsetType::Max(this->AsBitset()); | 98 if (this->IsBitset()) return BitsetType::Max(this->AsBitset()); |
99 if (this->IsUnion()) { | 99 if (this->IsUnion()) { |
100 double max = -V8_INFINITY; | 100 double max = -V8_INFINITY; |
101 for (int i = 0; i < this->AsUnion()->Length(); ++i) { | 101 for (int i = 0, n = this->AsUnion()->Length(); i < n; ++i) { |
102 max = std::max(max, this->AsUnion()->Get(i)->Max()); | 102 max = std::max(max, this->AsUnion()->Get(i)->Max()); |
103 } | 103 } |
104 return max; | 104 return max; |
105 } | 105 } |
106 if (this->IsRange()) return this->AsRange()->Max()->Number(); | 106 if (this->IsRange()) return this->AsRange()->Max()->Number(); |
107 if (this->IsConstant()) return this->AsConstant()->Value()->Number(); | 107 if (this->IsConstant()) return this->AsConstant()->Value()->Number(); |
108 UNREACHABLE(); | 108 UNREACHABLE(); |
109 return 0; | 109 return 0; |
110 } | 110 } |
111 | 111 |
(...skipping 20 matching lines...) Expand all Loading... |
132 | 132 |
133 | 133 |
134 // The smallest bitset subsuming this type. | 134 // The smallest bitset subsuming this type. |
135 template<class Config> | 135 template<class Config> |
136 typename TypeImpl<Config>::bitset | 136 typename TypeImpl<Config>::bitset |
137 TypeImpl<Config>::BitsetType::Lub(TypeImpl* type) { | 137 TypeImpl<Config>::BitsetType::Lub(TypeImpl* type) { |
138 DisallowHeapAllocation no_allocation; | 138 DisallowHeapAllocation no_allocation; |
139 if (type->IsBitset()) return type->AsBitset(); | 139 if (type->IsBitset()) return type->AsBitset(); |
140 if (type->IsUnion()) { | 140 if (type->IsUnion()) { |
141 int bitset = kNone; | 141 int bitset = kNone; |
142 for (int i = 0; i < type->AsUnion()->Length(); ++i) { | 142 for (int i = 0, n = type->AsUnion()->Length(); i < n; ++i) { |
143 bitset |= type->AsUnion()->Get(i)->BitsetLub(); | 143 bitset |= type->AsUnion()->Get(i)->BitsetLub(); |
144 } | 144 } |
145 return bitset; | 145 return bitset; |
146 } | 146 } |
147 if (type->IsClass()) { | 147 if (type->IsClass()) { |
148 // Little hack to avoid the need for a region for handlification here... | 148 // Little hack to avoid the need for a region for handlification here... |
149 return Config::is_class(type) ? Lub(*Config::as_class(type)) : | 149 return Config::is_class(type) ? Lub(*Config::as_class(type)) : |
150 type->AsClass()->Bound(NULL)->AsBitset(); | 150 type->AsClass()->Bound(NULL)->AsBitset(); |
151 } | 151 } |
152 if (type->IsConstant()) return type->AsConstant()->Bound()->AsBitset(); | 152 if (type->IsConstant()) return type->AsConstant()->Bound()->AsBitset(); |
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
412 } | 412 } |
413 if (this->IsFunction()) { | 413 if (this->IsFunction()) { |
414 if (!that->IsFunction()) return false; | 414 if (!that->IsFunction()) return false; |
415 FunctionType* this_fun = this->AsFunction(); | 415 FunctionType* this_fun = this->AsFunction(); |
416 FunctionType* that_fun = that->AsFunction(); | 416 FunctionType* that_fun = that->AsFunction(); |
417 if (this_fun->Arity() != that_fun->Arity() || | 417 if (this_fun->Arity() != that_fun->Arity() || |
418 !this_fun->Result()->Equals(that_fun->Result()) || | 418 !this_fun->Result()->Equals(that_fun->Result()) || |
419 !this_fun->Receiver()->Equals(that_fun->Receiver())) { | 419 !this_fun->Receiver()->Equals(that_fun->Receiver())) { |
420 return false; | 420 return false; |
421 } | 421 } |
422 for (int i = 0; i < this_fun->Arity(); ++i) { | 422 for (int i = 0, n = this_fun->Arity(); i < n; ++i) { |
423 if (!this_fun->Parameter(i)->Equals(that_fun->Parameter(i))) return false; | 423 if (!this_fun->Parameter(i)->Equals(that_fun->Parameter(i))) return false; |
424 } | 424 } |
425 return true; | 425 return true; |
426 } | 426 } |
427 UNREACHABLE(); | 427 UNREACHABLE(); |
428 return false; | 428 return false; |
429 } | 429 } |
430 | 430 |
431 | 431 |
432 // Check if [this] <= [that]. | 432 // Check if [this] <= [that]. |
433 template<class Config> | 433 template<class Config> |
434 bool TypeImpl<Config>::SlowIs(TypeImpl* that) { | 434 bool TypeImpl<Config>::SlowIs(TypeImpl* that) { |
435 DisallowHeapAllocation no_allocation; | 435 DisallowHeapAllocation no_allocation; |
436 | 436 |
437 if (that->IsBitset()) { | 437 if (that->IsBitset()) { |
438 return BitsetType::Is(this->BitsetLub(), that->AsBitset()); | 438 return BitsetType::Is(this->BitsetLub(), that->AsBitset()); |
439 } | 439 } |
440 if (this->IsBitset()) { | 440 if (this->IsBitset()) { |
441 return BitsetType::Is(this->AsBitset(), that->BitsetGlb()); | 441 return BitsetType::Is(this->AsBitset(), that->BitsetGlb()); |
442 } | 442 } |
443 | 443 |
444 // (T1 \/ ... \/ Tn) <= T if (T1 <= T) /\ ... /\ (Tn <= T) | 444 // (T1 \/ ... \/ Tn) <= T if (T1 <= T) /\ ... /\ (Tn <= T) |
445 if (this->IsUnion()) { | 445 if (this->IsUnion()) { |
446 UnionHandle unioned = handle(this->AsUnion()); | 446 for (int i = 0, n = this->AsUnion()->Length(); i < n; ++i) { |
447 for (int i = 0; i < unioned->Length(); ++i) { | 447 if (!this->AsUnion()->Get(i)->Is(that)) return false; |
448 if (!unioned->Get(i)->Is(that)) return false; | |
449 } | 448 } |
450 return true; | 449 return true; |
451 } | 450 } |
452 | 451 |
453 // T <= (T1 \/ ... \/ Tn) if (T <= T1) \/ ... \/ (T <= Tn) | 452 // T <= (T1 \/ ... \/ Tn) if (T <= T1) \/ ... \/ (T <= Tn) |
454 if (that->IsUnion()) { | 453 if (that->IsUnion()) { |
455 for (int i = 0; i < that->AsUnion()->Length(); ++i) { | 454 for (int i = 0, n = that->AsUnion()->Length(); i < n; ++i) { |
456 if (this->Is(that->AsUnion()->Get(i))) return true; | 455 if (this->Is(that->AsUnion()->Get(i))) return true; |
457 if (i > 1 && this->IsRange()) return false; // Shortcut. | 456 if (i > 1 && this->IsRange()) return false; // Shortcut. |
458 } | 457 } |
459 return false; | 458 return false; |
460 } | 459 } |
461 | 460 |
462 if (that->IsRange()) { | 461 if (that->IsRange()) { |
463 return (this->IsRange() && Contains(that->AsRange(), this->AsRange())) | 462 return (this->IsRange() && Contains(that->AsRange(), this->AsRange())) |
464 || (this->IsConstant() && | 463 || (this->IsConstant() && |
465 Contains(that->AsRange(), *this->AsConstant()->Value())); | 464 Contains(that->AsRange(), *this->AsConstant()->Value())); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
500 } | 499 } |
501 | 500 |
502 | 501 |
503 // Check if [this] and [that] overlap. | 502 // Check if [this] and [that] overlap. |
504 template<class Config> | 503 template<class Config> |
505 bool TypeImpl<Config>::Maybe(TypeImpl* that) { | 504 bool TypeImpl<Config>::Maybe(TypeImpl* that) { |
506 DisallowHeapAllocation no_allocation; | 505 DisallowHeapAllocation no_allocation; |
507 | 506 |
508 // (T1 \/ ... \/ Tn) overlaps T if (T1 overlaps T) \/ ... \/ (Tn overlaps T) | 507 // (T1 \/ ... \/ Tn) overlaps T if (T1 overlaps T) \/ ... \/ (Tn overlaps T) |
509 if (this->IsUnion()) { | 508 if (this->IsUnion()) { |
510 UnionHandle unioned = handle(this->AsUnion()); | 509 for (int i = 0, n = this->AsUnion()->Length(); i < n; ++i) { |
511 for (int i = 0; i < unioned->Length(); ++i) { | 510 if (this->AsUnion()->Get(i)->Maybe(that)) return true; |
512 if (unioned->Get(i)->Maybe(that)) return true; | |
513 } | 511 } |
514 return false; | 512 return false; |
515 } | 513 } |
516 | 514 |
517 // T overlaps (T1 \/ ... \/ Tn) if (T overlaps T1) \/ ... \/ (T overlaps Tn) | 515 // T overlaps (T1 \/ ... \/ Tn) if (T overlaps T1) \/ ... \/ (T overlaps Tn) |
518 if (that->IsUnion()) { | 516 if (that->IsUnion()) { |
519 for (int i = 0; i < that->AsUnion()->Length(); ++i) { | 517 for (int i = 0, n = that->AsUnion()->Length(); i < n; ++i) { |
520 if (this->Maybe(that->AsUnion()->Get(i))) return true; | 518 if (this->Maybe(that->AsUnion()->Get(i))) return true; |
521 } | 519 } |
522 return false; | 520 return false; |
523 } | 521 } |
524 | 522 |
525 if (!BitsetType::IsInhabited(this->BitsetLub() & that->BitsetLub())) | 523 if (!BitsetType::IsInhabited(this->BitsetLub() & that->BitsetLub())) |
526 return false; | 524 return false; |
527 if (this->IsBitset() || that->IsBitset()) return true; | 525 if (this->IsBitset() || that->IsBitset()) return true; |
528 | 526 |
529 if (this->IsClass() != that->IsClass()) return true; | 527 if (this->IsClass() != that->IsClass()) return true; |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
676 } | 674 } |
677 return size; | 675 return size; |
678 } | 676 } |
679 | 677 |
680 | 678 |
681 template<class Config> | 679 template<class Config> |
682 int TypeImpl<Config>::IntersectAux( | 680 int TypeImpl<Config>::IntersectAux( |
683 TypeHandle lhs, TypeHandle rhs, | 681 TypeHandle lhs, TypeHandle rhs, |
684 UnionHandle result, int size, Region* region) { | 682 UnionHandle result, int size, Region* region) { |
685 if (lhs->IsUnion()) { | 683 if (lhs->IsUnion()) { |
686 for (int i = 0; i < lhs->AsUnion()->Length(); ++i) { | 684 for (int i = 0, n = lhs->AsUnion()->Length(); i < n; ++i) { |
687 size = IntersectAux(lhs->AsUnion()->Get(i), rhs, result, size, region); | 685 size = IntersectAux(lhs->AsUnion()->Get(i), rhs, result, size, region); |
688 } | 686 } |
689 return size; | 687 return size; |
690 } | 688 } |
691 if (rhs->IsUnion()) { | 689 if (rhs->IsUnion()) { |
692 for (int i = 0; i < rhs->AsUnion()->Length(); ++i) { | 690 for (int i = 0, n = rhs->AsUnion()->Length(); i < n; ++i) { |
693 size = IntersectAux(lhs, rhs->AsUnion()->Get(i), result, size, region); | 691 size = IntersectAux(lhs, rhs->AsUnion()->Get(i), result, size, region); |
694 } | 692 } |
695 return size; | 693 return size; |
696 } | 694 } |
697 | 695 |
698 if (!BitsetType::IsInhabited(lhs->BitsetLub() & rhs->BitsetLub())) { | 696 if (!BitsetType::IsInhabited(lhs->BitsetLub() & rhs->BitsetLub())) { |
699 return size; | 697 return size; |
700 } | 698 } |
701 | 699 |
702 if (lhs->IsRange()) { | 700 if (lhs->IsRange()) { |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
786 } | 784 } |
787 | 785 |
788 | 786 |
789 // Add [type] to [result] unless [type] is bitset, range, or already subsumed. | 787 // Add [type] to [result] unless [type] is bitset, range, or already subsumed. |
790 // Return new size of [result]. | 788 // Return new size of [result]. |
791 template<class Config> | 789 template<class Config> |
792 int TypeImpl<Config>::AddToUnion( | 790 int TypeImpl<Config>::AddToUnion( |
793 TypeHandle type, UnionHandle result, int size, Region* region) { | 791 TypeHandle type, UnionHandle result, int size, Region* region) { |
794 if (type->IsBitset() || type->IsRange()) return size; | 792 if (type->IsBitset() || type->IsRange()) return size; |
795 if (type->IsUnion()) { | 793 if (type->IsUnion()) { |
796 for (int i = 0; i < type->AsUnion()->Length(); ++i) { | 794 for (int i = 0, n = type->AsUnion()->Length(); i < n; ++i) { |
797 size = AddToUnion(type->AsUnion()->Get(i), result, size, region); | 795 size = AddToUnion(type->AsUnion()->Get(i), result, size, region); |
798 } | 796 } |
799 return size; | 797 return size; |
800 } | 798 } |
801 for (int i = 0; i < size; ++i) { | 799 for (int i = 0; i < size; ++i) { |
802 if (type->Is(result->Get(i))) return size; | 800 if (type->Is(result->Get(i))) return size; |
803 } | 801 } |
804 result->Set(size++, type); | 802 result->Set(size++, type); |
805 return size; | 803 return size; |
806 } | 804 } |
(...skipping 20 matching lines...) Expand all Loading... |
827 | 825 |
828 // ----------------------------------------------------------------------------- | 826 // ----------------------------------------------------------------------------- |
829 // Iteration. | 827 // Iteration. |
830 | 828 |
831 template<class Config> | 829 template<class Config> |
832 int TypeImpl<Config>::NumClasses() { | 830 int TypeImpl<Config>::NumClasses() { |
833 DisallowHeapAllocation no_allocation; | 831 DisallowHeapAllocation no_allocation; |
834 if (this->IsClass()) { | 832 if (this->IsClass()) { |
835 return 1; | 833 return 1; |
836 } else if (this->IsUnion()) { | 834 } else if (this->IsUnion()) { |
837 UnionHandle unioned = handle(this->AsUnion()); | |
838 int result = 0; | 835 int result = 0; |
839 for (int i = 0; i < unioned->Length(); ++i) { | 836 for (int i = 0, n = this->AsUnion()->Length(); i < n; ++i) { |
840 if (unioned->Get(i)->IsClass()) ++result; | 837 if (this->AsUnion()->Get(i)->IsClass()) ++result; |
841 } | 838 } |
842 return result; | 839 return result; |
843 } else { | 840 } else { |
844 return 0; | 841 return 0; |
845 } | 842 } |
846 } | 843 } |
847 | 844 |
848 | 845 |
849 template<class Config> | 846 template<class Config> |
850 int TypeImpl<Config>::NumConstants() { | 847 int TypeImpl<Config>::NumConstants() { |
851 DisallowHeapAllocation no_allocation; | 848 DisallowHeapAllocation no_allocation; |
852 if (this->IsConstant()) { | 849 if (this->IsConstant()) { |
853 return 1; | 850 return 1; |
854 } else if (this->IsUnion()) { | 851 } else if (this->IsUnion()) { |
855 UnionHandle unioned = handle(this->AsUnion()); | |
856 int result = 0; | 852 int result = 0; |
857 for (int i = 0; i < unioned->Length(); ++i) { | 853 for (int i = 0, n = this->AsUnion()->Length(); i < n; ++i) { |
858 if (unioned->Get(i)->IsConstant()) ++result; | 854 if (this->AsUnion()->Get(i)->IsConstant()) ++result; |
859 } | 855 } |
860 return result; | 856 return result; |
861 } else { | 857 } else { |
862 return 0; | 858 return 0; |
863 } | 859 } |
864 } | 860 } |
865 | 861 |
866 | 862 |
867 template<class Config> template<class T> | 863 template<class Config> template<class T> |
868 typename TypeImpl<Config>::TypeHandle | 864 typename TypeImpl<Config>::TypeHandle |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
910 i::Handle<T> TypeImpl<Config>::Iterator<T>::Current() { | 906 i::Handle<T> TypeImpl<Config>::Iterator<T>::Current() { |
911 return TypeImplIteratorAux<Config, T>::current(get_type()); | 907 return TypeImplIteratorAux<Config, T>::current(get_type()); |
912 } | 908 } |
913 | 909 |
914 | 910 |
915 template<class Config> template<class T> | 911 template<class Config> template<class T> |
916 void TypeImpl<Config>::Iterator<T>::Advance() { | 912 void TypeImpl<Config>::Iterator<T>::Advance() { |
917 DisallowHeapAllocation no_allocation; | 913 DisallowHeapAllocation no_allocation; |
918 ++index_; | 914 ++index_; |
919 if (type_->IsUnion()) { | 915 if (type_->IsUnion()) { |
920 UnionHandle unioned = Config::template cast<UnionType>(type_); | 916 for (int n = type_->AsUnion()->Length(); index_ < n; ++index_) { |
921 for (; index_ < unioned->Length(); ++index_) { | 917 if (matches(type_->AsUnion()->Get(index_))) return; |
922 if (matches(unioned->Get(index_))) return; | |
923 } | 918 } |
924 } else if (index_ == 0 && matches(type_)) { | 919 } else if (index_ == 0 && matches(type_)) { |
925 return; | 920 return; |
926 } | 921 } |
927 index_ = -1; | 922 index_ = -1; |
928 } | 923 } |
929 | 924 |
930 | 925 |
931 // ----------------------------------------------------------------------------- | 926 // ----------------------------------------------------------------------------- |
932 // Conversion between low-level representations. | 927 // Conversion between low-level representations. |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1050 << ")"; | 1045 << ")"; |
1051 } else if (this->IsRange()) { | 1046 } else if (this->IsRange()) { |
1052 os << "Range(" << this->AsRange()->Min()->Number() | 1047 os << "Range(" << this->AsRange()->Min()->Number() |
1053 << ", " << this->AsRange()->Max()->Number() << ")"; | 1048 << ", " << this->AsRange()->Max()->Number() << ")"; |
1054 } else if (this->IsContext()) { | 1049 } else if (this->IsContext()) { |
1055 os << "Context("; | 1050 os << "Context("; |
1056 this->AsContext()->Outer()->PrintTo(os, dim); | 1051 this->AsContext()->Outer()->PrintTo(os, dim); |
1057 os << ")"; | 1052 os << ")"; |
1058 } else if (this->IsUnion()) { | 1053 } else if (this->IsUnion()) { |
1059 os << "("; | 1054 os << "("; |
1060 UnionHandle unioned = handle(this->AsUnion()); | 1055 for (int i = 0, n = this->AsUnion()->Length(); i < n; ++i) { |
1061 for (int i = 0; i < unioned->Length(); ++i) { | 1056 TypeHandle type_i = this->AsUnion()->Get(i); |
1062 TypeHandle type_i = unioned->Get(i); | |
1063 if (i > 0) os << " | "; | 1057 if (i > 0) os << " | "; |
1064 type_i->PrintTo(os, dim); | 1058 type_i->PrintTo(os, dim); |
1065 } | 1059 } |
1066 os << ")"; | 1060 os << ")"; |
1067 } else if (this->IsArray()) { | 1061 } else if (this->IsArray()) { |
1068 os << "Array("; | 1062 os << "Array("; |
1069 AsArray()->Element()->PrintTo(os, dim); | 1063 AsArray()->Element()->PrintTo(os, dim); |
1070 os << ")"; | 1064 os << ")"; |
1071 } else if (this->IsFunction()) { | 1065 } else if (this->IsFunction()) { |
1072 if (!this->AsFunction()->Receiver()->IsAny()) { | 1066 if (!this->AsFunction()->Receiver()->IsAny()) { |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1119 template class TypeImpl<HeapTypeConfig>::Iterator<i::Object>; | 1113 template class TypeImpl<HeapTypeConfig>::Iterator<i::Object>; |
1120 | 1114 |
1121 template TypeImpl<ZoneTypeConfig>::TypeHandle | 1115 template TypeImpl<ZoneTypeConfig>::TypeHandle |
1122 TypeImpl<ZoneTypeConfig>::Convert<HeapType>( | 1116 TypeImpl<ZoneTypeConfig>::Convert<HeapType>( |
1123 TypeImpl<HeapTypeConfig>::TypeHandle, TypeImpl<ZoneTypeConfig>::Region*); | 1117 TypeImpl<HeapTypeConfig>::TypeHandle, TypeImpl<ZoneTypeConfig>::Region*); |
1124 template TypeImpl<HeapTypeConfig>::TypeHandle | 1118 template TypeImpl<HeapTypeConfig>::TypeHandle |
1125 TypeImpl<HeapTypeConfig>::Convert<Type>( | 1119 TypeImpl<HeapTypeConfig>::Convert<Type>( |
1126 TypeImpl<ZoneTypeConfig>::TypeHandle, TypeImpl<HeapTypeConfig>::Region*); | 1120 TypeImpl<ZoneTypeConfig>::TypeHandle, TypeImpl<HeapTypeConfig>::Region*); |
1127 | 1121 |
1128 } } // namespace v8::internal | 1122 } } // namespace v8::internal |
OLD | NEW |