Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(485)

Side by Side Diff: src/hydrogen-instructions.cc

Issue 363323003: More OStreamsUse OStreams more often. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Rebased and polished. Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/hydrogen-instructions.h ('k') | src/hydrogen-types.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/double.h" 7 #include "src/double.h"
8 #include "src/factory.h" 8 #include "src/factory.h"
9 #include "src/hydrogen-infer-representation.h" 9 #include "src/hydrogen-infer-representation.h"
10 #include "src/property-details-inl.h" 10 #include "src/property-details-inl.h"
(...skipping 507 matching lines...) Expand 10 before | Expand all | Expand 10 after
518 518
519 void HValue::SetBlock(HBasicBlock* block) { 519 void HValue::SetBlock(HBasicBlock* block) {
520 ASSERT(block_ == NULL || block == NULL); 520 ASSERT(block_ == NULL || block == NULL);
521 block_ = block; 521 block_ = block;
522 if (id_ == kNoNumber && block != NULL) { 522 if (id_ == kNoNumber && block != NULL) {
523 id_ = block->graph()->GetNextValueID(this); 523 id_ = block->graph()->GetNextValueID(this);
524 } 524 }
525 } 525 }
526 526
527 527
528 OStream& operator<<(OStream& os, const HValue& v) { 528 OStream& operator<<(OStream& os, const HValue& v) { return v.PrintTo(os); }
529 // TODO(svenpanne) Temporary impedance matching, to be removed later. 529
530 HeapStringAllocator allocator; 530
531 StringStream stream(&allocator); 531 OStream& operator<<(OStream& os, const TypeOf& t) {
532 const_cast<HValue*>(&v)->PrintTo(&stream); 532 if (t.value->representation().IsTagged() &&
533 return os << stream.ToCString().get(); 533 !t.value->type().Equals(HType::Tagged()))
534 return os;
535 return os << " type:" << t.value->type();
534 } 536 }
535 537
536 538
537 void HValue::PrintTypeTo(StringStream* stream) { 539 OStream& operator<<(OStream& os, const ChangesOf& c) {
538 if (!representation().IsTagged() || type().Equals(HType::Tagged())) return; 540 GVNFlagSet changes_flags = c.value->ChangesFlags();
539 stream->Add(" type:%s", type().ToString()); 541 if (changes_flags.IsEmpty()) return os;
540 } 542 os << " changes[";
541 543 if (changes_flags == c.value->AllSideEffectsFlagSet()) {
542 544 os << "*";
543 void HValue::PrintChangesTo(StringStream* stream) {
544 GVNFlagSet changes_flags = ChangesFlags();
545 if (changes_flags.IsEmpty()) return;
546 stream->Add(" changes[");
547 if (changes_flags == AllSideEffectsFlagSet()) {
548 stream->Add("*");
549 } else { 545 } else {
550 bool add_comma = false; 546 bool add_comma = false;
551 #define PRINT_DO(Type) \ 547 #define PRINT_DO(Type) \
552 if (changes_flags.Contains(k##Type)) { \ 548 if (changes_flags.Contains(k##Type)) { \
553 if (add_comma) stream->Add(","); \ 549 if (add_comma) os << ","; \
554 add_comma = true; \ 550 add_comma = true; \
555 stream->Add(#Type); \ 551 os << #Type; \
556 } 552 }
557 GVN_TRACKED_FLAG_LIST(PRINT_DO); 553 GVN_TRACKED_FLAG_LIST(PRINT_DO);
558 GVN_UNTRACKED_FLAG_LIST(PRINT_DO); 554 GVN_UNTRACKED_FLAG_LIST(PRINT_DO);
559 #undef PRINT_DO 555 #undef PRINT_DO
560 } 556 }
561 stream->Add("]"); 557 return os << "]";
562 } 558 }
563 559
564 560
565 void HValue::PrintNameTo(StringStream* stream) {
566 stream->Add("%s%d", representation_.Mnemonic(), id());
567 }
568
569
570 bool HValue::HasMonomorphicJSObjectType() { 561 bool HValue::HasMonomorphicJSObjectType() {
571 return !GetMonomorphicJSObjectMap().is_null(); 562 return !GetMonomorphicJSObjectMap().is_null();
572 } 563 }
573 564
574 565
575 bool HValue::UpdateInferredType() { 566 bool HValue::UpdateInferredType() {
576 HType type = CalculateInferredType(); 567 HType type = CalculateInferredType();
577 bool result = (!type.Equals(type_)); 568 bool result = (!type.Equals(type_));
578 type_ = type; 569 type_ = type;
579 return result; 570 return result;
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
617 } 608 }
618 609
619 610
620 void HValue::ComputeInitialRange(Zone* zone) { 611 void HValue::ComputeInitialRange(Zone* zone) {
621 ASSERT(!HasRange()); 612 ASSERT(!HasRange());
622 range_ = InferRange(zone); 613 range_ = InferRange(zone);
623 ASSERT(HasRange()); 614 ASSERT(HasRange());
624 } 615 }
625 616
626 617
627 void HSourcePosition::PrintTo(FILE* out) { 618 OStream& operator<<(OStream& os, const HSourcePosition& p) {
628 if (IsUnknown()) { 619 if (p.IsUnknown()) {
629 PrintF(out, "<?>"); 620 return os << "<?>";
621 } else if (FLAG_hydrogen_track_positions) {
622 return os << "<" << p.inlining_id() << ":" << p.position() << ">";
630 } else { 623 } else {
631 if (FLAG_hydrogen_track_positions) { 624 return os << "<0:" << p.raw() << ">";
632 PrintF(out, "<%d:%d>", inlining_id(), position());
633 } else {
634 PrintF(out, "<0:%d>", raw());
635 }
636 } 625 }
637 } 626 }
638 627
639 628
640 void HInstruction::PrintTo(StringStream* stream) { 629 OStream& HInstruction::PrintTo(OStream& os) const { // NOLINT
641 PrintMnemonicTo(stream); 630 os << Mnemonic() << " ";
642 PrintDataTo(stream); 631 PrintDataTo(os) << ChangesOf(this) << TypeOf(this);
643 PrintChangesTo(stream); 632 if (CheckFlag(HValue::kHasNoObservableSideEffects)) os << " [noOSE]";
644 PrintTypeTo(stream); 633 if (CheckFlag(HValue::kIsDead)) os << " [dead]";
645 if (CheckFlag(HValue::kHasNoObservableSideEffects)) { 634 return os;
646 stream->Add(" [noOSE]");
647 }
648 if (CheckFlag(HValue::kIsDead)) {
649 stream->Add(" [dead]");
650 }
651 } 635 }
652 636
653 637
654 void HInstruction::PrintDataTo(StringStream *stream) { 638 OStream& HInstruction::PrintDataTo(OStream& os) const { // NOLINT
655 for (int i = 0; i < OperandCount(); ++i) { 639 for (int i = 0; i < OperandCount(); ++i) {
656 if (i > 0) stream->Add(" "); 640 if (i > 0) os << " ";
657 OperandAt(i)->PrintNameTo(stream); 641 os << NameOf(OperandAt(i));
658 } 642 }
643 return os;
659 } 644 }
660 645
661 646
662 void HInstruction::PrintMnemonicTo(StringStream* stream) {
663 stream->Add("%s ", Mnemonic());
664 }
665
666
667 void HInstruction::Unlink() { 647 void HInstruction::Unlink() {
668 ASSERT(IsLinked()); 648 ASSERT(IsLinked());
669 ASSERT(!IsControlInstruction()); // Must never move control instructions. 649 ASSERT(!IsControlInstruction()); // Must never move control instructions.
670 ASSERT(!IsBlockEntry()); // Doesn't make sense to delete these. 650 ASSERT(!IsBlockEntry()); // Doesn't make sense to delete these.
671 ASSERT(previous_ != NULL); 651 ASSERT(previous_ != NULL);
672 previous_->next_ = next_; 652 previous_->next_ = next_;
673 if (next_ == NULL) { 653 if (next_ == NULL) {
674 ASSERT(block()->last() == this); 654 ASSERT(block()->last() == this);
675 block()->set_last(previous_); 655 block()->set_last(previous_);
676 } else { 656 } else {
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after
921 case HValue::kTypeof: 901 case HValue::kTypeof:
922 case HValue::kUnaryMathOperation: 902 case HValue::kUnaryMathOperation:
923 case HValue::kWrapReceiver: 903 case HValue::kWrapReceiver:
924 return true; 904 return true;
925 } 905 }
926 UNREACHABLE(); 906 UNREACHABLE();
927 return true; 907 return true;
928 } 908 }
929 909
930 910
931 void HDummyUse::PrintDataTo(StringStream* stream) { 911 OStream& operator<<(OStream& os, const NameOf& v) {
932 value()->PrintNameTo(stream); 912 return os << v.value->representation().Mnemonic() << v.value->id();
913 }
914
915 OStream& HDummyUse::PrintDataTo(OStream& os) const { // NOLINT
916 return os << NameOf(value());
933 } 917 }
934 918
935 919
936 void HEnvironmentMarker::PrintDataTo(StringStream* stream) { 920 OStream& HEnvironmentMarker::PrintDataTo(OStream& os) const { // NOLINT
937 stream->Add("%s var[%d]", kind() == BIND ? "bind" : "lookup", index()); 921 return os << (kind() == BIND ? "bind" : "lookup") << " var[" << index()
922 << "]";
938 } 923 }
939 924
940 925
941 void HUnaryCall::PrintDataTo(StringStream* stream) { 926 OStream& HUnaryCall::PrintDataTo(OStream& os) const { // NOLINT
942 value()->PrintNameTo(stream); 927 return os << NameOf(value()) << " #" << argument_count();
943 stream->Add(" ");
944 stream->Add("#%d", argument_count());
945 } 928 }
946 929
947 930
948 void HCallJSFunction::PrintDataTo(StringStream* stream) { 931 OStream& HCallJSFunction::PrintDataTo(OStream& os) const { // NOLINT
949 function()->PrintNameTo(stream); 932 return os << NameOf(function()) << " #" << argument_count();
950 stream->Add(" ");
951 stream->Add("#%d", argument_count());
952 } 933 }
953 934
954 935
955 HCallJSFunction* HCallJSFunction::New( 936 HCallJSFunction* HCallJSFunction::New(
956 Zone* zone, 937 Zone* zone,
957 HValue* context, 938 HValue* context,
958 HValue* function, 939 HValue* function,
959 int argument_count, 940 int argument_count,
960 bool pass_argument_count) { 941 bool pass_argument_count) {
961 bool has_stack_check = false; 942 bool has_stack_check = false;
962 if (function->IsConstant()) { 943 if (function->IsConstant()) {
963 HConstant* fun_const = HConstant::cast(function); 944 HConstant* fun_const = HConstant::cast(function);
964 Handle<JSFunction> jsfun = 945 Handle<JSFunction> jsfun =
965 Handle<JSFunction>::cast(fun_const->handle(zone->isolate())); 946 Handle<JSFunction>::cast(fun_const->handle(zone->isolate()));
966 has_stack_check = !jsfun.is_null() && 947 has_stack_check = !jsfun.is_null() &&
967 (jsfun->code()->kind() == Code::FUNCTION || 948 (jsfun->code()->kind() == Code::FUNCTION ||
968 jsfun->code()->kind() == Code::OPTIMIZED_FUNCTION); 949 jsfun->code()->kind() == Code::OPTIMIZED_FUNCTION);
969 } 950 }
970 951
971 return new(zone) HCallJSFunction( 952 return new(zone) HCallJSFunction(
972 function, argument_count, pass_argument_count, 953 function, argument_count, pass_argument_count,
973 has_stack_check); 954 has_stack_check);
974 } 955 }
975 956
976 957
977 958 OStream& HBinaryCall::PrintDataTo(OStream& os) const { // NOLINT
978 959 return os << NameOf(first()) << " " << NameOf(second()) << " #"
979 void HBinaryCall::PrintDataTo(StringStream* stream) { 960 << argument_count();
980 first()->PrintNameTo(stream);
981 stream->Add(" ");
982 second()->PrintNameTo(stream);
983 stream->Add(" ");
984 stream->Add("#%d", argument_count());
985 } 961 }
986 962
987 963
988 void HBoundsCheck::ApplyIndexChange() { 964 void HBoundsCheck::ApplyIndexChange() {
989 if (skip_check()) return; 965 if (skip_check()) return;
990 966
991 DecompositionResult decomposition; 967 DecompositionResult decomposition;
992 bool index_is_decomposable = index()->TryDecompose(&decomposition); 968 bool index_is_decomposable = index()->TryDecompose(&decomposition);
993 if (index_is_decomposable) { 969 if (index_is_decomposable) {
994 ASSERT(decomposition.base() == base()); 970 ASSERT(decomposition.base() == base());
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
1028 } 1004 }
1029 1005
1030 SetOperandAt(0, current_index); 1006 SetOperandAt(0, current_index);
1031 1007
1032 base_ = NULL; 1008 base_ = NULL;
1033 offset_ = 0; 1009 offset_ = 0;
1034 scale_ = 0; 1010 scale_ = 0;
1035 } 1011 }
1036 1012
1037 1013
1038 void HBoundsCheck::PrintDataTo(StringStream* stream) { 1014 OStream& HBoundsCheck::PrintDataTo(OStream& os) const { // NOLINT
1039 index()->PrintNameTo(stream); 1015 os << NameOf(index()) << " " << NameOf(length());
1040 stream->Add(" ");
1041 length()->PrintNameTo(stream);
1042 if (base() != NULL && (offset() != 0 || scale() != 0)) { 1016 if (base() != NULL && (offset() != 0 || scale() != 0)) {
1043 stream->Add(" base: (("); 1017 os << " base: ((";
1044 if (base() != index()) { 1018 if (base() != index()) {
1045 index()->PrintNameTo(stream); 1019 os << NameOf(index());
1046 } else { 1020 } else {
1047 stream->Add("index"); 1021 os << "index";
1048 } 1022 }
1049 stream->Add(" + %d) >> %d)", offset(), scale()); 1023 os << " + " << offset() << ") >> " << scale() << ")";
1050 } 1024 }
1051 if (skip_check()) { 1025 if (skip_check()) os << " [DISABLED]";
1052 stream->Add(" [DISABLED]"); 1026 return os;
1053 }
1054 } 1027 }
1055 1028
1056 1029
1057 void HBoundsCheck::InferRepresentation(HInferRepresentationPhase* h_infer) { 1030 void HBoundsCheck::InferRepresentation(HInferRepresentationPhase* h_infer) {
1058 ASSERT(CheckFlag(kFlexibleRepresentation)); 1031 ASSERT(CheckFlag(kFlexibleRepresentation));
1059 HValue* actual_index = index()->ActualValue(); 1032 HValue* actual_index = index()->ActualValue();
1060 HValue* actual_length = length()->ActualValue(); 1033 HValue* actual_length = length()->ActualValue();
1061 Representation index_rep = actual_index->representation(); 1034 Representation index_rep = actual_index->representation();
1062 Representation length_rep = actual_length->representation(); 1035 Representation length_rep = actual_length->representation();
1063 if (index_rep.IsTagged() && actual_index->type().IsSmi()) { 1036 if (index_rep.IsTagged() && actual_index->type().IsSmi()) {
(...skipping 22 matching lines...) Expand all
1086 } 1059 }
1087 1060
1088 // In case of Smi representation, clamp result to Smi::kMaxValue. 1061 // In case of Smi representation, clamp result to Smi::kMaxValue.
1089 if (r.IsSmi()) result->ClampToSmi(); 1062 if (r.IsSmi()) result->ClampToSmi();
1090 return result; 1063 return result;
1091 } 1064 }
1092 return HValue::InferRange(zone); 1065 return HValue::InferRange(zone);
1093 } 1066 }
1094 1067
1095 1068
1096 void HBoundsCheckBaseIndexInformation::PrintDataTo(StringStream* stream) { 1069 OStream& HBoundsCheckBaseIndexInformation::PrintDataTo(
1097 stream->Add("base: "); 1070 OStream& os) const { // NOLINT
1098 base_index()->PrintNameTo(stream); 1071 // TODO(svenpanne) This 2nd base_index() looks wrong...
1099 stream->Add(", check: "); 1072 return os << "base: " << NameOf(base_index())
1100 base_index()->PrintNameTo(stream); 1073 << ", check: " << NameOf(base_index());
1101 } 1074 }
1102 1075
1103 1076
1104 void HCallWithDescriptor::PrintDataTo(StringStream* stream) { 1077 OStream& HCallWithDescriptor::PrintDataTo(OStream& os) const { // NOLINT
1105 for (int i = 0; i < OperandCount(); i++) { 1078 for (int i = 0; i < OperandCount(); i++) {
1106 OperandAt(i)->PrintNameTo(stream); 1079 os << NameOf(OperandAt(i)) << " ";
1107 stream->Add(" ");
1108 } 1080 }
1109 stream->Add("#%d", argument_count()); 1081 return os << "#" << argument_count();
1110 } 1082 }
1111 1083
1112 1084
1113 void HCallNewArray::PrintDataTo(StringStream* stream) { 1085 OStream& HCallNewArray::PrintDataTo(OStream& os) const { // NOLINT
1114 stream->Add(ElementsKindToString(elements_kind())); 1086 os << ElementsKindToString(elements_kind()) << " ";
1115 stream->Add(" "); 1087 return HBinaryCall::PrintDataTo(os);
1116 HBinaryCall::PrintDataTo(stream);
1117 } 1088 }
1118 1089
1119 1090
1120 void HCallRuntime::PrintDataTo(StringStream* stream) { 1091 OStream& HCallRuntime::PrintDataTo(OStream& os) const { // NOLINT
1121 stream->Add("%o ", *name()); 1092 os << name()->ToCString().get() << " ";
1122 if (save_doubles() == kSaveFPRegs) { 1093 if (save_doubles() == kSaveFPRegs) os << "[save doubles] ";
1123 stream->Add("[save doubles] "); 1094 return os << "#" << argument_count();
1124 }
1125 stream->Add("#%d", argument_count());
1126 } 1095 }
1127 1096
1128 1097
1129 void HClassOfTestAndBranch::PrintDataTo(StringStream* stream) { 1098 OStream& HClassOfTestAndBranch::PrintDataTo(OStream& os) const { // NOLINT
1130 stream->Add("class_of_test("); 1099 return os << "class_of_test(" << NameOf(value()) << ", \""
1131 value()->PrintNameTo(stream); 1100 << class_name()->ToCString().get() << "\")";
1132 stream->Add(", \"%o\")", *class_name());
1133 } 1101 }
1134 1102
1135 1103
1136 void HWrapReceiver::PrintDataTo(StringStream* stream) { 1104 OStream& HWrapReceiver::PrintDataTo(OStream& os) const { // NOLINT
1137 receiver()->PrintNameTo(stream); 1105 return os << NameOf(receiver()) << " " << NameOf(function());
1138 stream->Add(" ");
1139 function()->PrintNameTo(stream);
1140 } 1106 }
1141 1107
1142 1108
1143 void HAccessArgumentsAt::PrintDataTo(StringStream* stream) { 1109 OStream& HAccessArgumentsAt::PrintDataTo(OStream& os) const { // NOLINT
1144 arguments()->PrintNameTo(stream); 1110 return os << NameOf(arguments()) << "[" << NameOf(index()) << "], length "
1145 stream->Add("["); 1111 << NameOf(length());
1146 index()->PrintNameTo(stream);
1147 stream->Add("], length ");
1148 length()->PrintNameTo(stream);
1149 } 1112 }
1150 1113
1151 1114
1152 void HAllocateBlockContext::PrintDataTo(StringStream* stream) { 1115 OStream& HAllocateBlockContext::PrintDataTo(OStream& os) const { // NOLINT
1153 context()->PrintNameTo(stream); 1116 return os << NameOf(context()) << " " << NameOf(function());
1154 stream->Add(" ");
1155 function()->PrintNameTo(stream);
1156 } 1117 }
1157 1118
1158 1119
1159 void HControlInstruction::PrintDataTo(StringStream* stream) { 1120 OStream& HControlInstruction::PrintDataTo(OStream& os) const { // NOLINT
1160 stream->Add(" goto ("); 1121 os << " goto (";
1161 bool first_block = true; 1122 bool first_block = true;
1162 for (HSuccessorIterator it(this); !it.Done(); it.Advance()) { 1123 for (HSuccessorIterator it(this); !it.Done(); it.Advance()) {
1163 stream->Add(first_block ? "B%d" : ", B%d", it.Current()->block_id()); 1124 if (!first_block) os << ", ";
1125 os << *it.Current();
1164 first_block = false; 1126 first_block = false;
1165 } 1127 }
1166 stream->Add(")"); 1128 return os << ")";
1167 } 1129 }
1168 1130
1169 1131
1170 void HUnaryControlInstruction::PrintDataTo(StringStream* stream) { 1132 OStream& HUnaryControlInstruction::PrintDataTo(OStream& os) const { // NOLINT
1171 value()->PrintNameTo(stream); 1133 os << NameOf(value());
1172 HControlInstruction::PrintDataTo(stream); 1134 return HControlInstruction::PrintDataTo(os);
1173 } 1135 }
1174 1136
1175 1137
1176 void HReturn::PrintDataTo(StringStream* stream) { 1138 OStream& HReturn::PrintDataTo(OStream& os) const { // NOLINT
1177 value()->PrintNameTo(stream); 1139 return os << NameOf(value()) << " (pop " << NameOf(parameter_count())
1178 stream->Add(" (pop "); 1140 << " values)";
1179 parameter_count()->PrintNameTo(stream);
1180 stream->Add(" values)");
1181 } 1141 }
1182 1142
1183 1143
1184 Representation HBranch::observed_input_representation(int index) { 1144 Representation HBranch::observed_input_representation(int index) {
1185 static const ToBooleanStub::Types tagged_types( 1145 static const ToBooleanStub::Types tagged_types(
1186 ToBooleanStub::NULL_TYPE | 1146 ToBooleanStub::NULL_TYPE |
1187 ToBooleanStub::SPEC_OBJECT | 1147 ToBooleanStub::SPEC_OBJECT |
1188 ToBooleanStub::STRING | 1148 ToBooleanStub::STRING |
1189 ToBooleanStub::SYMBOL); 1149 ToBooleanStub::SYMBOL);
1190 if (expected_input_types_.ContainsAnyOf(tagged_types)) { 1150 if (expected_input_types_.ContainsAnyOf(tagged_types)) {
(...skipping 23 matching lines...) Expand all
1214 *block = HConstant::cast(value)->BooleanValue() 1174 *block = HConstant::cast(value)->BooleanValue()
1215 ? FirstSuccessor() 1175 ? FirstSuccessor()
1216 : SecondSuccessor(); 1176 : SecondSuccessor();
1217 return true; 1177 return true;
1218 } 1178 }
1219 *block = NULL; 1179 *block = NULL;
1220 return false; 1180 return false;
1221 } 1181 }
1222 1182
1223 1183
1224 void HBranch::PrintDataTo(StringStream* stream) { 1184 OStream& HBranch::PrintDataTo(OStream& os) const { // NOLINT
1225 HUnaryControlInstruction::PrintDataTo(stream); 1185 return HUnaryControlInstruction::PrintDataTo(os) << " "
1226 OStringStream os; 1186 << expected_input_types();
1227 os << " " << expected_input_types();
1228 stream->Add(os.c_str());
1229 } 1187 }
1230 1188
1231 1189
1232 void HCompareMap::PrintDataTo(StringStream* stream) { 1190 OStream& HCompareMap::PrintDataTo(OStream& os) const { // NOLINT
1233 value()->PrintNameTo(stream); 1191 os << NameOf(value()) << " (" << *map().handle() << ")";
1234 stream->Add(" (%p)", *map().handle()); 1192 HControlInstruction::PrintDataTo(os);
1235 HControlInstruction::PrintDataTo(stream);
1236 if (known_successor_index() == 0) { 1193 if (known_successor_index() == 0) {
1237 stream->Add(" [true]"); 1194 os << " [true]";
1238 } else if (known_successor_index() == 1) { 1195 } else if (known_successor_index() == 1) {
1239 stream->Add(" [false]"); 1196 os << " [false]";
1240 } 1197 }
1198 return os;
1241 } 1199 }
1242 1200
1243 1201
1244 const char* HUnaryMathOperation::OpName() const { 1202 const char* HUnaryMathOperation::OpName() const {
1245 switch (op()) { 1203 switch (op()) {
1246 case kMathFloor: return "floor"; 1204 case kMathFloor: return "floor";
1247 case kMathRound: return "round"; 1205 case kMathRound: return "round";
1248 case kMathAbs: return "abs"; 1206 case kMathAbs: return "abs";
1249 case kMathLog: return "log"; 1207 case kMathLog: return "log";
1250 case kMathExp: return "exp"; 1208 case kMathExp: return "exp";
(...skipping 25 matching lines...) Expand all
1276 // In case of Smi representation, clamp Math.abs(Smi::kMinValue) to 1234 // In case of Smi representation, clamp Math.abs(Smi::kMinValue) to
1277 // Smi::kMaxValue. 1235 // Smi::kMaxValue.
1278 if (r.IsSmi()) result->ClampToSmi(); 1236 if (r.IsSmi()) result->ClampToSmi();
1279 return result; 1237 return result;
1280 } 1238 }
1281 } 1239 }
1282 return HValue::InferRange(zone); 1240 return HValue::InferRange(zone);
1283 } 1241 }
1284 1242
1285 1243
1286 void HUnaryMathOperation::PrintDataTo(StringStream* stream) { 1244 OStream& HUnaryMathOperation::PrintDataTo(OStream& os) const { // NOLINT
1287 const char* name = OpName(); 1245 return os << OpName() << " " << NameOf(value());
1288 stream->Add("%s ", name);
1289 value()->PrintNameTo(stream);
1290 } 1246 }
1291 1247
1292 1248
1293 void HUnaryOperation::PrintDataTo(StringStream* stream) { 1249 OStream& HUnaryOperation::PrintDataTo(OStream& os) const { // NOLINT
1294 value()->PrintNameTo(stream); 1250 return os << NameOf(value());
1295 } 1251 }
1296 1252
1297 1253
1298 void HHasInstanceTypeAndBranch::PrintDataTo(StringStream* stream) { 1254 OStream& HHasInstanceTypeAndBranch::PrintDataTo(OStream& os) const { // NOLINT
1299 value()->PrintNameTo(stream); 1255 os << NameOf(value());
1300 switch (from_) { 1256 switch (from_) {
1301 case FIRST_JS_RECEIVER_TYPE: 1257 case FIRST_JS_RECEIVER_TYPE:
1302 if (to_ == LAST_TYPE) stream->Add(" spec_object"); 1258 if (to_ == LAST_TYPE) os << " spec_object";
1303 break; 1259 break;
1304 case JS_REGEXP_TYPE: 1260 case JS_REGEXP_TYPE:
1305 if (to_ == JS_REGEXP_TYPE) stream->Add(" reg_exp"); 1261 if (to_ == JS_REGEXP_TYPE) os << " reg_exp";
1306 break; 1262 break;
1307 case JS_ARRAY_TYPE: 1263 case JS_ARRAY_TYPE:
1308 if (to_ == JS_ARRAY_TYPE) stream->Add(" array"); 1264 if (to_ == JS_ARRAY_TYPE) os << " array";
1309 break; 1265 break;
1310 case JS_FUNCTION_TYPE: 1266 case JS_FUNCTION_TYPE:
1311 if (to_ == JS_FUNCTION_TYPE) stream->Add(" function"); 1267 if (to_ == JS_FUNCTION_TYPE) os << " function";
1312 break; 1268 break;
1313 default: 1269 default:
1314 break; 1270 break;
1315 } 1271 }
1272 return os;
1316 } 1273 }
1317 1274
1318 1275
1319 void HTypeofIsAndBranch::PrintDataTo(StringStream* stream) { 1276 OStream& HTypeofIsAndBranch::PrintDataTo(OStream& os) const { // NOLINT
1320 value()->PrintNameTo(stream); 1277 os << NameOf(value()) << " == " << type_literal()->ToCString().get();
1321 stream->Add(" == %o", *type_literal_.handle()); 1278 return HControlInstruction::PrintDataTo(os);
1322 HControlInstruction::PrintDataTo(stream);
1323 } 1279 }
1324 1280
1325 1281
1326 static String* TypeOfString(HConstant* constant, Isolate* isolate) { 1282 static String* TypeOfString(HConstant* constant, Isolate* isolate) {
1327 Heap* heap = isolate->heap(); 1283 Heap* heap = isolate->heap();
1328 if (constant->HasNumberValue()) return heap->number_string(); 1284 if (constant->HasNumberValue()) return heap->number_string();
1329 if (constant->IsUndetectable()) return heap->undefined_string(); 1285 if (constant->IsUndetectable()) return heap->undefined_string();
1330 if (constant->HasStringValue()) return heap->string_string(); 1286 if (constant->HasStringValue()) return heap->string_string();
1331 switch (constant->GetInstanceType()) { 1287 switch (constant->GetInstanceType()) {
1332 case ODDBALL_TYPE: { 1288 case ODDBALL_TYPE: {
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1364 bool number_type = 1320 bool number_type =
1365 type_literal_.IsKnownGlobal(isolate()->heap()->number_string()); 1321 type_literal_.IsKnownGlobal(isolate()->heap()->number_string());
1366 *block = number_type ? FirstSuccessor() : SecondSuccessor(); 1322 *block = number_type ? FirstSuccessor() : SecondSuccessor();
1367 return true; 1323 return true;
1368 } 1324 }
1369 *block = NULL; 1325 *block = NULL;
1370 return false; 1326 return false;
1371 } 1327 }
1372 1328
1373 1329
1374 void HCheckMapValue::PrintDataTo(StringStream* stream) { 1330 OStream& HCheckMapValue::PrintDataTo(OStream& os) const { // NOLINT
1375 value()->PrintNameTo(stream); 1331 return os << NameOf(value()) << " " << NameOf(map());
1376 stream->Add(" ");
1377 map()->PrintNameTo(stream);
1378 } 1332 }
1379 1333
1380 1334
1381 HValue* HCheckMapValue::Canonicalize() { 1335 HValue* HCheckMapValue::Canonicalize() {
1382 if (map()->IsConstant()) { 1336 if (map()->IsConstant()) {
1383 HConstant* c_map = HConstant::cast(map()); 1337 HConstant* c_map = HConstant::cast(map());
1384 return HCheckMaps::CreateAndInsertAfter( 1338 return HCheckMaps::CreateAndInsertAfter(
1385 block()->graph()->zone(), value(), c_map->MapValue(), 1339 block()->graph()->zone(), value(), c_map->MapValue(),
1386 c_map->HasStableMapValue(), this); 1340 c_map->HasStableMapValue(), this);
1387 } 1341 }
1388 return this; 1342 return this;
1389 } 1343 }
1390 1344
1391 1345
1392 void HForInPrepareMap::PrintDataTo(StringStream* stream) { 1346 OStream& HForInPrepareMap::PrintDataTo(OStream& os) const { // NOLINT
1393 enumerable()->PrintNameTo(stream); 1347 return os << NameOf(enumerable());
1394 } 1348 }
1395 1349
1396 1350
1397 void HForInCacheArray::PrintDataTo(StringStream* stream) { 1351 OStream& HForInCacheArray::PrintDataTo(OStream& os) const { // NOLINT
1398 enumerable()->PrintNameTo(stream); 1352 return os << NameOf(enumerable()) << " " << NameOf(map()) << "[" << idx_
1399 stream->Add(" "); 1353 << "]";
1400 map()->PrintNameTo(stream);
1401 stream->Add("[%d]", idx_);
1402 } 1354 }
1403 1355
1404 1356
1405 void HLoadFieldByIndex::PrintDataTo(StringStream* stream) { 1357 OStream& HLoadFieldByIndex::PrintDataTo(OStream& os) const { // NOLINT
1406 object()->PrintNameTo(stream); 1358 return os << NameOf(object()) << " " << NameOf(index());
1407 stream->Add(" ");
1408 index()->PrintNameTo(stream);
1409 } 1359 }
1410 1360
1411 1361
1412 static bool MatchLeftIsOnes(HValue* l, HValue* r, HValue** negated) { 1362 static bool MatchLeftIsOnes(HValue* l, HValue* r, HValue** negated) {
1413 if (!l->EqualsInteger32Constant(~0)) return false; 1363 if (!l->EqualsInteger32Constant(~0)) return false;
1414 *negated = r; 1364 *negated = r;
1415 return true; 1365 return true;
1416 } 1366 }
1417 1367
1418 1368
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
1534 1484
1535 HValue* HWrapReceiver::Canonicalize() { 1485 HValue* HWrapReceiver::Canonicalize() {
1536 if (HasNoUses()) return NULL; 1486 if (HasNoUses()) return NULL;
1537 if (receiver()->type().IsJSObject()) { 1487 if (receiver()->type().IsJSObject()) {
1538 return receiver(); 1488 return receiver();
1539 } 1489 }
1540 return this; 1490 return this;
1541 } 1491 }
1542 1492
1543 1493
1544 void HTypeof::PrintDataTo(StringStream* stream) { 1494 OStream& HTypeof::PrintDataTo(OStream& os) const { // NOLINT
1545 value()->PrintNameTo(stream); 1495 return os << NameOf(value());
1546 } 1496 }
1547 1497
1548 1498
1549 HInstruction* HForceRepresentation::New(Zone* zone, HValue* context, 1499 HInstruction* HForceRepresentation::New(Zone* zone, HValue* context,
1550 HValue* value, Representation representation) { 1500 HValue* value, Representation representation) {
1551 if (FLAG_fold_constants && value->IsConstant()) { 1501 if (FLAG_fold_constants && value->IsConstant()) {
1552 HConstant* c = HConstant::cast(value); 1502 HConstant* c = HConstant::cast(value);
1553 if (c->HasNumberValue()) { 1503 if (c->HasNumberValue()) {
1554 double double_res = c->DoubleValue(); 1504 double double_res = c->DoubleValue();
1555 if (representation.IsDouble()) { 1505 if (representation.IsDouble()) {
1556 return HConstant::New(zone, context, double_res); 1506 return HConstant::New(zone, context, double_res);
1557 1507
1558 } else if (representation.CanContainDouble(double_res)) { 1508 } else if (representation.CanContainDouble(double_res)) {
1559 return HConstant::New(zone, context, 1509 return HConstant::New(zone, context,
1560 static_cast<int32_t>(double_res), 1510 static_cast<int32_t>(double_res),
1561 representation); 1511 representation);
1562 } 1512 }
1563 } 1513 }
1564 } 1514 }
1565 return new(zone) HForceRepresentation(value, representation); 1515 return new(zone) HForceRepresentation(value, representation);
1566 } 1516 }
1567 1517
1568 1518
1569 void HForceRepresentation::PrintDataTo(StringStream* stream) { 1519 OStream& HForceRepresentation::PrintDataTo(OStream& os) const { // NOLINT
1570 stream->Add("%s ", representation().Mnemonic()); 1520 return os << representation().Mnemonic() << " " << NameOf(value());
1571 value()->PrintNameTo(stream);
1572 } 1521 }
1573 1522
1574 1523
1575 void HChange::PrintDataTo(StringStream* stream) { 1524 OStream& HChange::PrintDataTo(OStream& os) const { // NOLINT
1576 HUnaryOperation::PrintDataTo(stream); 1525 HUnaryOperation::PrintDataTo(os);
1577 stream->Add(" %s to %s", from().Mnemonic(), to().Mnemonic()); 1526 os << " " << from().Mnemonic() << " to " << to().Mnemonic();
1578 1527
1579 if (CanTruncateToSmi()) stream->Add(" truncating-smi"); 1528 if (CanTruncateToSmi()) os << " truncating-smi";
1580 if (CanTruncateToInt32()) stream->Add(" truncating-int32"); 1529 if (CanTruncateToInt32()) os << " truncating-int32";
1581 if (CheckFlag(kBailoutOnMinusZero)) stream->Add(" -0?"); 1530 if (CheckFlag(kBailoutOnMinusZero)) os << " -0?";
1582 if (CheckFlag(kAllowUndefinedAsNaN)) stream->Add(" allow-undefined-as-nan"); 1531 if (CheckFlag(kAllowUndefinedAsNaN)) os << " allow-undefined-as-nan";
1532 return os;
1583 } 1533 }
1584 1534
1585 1535
1586 HValue* HUnaryMathOperation::Canonicalize() { 1536 HValue* HUnaryMathOperation::Canonicalize() {
1587 if (op() == kMathRound || op() == kMathFloor) { 1537 if (op() == kMathRound || op() == kMathFloor) {
1588 HValue* val = value(); 1538 HValue* val = value();
1589 if (val->IsChange()) val = HChange::cast(val)->value(); 1539 if (val->IsChange()) val = HChange::cast(val)->value();
1590 if (val->representation().IsSmiOrInteger32()) { 1540 if (val->representation().IsSmiOrInteger32()) {
1591 if (val->representation().Equals(representation())) return val; 1541 if (val->representation().Equals(representation())) return val;
1592 return Prepend(new(block()->zone()) HChange( 1542 return Prepend(new(block()->zone()) HChange(
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
1676 case IS_INTERNALIZED_STRING: 1626 case IS_INTERNALIZED_STRING:
1677 *mask = kIsNotStringMask | kIsNotInternalizedMask; 1627 *mask = kIsNotStringMask | kIsNotInternalizedMask;
1678 *tag = kInternalizedTag; 1628 *tag = kInternalizedTag;
1679 return; 1629 return;
1680 default: 1630 default:
1681 UNREACHABLE(); 1631 UNREACHABLE();
1682 } 1632 }
1683 } 1633 }
1684 1634
1685 1635
1686 void HCheckMaps::PrintDataTo(StringStream* stream) { 1636 OStream& HCheckMaps::PrintDataTo(OStream& os) const { // NOLINT
1687 value()->PrintNameTo(stream); 1637 os << NameOf(value()) << " [" << *maps()->at(0).handle();
1688 stream->Add(" [%p", *maps()->at(0).handle());
1689 for (int i = 1; i < maps()->size(); ++i) { 1638 for (int i = 1; i < maps()->size(); ++i) {
1690 stream->Add(",%p", *maps()->at(i).handle()); 1639 os << "," << *maps()->at(i).handle();
1691 } 1640 }
1692 stream->Add("]%s", IsStabilityCheck() ? "(stability-check)" : ""); 1641 os << "]";
1642 if (IsStabilityCheck()) os << "(stability-check)";
1643 return os;
1693 } 1644 }
1694 1645
1695 1646
1696 HValue* HCheckMaps::Canonicalize() { 1647 HValue* HCheckMaps::Canonicalize() {
1697 if (!IsStabilityCheck() && maps_are_stable() && value()->IsConstant()) { 1648 if (!IsStabilityCheck() && maps_are_stable() && value()->IsConstant()) {
1698 HConstant* c_value = HConstant::cast(value()); 1649 HConstant* c_value = HConstant::cast(value());
1699 if (c_value->HasObjectMap()) { 1650 if (c_value->HasObjectMap()) {
1700 for (int i = 0; i < maps()->size(); ++i) { 1651 for (int i = 0; i < maps()->size(); ++i) {
1701 if (c_value->ObjectMap() == maps()->at(i)) { 1652 if (c_value->ObjectMap() == maps()->at(i)) {
1702 if (maps()->size() > 1) { 1653 if (maps()->size() > 1) {
1703 set_maps(new(block()->graph()->zone()) UniqueSet<Map>( 1654 set_maps(new(block()->graph()->zone()) UniqueSet<Map>(
1704 maps()->at(i), block()->graph()->zone())); 1655 maps()->at(i), block()->graph()->zone()));
1705 } 1656 }
1706 MarkAsStabilityCheck(); 1657 MarkAsStabilityCheck();
1707 break; 1658 break;
1708 } 1659 }
1709 } 1660 }
1710 } 1661 }
1711 } 1662 }
1712 return this; 1663 return this;
1713 } 1664 }
1714 1665
1715 1666
1716 void HCheckValue::PrintDataTo(StringStream* stream) { 1667 OStream& HCheckValue::PrintDataTo(OStream& os) const { // NOLINT
1717 value()->PrintNameTo(stream); 1668 return os << NameOf(value()) << " " << Brief(*object().handle());
1718 stream->Add(" ");
1719 object().handle()->ShortPrint(stream);
1720 } 1669 }
1721 1670
1722 1671
1723 HValue* HCheckValue::Canonicalize() { 1672 HValue* HCheckValue::Canonicalize() {
1724 return (value()->IsConstant() && 1673 return (value()->IsConstant() &&
1725 HConstant::cast(value())->EqualsUnique(object_)) ? NULL : this; 1674 HConstant::cast(value())->EqualsUnique(object_)) ? NULL : this;
1726 } 1675 }
1727 1676
1728 1677
1729 const char* HCheckInstanceType::GetCheckName() { 1678 const char* HCheckInstanceType::GetCheckName() const {
1730 switch (check_) { 1679 switch (check_) {
1731 case IS_SPEC_OBJECT: return "object"; 1680 case IS_SPEC_OBJECT: return "object";
1732 case IS_JS_ARRAY: return "array"; 1681 case IS_JS_ARRAY: return "array";
1733 case IS_STRING: return "string"; 1682 case IS_STRING: return "string";
1734 case IS_INTERNALIZED_STRING: return "internalized_string"; 1683 case IS_INTERNALIZED_STRING: return "internalized_string";
1735 } 1684 }
1736 UNREACHABLE(); 1685 UNREACHABLE();
1737 return ""; 1686 return "";
1738 } 1687 }
1739 1688
1740 1689
1741 void HCheckInstanceType::PrintDataTo(StringStream* stream) { 1690 OStream& HCheckInstanceType::PrintDataTo(OStream& os) const { // NOLINT
1742 stream->Add("%s ", GetCheckName()); 1691 os << GetCheckName() << " ";
1743 HUnaryOperation::PrintDataTo(stream); 1692 return HUnaryOperation::PrintDataTo(os);
1744 } 1693 }
1745 1694
1746 1695
1747 void HCallStub::PrintDataTo(StringStream* stream) { 1696 OStream& HCallStub::PrintDataTo(OStream& os) const { // NOLINT
1748 stream->Add("%s ", 1697 os << CodeStub::MajorName(major_key_, false) << " ";
1749 CodeStub::MajorName(major_key_, false)); 1698 return HUnaryCall::PrintDataTo(os);
1750 HUnaryCall::PrintDataTo(stream);
1751 } 1699 }
1752 1700
1753 1701
1754 void HUnknownOSRValue::PrintDataTo(StringStream *stream) { 1702 OStream& HUnknownOSRValue::PrintDataTo(OStream& os) const { // NOLINT
1755 const char* type = "expression"; 1703 const char* type = "expression";
1756 if (environment_->is_local_index(index_)) type = "local"; 1704 if (environment_->is_local_index(index_)) type = "local";
1757 if (environment_->is_special_index(index_)) type = "special"; 1705 if (environment_->is_special_index(index_)) type = "special";
1758 if (environment_->is_parameter_index(index_)) type = "parameter"; 1706 if (environment_->is_parameter_index(index_)) type = "parameter";
1759 stream->Add("%s @ %d", type, index_); 1707 return os << type << " @ " << index_;
1760 } 1708 }
1761 1709
1762 1710
1763 void HInstanceOf::PrintDataTo(StringStream* stream) { 1711 OStream& HInstanceOf::PrintDataTo(OStream& os) const { // NOLINT
1764 left()->PrintNameTo(stream); 1712 return os << NameOf(left()) << " " << NameOf(right()) << " "
1765 stream->Add(" "); 1713 << NameOf(context());
1766 right()->PrintNameTo(stream);
1767 stream->Add(" ");
1768 context()->PrintNameTo(stream);
1769 } 1714 }
1770 1715
1771 1716
1772 Range* HValue::InferRange(Zone* zone) { 1717 Range* HValue::InferRange(Zone* zone) {
1773 Range* result; 1718 Range* result;
1774 if (representation().IsSmi() || type().IsSmi()) { 1719 if (representation().IsSmi() || type().IsSmi()) {
1775 result = new(zone) Range(Smi::kMinValue, Smi::kMaxValue); 1720 result = new(zone) Range(Smi::kMinValue, Smi::kMaxValue);
1776 result->set_can_be_minus_zero(false); 1721 result->set_can_be_minus_zero(false);
1777 } else { 1722 } else {
1778 result = new(zone) Range(); 1723 result = new(zone) Range();
(...skipping 692 matching lines...) Expand 10 before | Expand all | Expand 10 after
2471 } 2416 }
2472 } 2417 }
2473 2418
2474 2419
2475 void HPushArguments::AddInput(HValue* value) { 2420 void HPushArguments::AddInput(HValue* value) {
2476 inputs_.Add(NULL, value->block()->zone()); 2421 inputs_.Add(NULL, value->block()->zone());
2477 SetOperandAt(OperandCount() - 1, value); 2422 SetOperandAt(OperandCount() - 1, value);
2478 } 2423 }
2479 2424
2480 2425
2481 void HPhi::PrintTo(StringStream* stream) { 2426 OStream& HPhi::PrintTo(OStream& os) const { // NOLINT
2482 stream->Add("["); 2427 os << "[";
2483 for (int i = 0; i < OperandCount(); ++i) { 2428 for (int i = 0; i < OperandCount(); ++i) {
2484 HValue* value = OperandAt(i); 2429 os << " " << NameOf(OperandAt(i)) << " ";
2485 stream->Add(" ");
2486 value->PrintNameTo(stream);
2487 stream->Add(" ");
2488 } 2430 }
2489 stream->Add(" uses:%d_%ds_%di_%dd_%dt", 2431 return os << " uses:" << UseCount() << "_"
2490 UseCount(), 2432 << smi_non_phi_uses() + smi_indirect_uses() << "s_"
2491 smi_non_phi_uses() + smi_indirect_uses(), 2433 << int32_non_phi_uses() + int32_indirect_uses() << "i_"
2492 int32_non_phi_uses() + int32_indirect_uses(), 2434 << double_non_phi_uses() + double_indirect_uses() << "d_"
2493 double_non_phi_uses() + double_indirect_uses(), 2435 << tagged_non_phi_uses() + tagged_indirect_uses() << "t"
2494 tagged_non_phi_uses() + tagged_indirect_uses()); 2436 << TypeOf(this) << "]";
2495 PrintTypeTo(stream);
2496 stream->Add("]");
2497 } 2437 }
2498 2438
2499 2439
2500 void HPhi::AddInput(HValue* value) { 2440 void HPhi::AddInput(HValue* value) {
2501 inputs_.Add(NULL, value->block()->zone()); 2441 inputs_.Add(NULL, value->block()->zone());
2502 SetOperandAt(OperandCount() - 1, value); 2442 SetOperandAt(OperandCount() - 1, value);
2503 // Mark phis that may have 'arguments' directly or indirectly as an operand. 2443 // Mark phis that may have 'arguments' directly or indirectly as an operand.
2504 if (!CheckFlag(kIsArguments) && value->CheckFlag(kIsArguments)) { 2444 if (!CheckFlag(kIsArguments) && value->CheckFlag(kIsArguments)) {
2505 SetFlag(kIsArguments); 2445 SetFlag(kIsArguments);
2506 } 2446 }
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
2608 AddPushedValue(from_values->at(i)); 2548 AddPushedValue(from_values->at(i));
2609 } 2549 }
2610 } 2550 }
2611 } 2551 }
2612 pop_count_ += from->pop_count_; 2552 pop_count_ += from->pop_count_;
2613 from->DeleteAndReplaceWith(NULL); 2553 from->DeleteAndReplaceWith(NULL);
2614 } 2554 }
2615 } 2555 }
2616 2556
2617 2557
2618 void HSimulate::PrintDataTo(StringStream* stream) { 2558 OStream& HSimulate::PrintDataTo(OStream& os) const { // NOLINT
2619 stream->Add("id=%d", ast_id().ToInt()); 2559 os << "id=" << ast_id().ToInt();
2620 if (pop_count_ > 0) stream->Add(" pop %d", pop_count_); 2560 if (pop_count_ > 0) os << " pop " << pop_count_;
2621 if (values_.length() > 0) { 2561 if (values_.length() > 0) {
2622 if (pop_count_ > 0) stream->Add(" /"); 2562 if (pop_count_ > 0) os << " /";
2623 for (int i = values_.length() - 1; i >= 0; --i) { 2563 for (int i = values_.length() - 1; i >= 0; --i) {
2624 if (HasAssignedIndexAt(i)) { 2564 if (HasAssignedIndexAt(i)) {
2625 stream->Add(" var[%d] = ", GetAssignedIndexAt(i)); 2565 os << " var[" << GetAssignedIndexAt(i) << "] = ";
2626 } else { 2566 } else {
2627 stream->Add(" push "); 2567 os << " push ";
2628 } 2568 }
2629 values_[i]->PrintNameTo(stream); 2569 os << NameOf(values_[i]);
2630 if (i > 0) stream->Add(","); 2570 if (i > 0) os << ",";
2631 } 2571 }
2632 } 2572 }
2573 return os;
2633 } 2574 }
2634 2575
2635 2576
2636 void HSimulate::ReplayEnvironment(HEnvironment* env) { 2577 void HSimulate::ReplayEnvironment(HEnvironment* env) {
2637 if (done_with_replay_) return; 2578 if (done_with_replay_) return;
2638 ASSERT(env != NULL); 2579 ASSERT(env != NULL);
2639 env->set_ast_id(ast_id()); 2580 env->set_ast_id(ast_id());
2640 env->Drop(pop_count()); 2581 env->Drop(pop_count());
2641 for (int i = values()->length() - 1; i >= 0; --i) { 2582 for (int i = values()->length() - 1; i >= 0; --i) {
2642 HValue* value = values()->at(i); 2583 HValue* value = values()->at(i);
(...skipping 26 matching lines...) Expand all
2669 // same capture id in the current and all outer environments. 2610 // same capture id in the current and all outer environments.
2670 void HCapturedObject::ReplayEnvironment(HEnvironment* env) { 2611 void HCapturedObject::ReplayEnvironment(HEnvironment* env) {
2671 ASSERT(env != NULL); 2612 ASSERT(env != NULL);
2672 while (env != NULL) { 2613 while (env != NULL) {
2673 ReplayEnvironmentNested(env->values(), this); 2614 ReplayEnvironmentNested(env->values(), this);
2674 env = env->outer(); 2615 env = env->outer();
2675 } 2616 }
2676 } 2617 }
2677 2618
2678 2619
2679 void HCapturedObject::PrintDataTo(StringStream* stream) { 2620 OStream& HCapturedObject::PrintDataTo(OStream& os) const { // NOLINT
2680 stream->Add("#%d ", capture_id()); 2621 os << "#" << capture_id() << " ";
2681 HDematerializedObject::PrintDataTo(stream); 2622 return HDematerializedObject::PrintDataTo(os);
2682 } 2623 }
2683 2624
2684 2625
2685 void HEnterInlined::RegisterReturnTarget(HBasicBlock* return_target, 2626 void HEnterInlined::RegisterReturnTarget(HBasicBlock* return_target,
2686 Zone* zone) { 2627 Zone* zone) {
2687 ASSERT(return_target->IsInlineReturnTarget()); 2628 ASSERT(return_target->IsInlineReturnTarget());
2688 return_targets_.Add(return_target, zone); 2629 return_targets_.Add(return_target, zone);
2689 } 2630 }
2690 2631
2691 2632
2692 void HEnterInlined::PrintDataTo(StringStream* stream) { 2633 OStream& HEnterInlined::PrintDataTo(OStream& os) const { // NOLINT
2693 SmartArrayPointer<char> name = function()->debug_name()->ToCString(); 2634 return os << function()->debug_name()->ToCString().get()
2694 stream->Add("%s, id=%d", name.get(), function()->id().ToInt()); 2635 << ", id=" << function()->id().ToInt();
2695 } 2636 }
2696 2637
2697 2638
2698 static bool IsInteger32(double value) { 2639 static bool IsInteger32(double value) {
2699 double roundtrip_value = static_cast<double>(static_cast<int32_t>(value)); 2640 double roundtrip_value = static_cast<double>(static_cast<int32_t>(value));
2700 return BitCast<int64_t>(roundtrip_value) == BitCast<int64_t>(value); 2641 return BitCast<int64_t>(roundtrip_value) == BitCast<int64_t>(value);
2701 } 2642 }
2702 2643
2703 2644
2704 HConstant::HConstant(Handle<Object> object, Representation r) 2645 HConstant::HConstant(Handle<Object> object, Representation r)
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after
2965 new(zone) HConstant(1) : new(zone) HConstant(0); 2906 new(zone) HConstant(1) : new(zone) HConstant(0);
2966 } else if (handle->IsUndefined()) { 2907 } else if (handle->IsUndefined()) {
2967 res = new(zone) HConstant(base::OS::nan_value()); 2908 res = new(zone) HConstant(base::OS::nan_value());
2968 } else if (handle->IsNull()) { 2909 } else if (handle->IsNull()) {
2969 res = new(zone) HConstant(0); 2910 res = new(zone) HConstant(0);
2970 } 2911 }
2971 return Maybe<HConstant*>(res != NULL, res); 2912 return Maybe<HConstant*>(res != NULL, res);
2972 } 2913 }
2973 2914
2974 2915
2975 void HConstant::PrintDataTo(StringStream* stream) { 2916 OStream& HConstant::PrintDataTo(OStream& os) const { // NOLINT
2976 if (has_int32_value_) { 2917 if (has_int32_value_) {
2977 stream->Add("%d ", int32_value_); 2918 os << int32_value_ << " ";
2978 } else if (has_double_value_) { 2919 } else if (has_double_value_) {
2979 stream->Add("%f ", FmtElm(double_value_)); 2920 os << double_value_ << " ";
2980 } else if (has_external_reference_value_) { 2921 } else if (has_external_reference_value_) {
2981 stream->Add("%p ", reinterpret_cast<void*>( 2922 os << reinterpret_cast<void*>(external_reference_value_.address()) << " ";
2982 external_reference_value_.address()));
2983 } else { 2923 } else {
2984 handle(Isolate::Current())->ShortPrint(stream); 2924 // The handle() method is silently and lazily mutating the object.
2985 stream->Add(" "); 2925 Handle<Object> h = const_cast<HConstant*>(this)->handle(Isolate::Current());
2986 if (HasStableMapValue()) { 2926 os << Brief(*h) << " ";
2987 stream->Add("[stable-map] "); 2927 if (HasStableMapValue()) os << "[stable-map] ";
2988 } 2928 if (HasObjectMap()) os << "[map " << *ObjectMap().handle() << "] ";
2989 if (HasObjectMap()) {
2990 stream->Add("[map %p] ", *ObjectMap().handle());
2991 }
2992 } 2929 }
2993 if (!is_not_in_new_space_) { 2930 if (!is_not_in_new_space_) os << "[new space] ";
2994 stream->Add("[new space] "); 2931 return os;
2995 }
2996 } 2932 }
2997 2933
2998 2934
2999 void HBinaryOperation::PrintDataTo(StringStream* stream) { 2935 OStream& HBinaryOperation::PrintDataTo(OStream& os) const { // NOLINT
3000 left()->PrintNameTo(stream); 2936 os << NameOf(left()) << " " << NameOf(right());
3001 stream->Add(" "); 2937 if (CheckFlag(kCanOverflow)) os << " !";
3002 right()->PrintNameTo(stream); 2938 if (CheckFlag(kBailoutOnMinusZero)) os << " -0?";
3003 if (CheckFlag(kCanOverflow)) stream->Add(" !"); 2939 return os;
3004 if (CheckFlag(kBailoutOnMinusZero)) stream->Add(" -0?");
3005 } 2940 }
3006 2941
3007 2942
3008 void HBinaryOperation::InferRepresentation(HInferRepresentationPhase* h_infer) { 2943 void HBinaryOperation::InferRepresentation(HInferRepresentationPhase* h_infer) {
3009 ASSERT(CheckFlag(kFlexibleRepresentation)); 2944 ASSERT(CheckFlag(kFlexibleRepresentation));
3010 Representation new_rep = RepresentationFromInputs(); 2945 Representation new_rep = RepresentationFromInputs();
3011 UpdateRepresentation(new_rep, h_infer, "inputs"); 2946 UpdateRepresentation(new_rep, h_infer, "inputs");
3012 2947
3013 if (representation().IsSmi() && HasNonSmiUse()) { 2948 if (representation().IsSmi() && HasNonSmiUse()) {
3014 UpdateRepresentation( 2949 UpdateRepresentation(
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after
3217 case EXTERNAL_INT16_ELEMENTS: 3152 case EXTERNAL_INT16_ELEMENTS:
3218 return new(zone) Range(kMinInt16, kMaxInt16); 3153 return new(zone) Range(kMinInt16, kMaxInt16);
3219 case EXTERNAL_UINT16_ELEMENTS: 3154 case EXTERNAL_UINT16_ELEMENTS:
3220 return new(zone) Range(kMinUInt16, kMaxUInt16); 3155 return new(zone) Range(kMinUInt16, kMaxUInt16);
3221 default: 3156 default:
3222 return HValue::InferRange(zone); 3157 return HValue::InferRange(zone);
3223 } 3158 }
3224 } 3159 }
3225 3160
3226 3161
3227 void HCompareGeneric::PrintDataTo(StringStream* stream) { 3162 OStream& HCompareGeneric::PrintDataTo(OStream& os) const { // NOLINT
3228 stream->Add(Token::Name(token())); 3163 os << Token::Name(token()) << " ";
3229 stream->Add(" "); 3164 return HBinaryOperation::PrintDataTo(os);
3230 HBinaryOperation::PrintDataTo(stream);
3231 } 3165 }
3232 3166
3233 3167
3234 void HStringCompareAndBranch::PrintDataTo(StringStream* stream) { 3168 OStream& HStringCompareAndBranch::PrintDataTo(OStream& os) const { // NOLINT
3235 stream->Add(Token::Name(token())); 3169 os << Token::Name(token()) << " ";
3236 stream->Add(" "); 3170 return HControlInstruction::PrintDataTo(os);
3237 HControlInstruction::PrintDataTo(stream);
3238 } 3171 }
3239 3172
3240 3173
3241 void HCompareNumericAndBranch::PrintDataTo(StringStream* stream) { 3174 OStream& HCompareNumericAndBranch::PrintDataTo(OStream& os) const { // NOLINT
3242 stream->Add(Token::Name(token())); 3175 os << Token::Name(token()) << " " << NameOf(left()) << " " << NameOf(right());
3243 stream->Add(" "); 3176 return HControlInstruction::PrintDataTo(os);
3244 left()->PrintNameTo(stream);
3245 stream->Add(" ");
3246 right()->PrintNameTo(stream);
3247 HControlInstruction::PrintDataTo(stream);
3248 } 3177 }
3249 3178
3250 3179
3251 void HCompareObjectEqAndBranch::PrintDataTo(StringStream* stream) { 3180 OStream& HCompareObjectEqAndBranch::PrintDataTo(OStream& os) const { // NOLINT
3252 left()->PrintNameTo(stream); 3181 os << NameOf(left()) << " " << NameOf(right());
3253 stream->Add(" "); 3182 return HControlInstruction::PrintDataTo(os);
3254 right()->PrintNameTo(stream);
3255 HControlInstruction::PrintDataTo(stream);
3256 } 3183 }
3257 3184
3258 3185
3259 bool HCompareObjectEqAndBranch::KnownSuccessorBlock(HBasicBlock** block) { 3186 bool HCompareObjectEqAndBranch::KnownSuccessorBlock(HBasicBlock** block) {
3260 if (known_successor_index() != kNoKnownSuccessorIndex) { 3187 if (known_successor_index() != kNoKnownSuccessorIndex) {
3261 *block = SuccessorAt(known_successor_index()); 3188 *block = SuccessorAt(known_successor_index());
3262 return true; 3189 return true;
3263 } 3190 }
3264 if (FLAG_fold_constants && left()->IsConstant() && right()->IsConstant()) { 3191 if (FLAG_fold_constants && left()->IsConstant() && right()->IsConstant()) {
3265 *block = HConstant::cast(left())->DataEquals(HConstant::cast(right())) 3192 *block = HConstant::cast(left())->DataEquals(HConstant::cast(right()))
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
3383 return false; 3310 return false;
3384 } 3311 }
3385 3312
3386 3313
3387 void HCompareMinusZeroAndBranch::InferRepresentation( 3314 void HCompareMinusZeroAndBranch::InferRepresentation(
3388 HInferRepresentationPhase* h_infer) { 3315 HInferRepresentationPhase* h_infer) {
3389 ChangeRepresentation(value()->representation()); 3316 ChangeRepresentation(value()->representation());
3390 } 3317 }
3391 3318
3392 3319
3393 3320 OStream& HGoto::PrintDataTo(OStream& os) const { // NOLINT
3394 void HGoto::PrintDataTo(StringStream* stream) { 3321 return os << *SuccessorAt(0);
3395 stream->Add("B%d", SuccessorAt(0)->block_id());
3396 } 3322 }
3397 3323
3398 3324
3399 void HCompareNumericAndBranch::InferRepresentation( 3325 void HCompareNumericAndBranch::InferRepresentation(
3400 HInferRepresentationPhase* h_infer) { 3326 HInferRepresentationPhase* h_infer) {
3401 Representation left_rep = left()->representation(); 3327 Representation left_rep = left()->representation();
3402 Representation right_rep = right()->representation(); 3328 Representation right_rep = right()->representation();
3403 Representation observed_left = observed_input_representation(0); 3329 Representation observed_left = observed_input_representation(0);
3404 Representation observed_right = observed_input_representation(1); 3330 Representation observed_right = observed_input_representation(1);
3405 3331
(...skipping 22 matching lines...) Expand all
3428 // comparisons must cause a deopt when one of their arguments is undefined. 3354 // comparisons must cause a deopt when one of their arguments is undefined.
3429 // See also v8:1434 3355 // See also v8:1434
3430 if (Token::IsOrderedRelationalCompareOp(token_)) { 3356 if (Token::IsOrderedRelationalCompareOp(token_)) {
3431 SetFlag(kAllowUndefinedAsNaN); 3357 SetFlag(kAllowUndefinedAsNaN);
3432 } 3358 }
3433 } 3359 }
3434 ChangeRepresentation(rep); 3360 ChangeRepresentation(rep);
3435 } 3361 }
3436 3362
3437 3363
3438 void HParameter::PrintDataTo(StringStream* stream) { 3364 OStream& HParameter::PrintDataTo(OStream& os) const { // NOLINT
3439 stream->Add("%u", index()); 3365 return os << index();
3440 } 3366 }
3441 3367
3442 3368
3443 void HLoadNamedField::PrintDataTo(StringStream* stream) { 3369 OStream& HLoadNamedField::PrintDataTo(OStream& os) const { // NOLINT
3444 object()->PrintNameTo(stream); 3370 os << NameOf(object()) << access_;
3445 access_.PrintTo(stream);
3446 3371
3447 if (maps() != NULL) { 3372 if (maps() != NULL) {
3448 stream->Add(" [%p", *maps()->at(0).handle()); 3373 os << " [" << *maps()->at(0).handle();
3449 for (int i = 1; i < maps()->size(); ++i) { 3374 for (int i = 1; i < maps()->size(); ++i) {
3450 stream->Add(",%p", *maps()->at(i).handle()); 3375 os << "," << *maps()->at(i).handle();
3451 } 3376 }
3452 stream->Add("]"); 3377 os << "]";
3453 } 3378 }
3454 3379
3455 if (HasDependency()) { 3380 if (HasDependency()) os << " " << NameOf(dependency());
3456 stream->Add(" "); 3381 return os;
3457 dependency()->PrintNameTo(stream);
3458 }
3459 } 3382 }
3460 3383
3461 3384
3462 void HLoadNamedGeneric::PrintDataTo(StringStream* stream) { 3385 OStream& HLoadNamedGeneric::PrintDataTo(OStream& os) const { // NOLINT
3463 object()->PrintNameTo(stream); 3386 Handle<String> n = Handle<String>::cast(name());
3464 stream->Add("."); 3387 return os << NameOf(object()) << "." << n->ToCString().get();
3465 stream->Add(String::cast(*name())->ToCString().get());
3466 } 3388 }
3467 3389
3468 3390
3469 void HLoadKeyed::PrintDataTo(StringStream* stream) { 3391 OStream& HLoadKeyed::PrintDataTo(OStream& os) const { // NOLINT
3470 if (!is_external()) { 3392 if (!is_external()) {
3471 elements()->PrintNameTo(stream); 3393 os << NameOf(elements());
3472 } else { 3394 } else {
3473 ASSERT(elements_kind() >= FIRST_EXTERNAL_ARRAY_ELEMENTS_KIND && 3395 ASSERT(elements_kind() >= FIRST_EXTERNAL_ARRAY_ELEMENTS_KIND &&
3474 elements_kind() <= LAST_EXTERNAL_ARRAY_ELEMENTS_KIND); 3396 elements_kind() <= LAST_EXTERNAL_ARRAY_ELEMENTS_KIND);
3475 elements()->PrintNameTo(stream); 3397 os << NameOf(elements()) << "." << ElementsKindToString(elements_kind());
3476 stream->Add(".");
3477 stream->Add(ElementsKindToString(elements_kind()));
3478 } 3398 }
3479 3399
3480 stream->Add("["); 3400 os << "[" << NameOf(key());
3481 key()->PrintNameTo(stream); 3401 if (IsDehoisted()) os << " + " << base_offset();
3482 if (IsDehoisted()) { 3402 os << "]";
3483 stream->Add(" + %d]", base_offset());
3484 } else {
3485 stream->Add("]");
3486 }
3487 3403
3488 if (HasDependency()) { 3404 if (HasDependency()) os << " " << NameOf(dependency());
3489 stream->Add(" "); 3405 if (RequiresHoleCheck()) os << " check_hole";
3490 dependency()->PrintNameTo(stream); 3406 return os;
3491 }
3492
3493 if (RequiresHoleCheck()) {
3494 stream->Add(" check_hole");
3495 }
3496 } 3407 }
3497 3408
3498 3409
3499 bool HLoadKeyed::TryIncreaseBaseOffset(uint32_t increase_by_value) { 3410 bool HLoadKeyed::TryIncreaseBaseOffset(uint32_t increase_by_value) {
3500 // The base offset is usually simply the size of the array header, except 3411 // The base offset is usually simply the size of the array header, except
3501 // with dehoisting adds an addition offset due to a array index key 3412 // with dehoisting adds an addition offset due to a array index key
3502 // manipulation, in which case it becomes (array header size + 3413 // manipulation, in which case it becomes (array header size +
3503 // constant-offset-from-key * kPointerSize) 3414 // constant-offset-from-key * kPointerSize)
3504 uint32_t base_offset = BaseOffsetField::decode(bit_field_); 3415 uint32_t base_offset = BaseOffsetField::decode(bit_field_);
3505 v8::base::internal::CheckedNumeric<uint32_t> addition_result = base_offset; 3416 v8::base::internal::CheckedNumeric<uint32_t> addition_result = base_offset;
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
3558 } 3469 }
3559 3470
3560 if (IsExternalArrayElementsKind(elements_kind())) { 3471 if (IsExternalArrayElementsKind(elements_kind())) {
3561 return false; 3472 return false;
3562 } 3473 }
3563 3474
3564 return !UsesMustHandleHole(); 3475 return !UsesMustHandleHole();
3565 } 3476 }
3566 3477
3567 3478
3568 void HLoadKeyedGeneric::PrintDataTo(StringStream* stream) { 3479 OStream& HLoadKeyedGeneric::PrintDataTo(OStream& os) const { // NOLINT
3569 object()->PrintNameTo(stream); 3480 return os << NameOf(object()) << "[" << NameOf(key()) << "]";
3570 stream->Add("[");
3571 key()->PrintNameTo(stream);
3572 stream->Add("]");
3573 } 3481 }
3574 3482
3575 3483
3576 HValue* HLoadKeyedGeneric::Canonicalize() { 3484 HValue* HLoadKeyedGeneric::Canonicalize() {
3577 // Recognize generic keyed loads that use property name generated 3485 // Recognize generic keyed loads that use property name generated
3578 // by for-in statement as a key and rewrite them into fast property load 3486 // by for-in statement as a key and rewrite them into fast property load
3579 // by index. 3487 // by index.
3580 if (key()->IsLoadKeyed()) { 3488 if (key()->IsLoadKeyed()) {
3581 HLoadKeyed* key_load = HLoadKeyed::cast(key()); 3489 HLoadKeyed* key_load = HLoadKeyed::cast(key());
3582 if (key_load->elements()->IsForInCacheArray()) { 3490 if (key_load->elements()->IsForInCacheArray()) {
(...skipping 20 matching lines...) Expand all
3603 return Prepend(new(block()->zone()) HLoadFieldByIndex( 3511 return Prepend(new(block()->zone()) HLoadFieldByIndex(
3604 object(), index)); 3512 object(), index));
3605 } 3513 }
3606 } 3514 }
3607 } 3515 }
3608 3516
3609 return this; 3517 return this;
3610 } 3518 }
3611 3519
3612 3520
3613 void HStoreNamedGeneric::PrintDataTo(StringStream* stream) { 3521 OStream& HStoreNamedGeneric::PrintDataTo(OStream& os) const { // NOLINT
3614 object()->PrintNameTo(stream); 3522 Handle<String> n = Handle<String>::cast(name());
3615 stream->Add("."); 3523 return os << NameOf(object()) << "." << n->ToCString().get() << " = "
3616 ASSERT(name()->IsString()); 3524 << NameOf(value());
3617 stream->Add(String::cast(*name())->ToCString().get());
3618 stream->Add(" = ");
3619 value()->PrintNameTo(stream);
3620 } 3525 }
3621 3526
3622 3527
3623 void HStoreNamedField::PrintDataTo(StringStream* stream) { 3528 OStream& HStoreNamedField::PrintDataTo(OStream& os) const { // NOLINT
3624 object()->PrintNameTo(stream); 3529 os << NameOf(object()) << access_ << " = " << NameOf(value());
3625 access_.PrintTo(stream); 3530 if (NeedsWriteBarrier()) os << " (write-barrier)";
3626 stream->Add(" = "); 3531 if (has_transition()) os << " (transition map " << *transition_map() << ")";
3627 value()->PrintNameTo(stream); 3532 return os;
3628 if (NeedsWriteBarrier()) {
3629 stream->Add(" (write-barrier)");
3630 }
3631 if (has_transition()) {
3632 stream->Add(" (transition map %p)", *transition_map());
3633 }
3634 } 3533 }
3635 3534
3636 3535
3637 void HStoreKeyed::PrintDataTo(StringStream* stream) { 3536 OStream& HStoreKeyed::PrintDataTo(OStream& os) const { // NOLINT
3638 if (!is_external()) { 3537 if (!is_external()) {
3639 elements()->PrintNameTo(stream); 3538 os << NameOf(elements());
3640 } else { 3539 } else {
3641 elements()->PrintNameTo(stream);
3642 stream->Add(".");
3643 stream->Add(ElementsKindToString(elements_kind()));
3644 ASSERT(elements_kind() >= FIRST_EXTERNAL_ARRAY_ELEMENTS_KIND && 3540 ASSERT(elements_kind() >= FIRST_EXTERNAL_ARRAY_ELEMENTS_KIND &&
3645 elements_kind() <= LAST_EXTERNAL_ARRAY_ELEMENTS_KIND); 3541 elements_kind() <= LAST_EXTERNAL_ARRAY_ELEMENTS_KIND);
3542 os << NameOf(elements()) << "." << ElementsKindToString(elements_kind());
3646 } 3543 }
3647 3544
3648 stream->Add("["); 3545 os << "[" << NameOf(key());
3649 key()->PrintNameTo(stream); 3546 if (IsDehoisted()) os << " + " << base_offset();
3650 if (IsDehoisted()) { 3547 return os << "] = " << NameOf(value());
3651 stream->Add(" + %d] = ", base_offset());
3652 } else {
3653 stream->Add("] = ");
3654 }
3655
3656 value()->PrintNameTo(stream);
3657 } 3548 }
3658 3549
3659 3550
3660 void HStoreKeyedGeneric::PrintDataTo(StringStream* stream) { 3551 OStream& HStoreKeyedGeneric::PrintDataTo(OStream& os) const { // NOLINT
3661 object()->PrintNameTo(stream); 3552 return os << NameOf(object()) << "[" << NameOf(key())
3662 stream->Add("["); 3553 << "] = " << NameOf(value());
3663 key()->PrintNameTo(stream);
3664 stream->Add("] = ");
3665 value()->PrintNameTo(stream);
3666 } 3554 }
3667 3555
3668 3556
3669 void HTransitionElementsKind::PrintDataTo(StringStream* stream) { 3557 OStream& HTransitionElementsKind::PrintDataTo(OStream& os) const { // NOLINT
3670 object()->PrintNameTo(stream); 3558 os << NameOf(object());
3671 ElementsKind from_kind = original_map().handle()->elements_kind(); 3559 ElementsKind from_kind = original_map().handle()->elements_kind();
3672 ElementsKind to_kind = transitioned_map().handle()->elements_kind(); 3560 ElementsKind to_kind = transitioned_map().handle()->elements_kind();
3673 stream->Add(" %p [%s] -> %p [%s]", 3561 os << " " << *original_map().handle() << " ["
3674 *original_map().handle(), 3562 << ElementsAccessor::ForKind(from_kind)->name() << "] -> "
3675 ElementsAccessor::ForKind(from_kind)->name(), 3563 << *transitioned_map().handle() << " ["
3676 *transitioned_map().handle(), 3564 << ElementsAccessor::ForKind(to_kind)->name() << "]";
3677 ElementsAccessor::ForKind(to_kind)->name()); 3565 if (IsSimpleMapChangeTransition(from_kind, to_kind)) os << " (simple)";
3678 if (IsSimpleMapChangeTransition(from_kind, to_kind)) stream->Add(" (simple)"); 3566 return os;
3679 } 3567 }
3680 3568
3681 3569
3682 void HLoadGlobalCell::PrintDataTo(StringStream* stream) { 3570 OStream& HLoadGlobalCell::PrintDataTo(OStream& os) const { // NOLINT
3683 stream->Add("[%p]", *cell().handle()); 3571 os << "[" << *cell().handle() << "]";
3684 if (!details_.IsDontDelete()) stream->Add(" (deleteable)"); 3572 if (!details_.IsDontDelete()) os << " (deleteable)";
3685 if (details_.IsReadOnly()) stream->Add(" (read-only)"); 3573 if (details_.IsReadOnly()) os << " (read-only)";
3574 return os;
3686 } 3575 }
3687 3576
3688 3577
3689 bool HLoadGlobalCell::RequiresHoleCheck() const { 3578 bool HLoadGlobalCell::RequiresHoleCheck() const {
3690 if (details_.IsDontDelete() && !details_.IsReadOnly()) return false; 3579 if (details_.IsDontDelete() && !details_.IsReadOnly()) return false;
3691 for (HUseIterator it(uses()); !it.Done(); it.Advance()) { 3580 for (HUseIterator it(uses()); !it.Done(); it.Advance()) {
3692 HValue* use = it.value(); 3581 HValue* use = it.value();
3693 if (!use->IsChange()) return true; 3582 if (!use->IsChange()) return true;
3694 } 3583 }
3695 return false; 3584 return false;
3696 } 3585 }
3697 3586
3698 3587
3699 void HLoadGlobalGeneric::PrintDataTo(StringStream* stream) { 3588 OStream& HLoadGlobalGeneric::PrintDataTo(OStream& os) const { // NOLINT
3700 stream->Add("%o ", *name()); 3589 return os << name()->ToCString().get() << " ";
3701 } 3590 }
3702 3591
3703 3592
3704 void HInnerAllocatedObject::PrintDataTo(StringStream* stream) { 3593 OStream& HInnerAllocatedObject::PrintDataTo(OStream& os) const { // NOLINT
3705 base_object()->PrintNameTo(stream); 3594 os << NameOf(base_object()) << " offset ";
3706 stream->Add(" offset "); 3595 return offset()->PrintTo(os);
3707 offset()->PrintTo(stream);
3708 } 3596 }
3709 3597
3710 3598
3711 void HStoreGlobalCell::PrintDataTo(StringStream* stream) { 3599 OStream& HStoreGlobalCell::PrintDataTo(OStream& os) const { // NOLINT
3712 stream->Add("[%p] = ", *cell().handle()); 3600 os << "[" << *cell().handle() << "] = " << NameOf(value());
3713 value()->PrintNameTo(stream); 3601 if (!details_.IsDontDelete()) os << " (deleteable)";
3714 if (!details_.IsDontDelete()) stream->Add(" (deleteable)"); 3602 if (details_.IsReadOnly()) os << " (read-only)";
3715 if (details_.IsReadOnly()) stream->Add(" (read-only)"); 3603 return os;
3716 } 3604 }
3717 3605
3718 3606
3719 void HLoadContextSlot::PrintDataTo(StringStream* stream) { 3607 OStream& HLoadContextSlot::PrintDataTo(OStream& os) const { // NOLINT
3720 value()->PrintNameTo(stream); 3608 return os << NameOf(value()) << "[" << slot_index() << "]";
3721 stream->Add("[%d]", slot_index());
3722 } 3609 }
3723 3610
3724 3611
3725 void HStoreContextSlot::PrintDataTo(StringStream* stream) { 3612 OStream& HStoreContextSlot::PrintDataTo(OStream& os) const { // NOLINT
3726 context()->PrintNameTo(stream); 3613 return os << NameOf(context()) << "[" << slot_index()
3727 stream->Add("[%d] = ", slot_index()); 3614 << "] = " << NameOf(value());
3728 value()->PrintNameTo(stream);
3729 } 3615 }
3730 3616
3731 3617
3732 // Implementation of type inference and type conversions. Calculates 3618 // Implementation of type inference and type conversions. Calculates
3733 // the inferred type of this instruction based on the input operands. 3619 // the inferred type of this instruction based on the input operands.
3734 3620
3735 HType HValue::CalculateInferredType() { 3621 HType HValue::CalculateInferredType() {
3736 return type_; 3622 return type_;
3737 } 3623 }
3738 3624
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after
4071 HObjectAccess::ForObservableJSObjectOffset(offset); 3957 HObjectAccess::ForObservableJSObjectOffset(offset);
4072 HStoreNamedField* clear_next_map = 3958 HStoreNamedField* clear_next_map =
4073 HStoreNamedField::New(zone, context(), this, access, 3959 HStoreNamedField::New(zone, context(), this, access,
4074 block()->graph()->GetConstant0()); 3960 block()->graph()->GetConstant0());
4075 clear_next_map->ClearAllSideEffects(); 3961 clear_next_map->ClearAllSideEffects();
4076 clear_next_map->InsertAfter(this); 3962 clear_next_map->InsertAfter(this);
4077 } 3963 }
4078 } 3964 }
4079 3965
4080 3966
4081 void HAllocate::PrintDataTo(StringStream* stream) { 3967 OStream& HAllocate::PrintDataTo(OStream& os) const { // NOLINT
4082 size()->PrintNameTo(stream); 3968 os << NameOf(size()) << " (";
4083 stream->Add(" ("); 3969 if (IsNewSpaceAllocation()) os << "N";
4084 if (IsNewSpaceAllocation()) stream->Add("N"); 3970 if (IsOldPointerSpaceAllocation()) os << "P";
4085 if (IsOldPointerSpaceAllocation()) stream->Add("P"); 3971 if (IsOldDataSpaceAllocation()) os << "D";
4086 if (IsOldDataSpaceAllocation()) stream->Add("D"); 3972 if (MustAllocateDoubleAligned()) os << "A";
4087 if (MustAllocateDoubleAligned()) stream->Add("A"); 3973 if (MustPrefillWithFiller()) os << "F";
4088 if (MustPrefillWithFiller()) stream->Add("F"); 3974 return os << ")";
4089 stream->Add(")");
4090 } 3975 }
4091 3976
4092 3977
4093 bool HStoreKeyed::TryIncreaseBaseOffset(uint32_t increase_by_value) { 3978 bool HStoreKeyed::TryIncreaseBaseOffset(uint32_t increase_by_value) {
4094 // The base offset is usually simply the size of the array header, except 3979 // The base offset is usually simply the size of the array header, except
4095 // with dehoisting adds an addition offset due to a array index key 3980 // with dehoisting adds an addition offset due to a array index key
4096 // manipulation, in which case it becomes (array header size + 3981 // manipulation, in which case it becomes (array header size +
4097 // constant-offset-from-key * kPointerSize) 3982 // constant-offset-from-key * kPointerSize)
4098 v8::base::internal::CheckedNumeric<uint32_t> addition_result = base_offset_; 3983 v8::base::internal::CheckedNumeric<uint32_t> addition_result = base_offset_;
4099 addition_result += increase_by_value; 3984 addition_result += increase_by_value;
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
4182 ASSERT(!concat.is_null()); 4067 ASSERT(!concat.is_null());
4183 return HConstant::New(zone, context, concat); 4068 return HConstant::New(zone, context, concat);
4184 } 4069 }
4185 } 4070 }
4186 } 4071 }
4187 return new(zone) HStringAdd( 4072 return new(zone) HStringAdd(
4188 context, left, right, pretenure_flag, flags, allocation_site); 4073 context, left, right, pretenure_flag, flags, allocation_site);
4189 } 4074 }
4190 4075
4191 4076
4192 void HStringAdd::PrintDataTo(StringStream* stream) { 4077 OStream& HStringAdd::PrintDataTo(OStream& os) const { // NOLINT
4193 if ((flags() & STRING_ADD_CHECK_BOTH) == STRING_ADD_CHECK_BOTH) { 4078 if ((flags() & STRING_ADD_CHECK_BOTH) == STRING_ADD_CHECK_BOTH) {
4194 stream->Add("_CheckBoth"); 4079 os << "_CheckBoth";
4195 } else if ((flags() & STRING_ADD_CHECK_BOTH) == STRING_ADD_CHECK_LEFT) { 4080 } else if ((flags() & STRING_ADD_CHECK_BOTH) == STRING_ADD_CHECK_LEFT) {
4196 stream->Add("_CheckLeft"); 4081 os << "_CheckLeft";
4197 } else if ((flags() & STRING_ADD_CHECK_BOTH) == STRING_ADD_CHECK_RIGHT) { 4082 } else if ((flags() & STRING_ADD_CHECK_BOTH) == STRING_ADD_CHECK_RIGHT) {
4198 stream->Add("_CheckRight"); 4083 os << "_CheckRight";
4199 } 4084 }
4200 HBinaryOperation::PrintDataTo(stream); 4085 HBinaryOperation::PrintDataTo(os);
4201 stream->Add(" ("); 4086 os << " (";
4202 if (pretenure_flag() == NOT_TENURED) stream->Add("N"); 4087 if (pretenure_flag() == NOT_TENURED)
4203 else if (pretenure_flag() == TENURED) stream->Add("D"); 4088 os << "N";
4204 stream->Add(")"); 4089 else if (pretenure_flag() == TENURED)
4090 os << "D";
4091 return os << ")";
4205 } 4092 }
4206 4093
4207 4094
4208 HInstruction* HStringCharFromCode::New( 4095 HInstruction* HStringCharFromCode::New(
4209 Zone* zone, HValue* context, HValue* char_code) { 4096 Zone* zone, HValue* context, HValue* char_code) {
4210 if (FLAG_fold_constants && char_code->IsConstant()) { 4097 if (FLAG_fold_constants && char_code->IsConstant()) {
4211 HConstant* c_code = HConstant::cast(char_code); 4098 HConstant* c_code = HConstant::cast(char_code);
4212 Isolate* isolate = zone->isolate(); 4099 Isolate* isolate = zone->isolate();
4213 if (c_code->HasNumberValue()) { 4100 if (c_code->HasNumberValue()) {
4214 if (std::isfinite(c_code->DoubleValue())) { 4101 if (std::isfinite(c_code->DoubleValue())) {
(...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after
4513 } 4400 }
4514 } 4401 }
4515 return new(zone) HSeqStringGetChar(encoding, string, index); 4402 return new(zone) HSeqStringGetChar(encoding, string, index);
4516 } 4403 }
4517 4404
4518 4405
4519 #undef H_CONSTANT_INT 4406 #undef H_CONSTANT_INT
4520 #undef H_CONSTANT_DOUBLE 4407 #undef H_CONSTANT_DOUBLE
4521 4408
4522 4409
4523 void HBitwise::PrintDataTo(StringStream* stream) { 4410 OStream& HBitwise::PrintDataTo(OStream& os) const { // NOLINT
4524 stream->Add(Token::Name(op_)); 4411 os << Token::Name(op_) << " ";
4525 stream->Add(" "); 4412 return HBitwiseBinaryOperation::PrintDataTo(os);
4526 HBitwiseBinaryOperation::PrintDataTo(stream);
4527 } 4413 }
4528 4414
4529 4415
4530 void HPhi::SimplifyConstantInputs() { 4416 void HPhi::SimplifyConstantInputs() {
4531 // Convert constant inputs to integers when all uses are truncating. 4417 // Convert constant inputs to integers when all uses are truncating.
4532 // This must happen before representation inference takes place. 4418 // This must happen before representation inference takes place.
4533 if (!CheckUsesForFlag(kTruncatingToInt32)) return; 4419 if (!CheckUsesForFlag(kTruncatingToInt32)) return;
4534 for (int i = 0; i < OperandCount(); ++i) { 4420 for (int i = 0; i < OperandCount(); ++i) {
4535 if (!OperandAt(i)->IsConstant()) return; 4421 if (!OperandAt(i)->IsConstant()) return;
4536 } 4422 }
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after
4845 if (access_type == STORE) { 4731 if (access_type == STORE) {
4846 instr->SetChangesFlag(::v8::internal::kExternalMemory); 4732 instr->SetChangesFlag(::v8::internal::kExternalMemory);
4847 } else { 4733 } else {
4848 instr->SetDependsOnFlag(::v8::internal::kExternalMemory); 4734 instr->SetDependsOnFlag(::v8::internal::kExternalMemory);
4849 } 4735 }
4850 break; 4736 break;
4851 } 4737 }
4852 } 4738 }
4853 4739
4854 4740
4855 void HObjectAccess::PrintTo(StringStream* stream) const { 4741 OStream& operator<<(OStream& os, const HObjectAccess& access) {
4856 stream->Add("."); 4742 os << ".";
4857 4743
4858 switch (portion()) { 4744 switch (access.portion()) {
4859 case kArrayLengths: 4745 case HObjectAccess::kArrayLengths:
4860 case kStringLengths: 4746 case HObjectAccess::kStringLengths:
4861 stream->Add("%length"); 4747 os << "%length";
4862 break; 4748 break;
4863 case kElementsPointer: 4749 case HObjectAccess::kElementsPointer:
4864 stream->Add("%elements"); 4750 os << "%elements";
4865 break; 4751 break;
4866 case kMaps: 4752 case HObjectAccess::kMaps:
4867 stream->Add("%map"); 4753 os << "%map";
4868 break; 4754 break;
4869 case kDouble: // fall through 4755 case HObjectAccess::kDouble: // fall through
4870 case kInobject: 4756 case HObjectAccess::kInobject:
4871 if (!name_.is_null()) { 4757 if (!access.name().is_null()) {
4872 stream->Add(String::cast(*name_)->ToCString().get()); 4758 os << Handle<String>::cast(access.name())->ToCString().get();
4873 } 4759 }
4874 stream->Add("[in-object]"); 4760 os << "[in-object]";
4875 break; 4761 break;
4876 case kBackingStore: 4762 case HObjectAccess::kBackingStore:
4877 if (!name_.is_null()) { 4763 if (!access.name().is_null()) {
4878 stream->Add(String::cast(*name_)->ToCString().get()); 4764 os << Handle<String>::cast(access.name())->ToCString().get();
4879 } 4765 }
4880 stream->Add("[backing-store]"); 4766 os << "[backing-store]";
4881 break; 4767 break;
4882 case kExternalMemory: 4768 case HObjectAccess::kExternalMemory:
4883 stream->Add("[external-memory]"); 4769 os << "[external-memory]";
4884 break; 4770 break;
4885 } 4771 }
4886 4772
4887 stream->Add("@%d", offset()); 4773 return os << "@" << access.offset();
4888 } 4774 }
4889 4775
4890 } } // namespace v8::internal 4776 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/hydrogen-instructions.h ('k') | src/hydrogen-types.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698