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

Side by Side Diff: src/hydrogen.h

Issue 82943005: Safe HGraphBuilder::Add<> and New<> (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 1 month 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/code-stubs-hydrogen.cc ('k') | src/hydrogen.cc » ('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 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 1039 matching lines...) Expand 10 before | Expand all | Expand 10 after
1050 block->AddLeaveInlined(return_value, state, position_); 1050 block->AddLeaveInlined(return_value, state, position_);
1051 } 1051 }
1052 void AddLeaveInlined(HValue* return_value, FunctionState* state) { 1052 void AddLeaveInlined(HValue* return_value, FunctionState* state) {
1053 return AddLeaveInlined(current_block(), return_value, state); 1053 return AddLeaveInlined(current_block(), return_value, state);
1054 } 1054 }
1055 1055
1056 template<class I> 1056 template<class I>
1057 HInstruction* NewUncasted() { return I::New(zone(), context()); } 1057 HInstruction* NewUncasted() { return I::New(zone(), context()); }
1058 1058
1059 template<class I> 1059 template<class I>
1060 I* New() { return I::cast(NewUncasted<I>()); } 1060 I* New() { return I::New(zone(), context()); }
1061 1061
1062 template<class I> 1062 template<class I>
1063 HInstruction* AddUncasted() { return AddInstruction(NewUncasted<I>());} 1063 HInstruction* AddUncasted() { return AddInstruction(NewUncasted<I>());}
1064 1064
1065 template<class I> 1065 template<class I>
1066 I* Add() { return I::cast(AddUncasted<I>());} 1066 I* Add() { return AddInstructionTyped(New<I>());}
1067 1067
1068 template<class I, class P1> 1068 template<class I, class P1>
1069 HInstruction* NewUncasted(P1 p1) { 1069 HInstruction* NewUncasted(P1 p1) {
1070 return I::New(zone(), context(), p1); 1070 return I::New(zone(), context(), p1);
1071 } 1071 }
1072 1072
1073 template<class I, class P1> 1073 template<class I, class P1>
1074 I* New(P1 p1) { return I::cast(NewUncasted<I>(p1)); } 1074 I* New(P1 p1) { return I::New(zone(), context(), p1); }
1075 1075
1076 template<class I, class P1> 1076 template<class I, class P1>
1077 HInstruction* AddUncasted(P1 p1) { 1077 HInstruction* AddUncasted(P1 p1) {
1078 HInstruction* result = AddInstruction(NewUncasted<I>(p1)); 1078 HInstruction* result = AddInstruction(NewUncasted<I>(p1));
1079 // Specializations must have their parameters properly casted 1079 // Specializations must have their parameters properly casted
1080 // to avoid landing here. 1080 // to avoid landing here.
1081 ASSERT(!result->IsReturn() && !result->IsSimulate() && 1081 ASSERT(!result->IsReturn() && !result->IsSimulate() &&
1082 !result->IsDeoptimize()); 1082 !result->IsDeoptimize());
1083 return result; 1083 return result;
1084 } 1084 }
1085 1085
1086 template<class I, class P1> 1086 template<class I, class P1>
1087 I* Add(P1 p1) { 1087 I* Add(P1 p1) {
1088 return I::cast(AddUncasted<I>(p1)); 1088 I* result = AddInstructionTyped(New<I>(p1));
1089 // Specializations must have their parameters properly casted
1090 // to avoid landing here.
1091 ASSERT(!result->IsReturn() && !result->IsSimulate() &&
1092 !result->IsDeoptimize());
1093 return result;
1089 } 1094 }
1090 1095
1091 template<class I, class P1, class P2> 1096 template<class I, class P1, class P2>
1092 HInstruction* NewUncasted(P1 p1, P2 p2) { 1097 HInstruction* NewUncasted(P1 p1, P2 p2) {
1093 return I::New(zone(), context(), p1, p2); 1098 return I::New(zone(), context(), p1, p2);
1094 } 1099 }
1095 1100
1096 template<class I, class P1, class P2> 1101 template<class I, class P1, class P2>
1097 I* New(P1 p1, P2 p2) { 1102 I* New(P1 p1, P2 p2) {
1098 return I::cast(NewUncasted<I>(p1, p2)); 1103 return I::New(zone(), context(), p1, p2);
1099 } 1104 }
1100 1105
1101 template<class I, class P1, class P2> 1106 template<class I, class P1, class P2>
1102 HInstruction* AddUncasted(P1 p1, P2 p2) { 1107 HInstruction* AddUncasted(P1 p1, P2 p2) {
1103 HInstruction* result = AddInstruction(NewUncasted<I>(p1, p2)); 1108 HInstruction* result = AddInstruction(NewUncasted<I>(p1, p2));
1104 // Specializations must have their parameters properly casted 1109 // Specializations must have their parameters properly casted
1105 // to avoid landing here. 1110 // to avoid landing here.
1106 ASSERT(!result->IsSimulate()); 1111 ASSERT(!result->IsSimulate());
1107 return result; 1112 return result;
1108 } 1113 }
1109 1114
1110 template<class I, class P1, class P2> 1115 template<class I, class P1, class P2>
1111 I* Add(P1 p1, P2 p2) { 1116 I* Add(P1 p1, P2 p2) {
1112 return I::cast(AddUncasted<I>(p1, p2)); 1117 I* result = AddInstructionTyped(New<I>(p1, p2));
1118 // Specializations must have their parameters properly casted
1119 // to avoid landing here.
1120 ASSERT(!result->IsSimulate());
1121 return result;
1113 } 1122 }
1114 1123
1115 template<class I, class P1, class P2, class P3> 1124 template<class I, class P1, class P2, class P3>
1116 HInstruction* NewUncasted(P1 p1, P2 p2, P3 p3) { 1125 HInstruction* NewUncasted(P1 p1, P2 p2, P3 p3) {
1117 return I::New(zone(), context(), p1, p2, p3); 1126 return I::New(zone(), context(), p1, p2, p3);
1118 } 1127 }
1119 1128
1120 template<class I, class P1, class P2, class P3> 1129 template<class I, class P1, class P2, class P3>
1121 I* New(P1 p1, P2 p2, P3 p3) { 1130 I* New(P1 p1, P2 p2, P3 p3) {
1122 return I::cast(NewUncasted<I>(p1, p2, p3)); 1131 return I::New(zone(), context(), p1, p2, p3);
1123 } 1132 }
1124 1133
1125 template<class I, class P1, class P2, class P3> 1134 template<class I, class P1, class P2, class P3>
1126 HInstruction* AddUncasted(P1 p1, P2 p2, P3 p3) { 1135 HInstruction* AddUncasted(P1 p1, P2 p2, P3 p3) {
1127 return AddInstruction(NewUncasted<I>(p1, p2, p3)); 1136 return AddInstruction(NewUncasted<I>(p1, p2, p3));
1128 } 1137 }
1129 1138
1130 template<class I, class P1, class P2, class P3> 1139 template<class I, class P1, class P2, class P3>
1131 I* Add(P1 p1, P2 p2, P3 p3) { 1140 I* Add(P1 p1, P2 p2, P3 p3) {
1132 return I::cast(AddUncasted<I>(p1, p2, p3)); 1141 return AddInstructionTyped(New<I>(p1, p2, p3));
1133 } 1142 }
1134 1143
1135 template<class I, class P1, class P2, class P3, class P4> 1144 template<class I, class P1, class P2, class P3, class P4>
1136 HInstruction* NewUncasted(P1 p1, P2 p2, P3 p3, P4 p4) { 1145 HInstruction* NewUncasted(P1 p1, P2 p2, P3 p3, P4 p4) {
1137 return I::New(zone(), context(), p1, p2, p3, p4); 1146 return I::New(zone(), context(), p1, p2, p3, p4);
1138 } 1147 }
1139 1148
1140 template<class I, class P1, class P2, class P3, class P4> 1149 template<class I, class P1, class P2, class P3, class P4>
1141 I* New(P1 p1, P2 p2, P3 p3, P4 p4) { 1150 I* New(P1 p1, P2 p2, P3 p3, P4 p4) {
1142 return I::cast(NewUncasted<I>(p1, p2, p3, p4)); 1151 return I::New(zone(), context(), p1, p2, p3, p4);
1143 } 1152 }
1144 1153
1145 template<class I, class P1, class P2, class P3, class P4> 1154 template<class I, class P1, class P2, class P3, class P4>
1146 HInstruction* AddUncasted(P1 p1, P2 p2, P3 p3, P4 p4) { 1155 HInstruction* AddUncasted(P1 p1, P2 p2, P3 p3, P4 p4) {
1147 return AddInstruction(NewUncasted<I>(p1, p2, p3, p4)); 1156 return AddInstruction(NewUncasted<I>(p1, p2, p3, p4));
1148 } 1157 }
1149 1158
1150 template<class I, class P1, class P2, class P3, class P4> 1159 template<class I, class P1, class P2, class P3, class P4>
1151 I* Add(P1 p1, P2 p2, P3 p3, P4 p4) { 1160 I* Add(P1 p1, P2 p2, P3 p3, P4 p4) {
1152 return I::cast(AddUncasted<I>(p1, p2, p3, p4)); 1161 return AddInstructionTyped(New<I>(p1, p2, p3, p4));
1153 } 1162 }
1154 1163
1155 template<class I, class P1, class P2, class P3, class P4, class P5> 1164 template<class I, class P1, class P2, class P3, class P4, class P5>
1156 HInstruction* NewUncasted(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) { 1165 HInstruction* NewUncasted(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) {
1157 return I::New(zone(), context(), p1, p2, p3, p4, p5); 1166 return I::New(zone(), context(), p1, p2, p3, p4, p5);
1158 } 1167 }
1159 1168
1160 template<class I, class P1, class P2, class P3, class P4, class P5> 1169 template<class I, class P1, class P2, class P3, class P4, class P5>
1161 I* New(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) { 1170 I* New(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) {
1162 return I::cast(NewUncasted<I>(p1, p2, p3, p4, p5)); 1171 return I::New(zone(), context(), p1, p2, p3, p4, p5);
1163 } 1172 }
1164 1173
1165 template<class I, class P1, class P2, class P3, class P4, class P5> 1174 template<class I, class P1, class P2, class P3, class P4, class P5>
1166 HInstruction* AddUncasted(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) { 1175 HInstruction* AddUncasted(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) {
1167 return AddInstruction(NewUncasted<I>(p1, p2, p3, p4, p5)); 1176 return AddInstruction(NewUncasted<I>(p1, p2, p3, p4, p5));
1168 } 1177 }
1169 1178
1170 template<class I, class P1, class P2, class P3, class P4, class P5> 1179 template<class I, class P1, class P2, class P3, class P4, class P5>
1171 I* Add(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) { 1180 I* Add(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) {
1172 return I::cast(AddUncasted<I>(p1, p2, p3, p4, p5)); 1181 return AddInstructionTyped(New<I>(p1, p2, p3, p4, p5));
1173 } 1182 }
1174 1183
1175 template<class I, class P1, class P2, class P3, class P4, class P5, class P6> 1184 template<class I, class P1, class P2, class P3, class P4, class P5, class P6>
1176 HInstruction* NewUncasted(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6) { 1185 HInstruction* NewUncasted(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6) {
1177 return I::New(zone(), context(), p1, p2, p3, p4, p5, p6); 1186 return I::New(zone(), context(), p1, p2, p3, p4, p5, p6);
1178 } 1187 }
1179 1188
1180 template<class I, class P1, class P2, class P3, class P4, class P5, class P6> 1189 template<class I, class P1, class P2, class P3, class P4, class P5, class P6>
1181 I* New(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6) { 1190 I* New(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6) {
1182 return I::cast(NewUncasted<I>(p1, p2, p3, p4, p5, p6)); 1191 return I::New(zone(), context(), p1, p2, p3, p4, p5, p6);
1183 } 1192 }
1184 1193
1185 template<class I, class P1, class P2, class P3, class P4, class P5, class P6> 1194 template<class I, class P1, class P2, class P3, class P4, class P5, class P6>
1186 HInstruction* AddUncasted(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6) { 1195 HInstruction* AddUncasted(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6) {
1187 return AddInstruction(NewUncasted<I>(p1, p2, p3, p4, p5, p6)); 1196 return AddInstruction(NewUncasted<I>(p1, p2, p3, p4, p5, p6));
1188 } 1197 }
1189 1198
1190 template<class I, class P1, class P2, class P3, class P4, class P5, class P6> 1199 template<class I, class P1, class P2, class P3, class P4, class P5, class P6>
1191 I* Add(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6) { 1200 I* Add(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6) {
1192 return I::cast(AddInstruction(NewUncasted<I>(p1, p2, p3, p4, p5, p6))); 1201 return AddInstructionTyped(New<I>(p1, p2, p3, p4, p5, p6));
1193 } 1202 }
1194 1203
1195 template<class I, class P1, class P2, class P3, class P4, 1204 template<class I, class P1, class P2, class P3, class P4,
1196 class P5, class P6, class P7> 1205 class P5, class P6, class P7>
1197 HInstruction* NewUncasted(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7) { 1206 HInstruction* NewUncasted(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7) {
1198 return I::New(zone(), context(), p1, p2, p3, p4, p5, p6, p7); 1207 return I::New(zone(), context(), p1, p2, p3, p4, p5, p6, p7);
1199 } 1208 }
1200 1209
1201 template<class I, class P1, class P2, class P3, class P4, 1210 template<class I, class P1, class P2, class P3, class P4,
1202 class P5, class P6, class P7> 1211 class P5, class P6, class P7>
1203 I* New(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7) { 1212 I* New(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7) {
1204 return I::cast(NewUncasted<I>(p1, p2, p3, p4, p5, p6, p7)); 1213 return I::New(zone(), context(), p1, p2, p3, p4, p5, p6, p7);
1205 } 1214 }
1206 1215
1207 template<class I, class P1, class P2, class P3, 1216 template<class I, class P1, class P2, class P3,
1208 class P4, class P5, class P6, class P7> 1217 class P4, class P5, class P6, class P7>
1209 HInstruction* AddUncasted(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7) { 1218 HInstruction* AddUncasted(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7) {
1210 return AddInstruction(NewUncasted<I>(p1, p2, p3, p4, p5, p6, p7)); 1219 return AddInstruction(NewUncasted<I>(p1, p2, p3, p4, p5, p6, p7));
1211 } 1220 }
1212 1221
1213 template<class I, class P1, class P2, class P3, 1222 template<class I, class P1, class P2, class P3,
1214 class P4, class P5, class P6, class P7> 1223 class P4, class P5, class P6, class P7>
1215 I* Add(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7) { 1224 I* Add(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7) {
1216 return I::cast(AddInstruction(NewUncasted<I>(p1, p2, p3, p4, 1225 return AddInstructionTyped(New<I>(p1, p2, p3, p4, p5, p6, p7));
1217 p5, p6, p7)));
1218 } 1226 }
1219 1227
1220 template<class I, class P1, class P2, class P3, class P4, 1228 template<class I, class P1, class P2, class P3, class P4,
1221 class P5, class P6, class P7, class P8> 1229 class P5, class P6, class P7, class P8>
1222 HInstruction* NewUncasted(P1 p1, P2 p2, P3 p3, P4 p4, 1230 HInstruction* NewUncasted(P1 p1, P2 p2, P3 p3, P4 p4,
1223 P5 p5, P6 p6, P7 p7, P8 p8) { 1231 P5 p5, P6 p6, P7 p7, P8 p8) {
1224 return I::New(zone(), context(), p1, p2, p3, p4, p5, p6, p7, p8); 1232 return I::New(zone(), context(), p1, p2, p3, p4, p5, p6, p7, p8);
1225 } 1233 }
1226 1234
1227 template<class I, class P1, class P2, class P3, class P4, 1235 template<class I, class P1, class P2, class P3, class P4,
1228 class P5, class P6, class P7, class P8> 1236 class P5, class P6, class P7, class P8>
1229 I* New(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8) { 1237 I* New(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8) {
1230 return I::cast(NewUncasted<I>(p1, p2, p3, p4, p5, p6, p7, p8)); 1238 return I::New(zone(), context(), p1, p2, p3, p4, p5, p6, p7, p8);
1231 } 1239 }
1232 1240
1233 template<class I, class P1, class P2, class P3, class P4, 1241 template<class I, class P1, class P2, class P3, class P4,
1234 class P5, class P6, class P7, class P8> 1242 class P5, class P6, class P7, class P8>
1235 HInstruction* AddUncasted(P1 p1, P2 p2, P3 p3, P4 p4, 1243 HInstruction* AddUncasted(P1 p1, P2 p2, P3 p3, P4 p4,
1236 P5 p5, P6 p6, P7 p7, P8 p8) { 1244 P5 p5, P6 p6, P7 p7, P8 p8) {
1237 return AddInstruction(NewUncasted<I>(p1, p2, p3, p4, p5, p6, p7, p8)); 1245 return AddInstruction(NewUncasted<I>(p1, p2, p3, p4, p5, p6, p7, p8));
1238 } 1246 }
1239 1247
1240 template<class I, class P1, class P2, class P3, class P4, 1248 template<class I, class P1, class P2, class P3, class P4,
1241 class P5, class P6, class P7, class P8> 1249 class P5, class P6, class P7, class P8>
1242 I* Add(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8) { 1250 I* Add(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8) {
1243 return I::cast( 1251 return AddInstructionTyped(New<I>(p1, p2, p3, p4, p5, p6, p7, p8));
1244 AddInstruction(NewUncasted<I>(p1, p2, p3, p4, p5, p6, p7, p8)));
1245 } 1252 }
1246 1253
1247 void AddSimulate(BailoutId id, RemovableSimulate removable = FIXED_SIMULATE); 1254 void AddSimulate(BailoutId id, RemovableSimulate removable = FIXED_SIMULATE);
1248 1255
1249 int position() const { return position_; } 1256 int position() const { return position_; }
1250 1257
1251 protected: 1258 protected:
1252 virtual bool BuildGraph() = 0; 1259 virtual bool BuildGraph() = 0;
1253 1260
1254 HBasicBlock* CreateBasicBlock(HEnvironment* env); 1261 HBasicBlock* CreateBasicBlock(HEnvironment* env);
(...skipping 480 matching lines...) Expand 10 before | Expand all | Expand 10 after
1735 HValue* BuildUncheckedDictionaryElementLoadHelper( 1742 HValue* BuildUncheckedDictionaryElementLoadHelper(
1736 HValue* elements, 1743 HValue* elements,
1737 HValue* key, 1744 HValue* key,
1738 HValue* hash, 1745 HValue* hash,
1739 HValue* mask, 1746 HValue* mask,
1740 int current_probe); 1747 int current_probe);
1741 1748
1742 void PadEnvironmentForContinuation(HBasicBlock* from, 1749 void PadEnvironmentForContinuation(HBasicBlock* from,
1743 HBasicBlock* continuation); 1750 HBasicBlock* continuation);
1744 1751
1752 template <class I>
1753 I* AddInstructionTyped(I* instr) {
1754 return I::cast(AddInstruction(instr));
Dmitry Lomov (no reviews) 2013/11/22 15:05:01 I could probably just make AddInstruction generic
danno 2013/11/22 16:42:40 I think this is OK. We should keep headers as free
1755 }
1756
1745 CompilationInfo* info_; 1757 CompilationInfo* info_;
1746 HGraph* graph_; 1758 HGraph* graph_;
1747 HBasicBlock* current_block_; 1759 HBasicBlock* current_block_;
1748 int position_; 1760 int position_;
1749 }; 1761 };
1750 1762
1751 1763
1752 template<> 1764 template<>
1753 inline HInstruction* HGraphBuilder::AddUncasted<HDeoptimize>( 1765 inline HDeoptimize* HGraphBuilder::Add<HDeoptimize>(
1754 const char* reason, Deoptimizer::BailoutType type) { 1766 const char* reason, Deoptimizer::BailoutType type) {
1755 if (type == Deoptimizer::SOFT) { 1767 if (type == Deoptimizer::SOFT) {
1756 isolate()->counters()->soft_deopts_requested()->Increment(); 1768 isolate()->counters()->soft_deopts_requested()->Increment();
1757 if (FLAG_always_opt) return NULL; 1769 if (FLAG_always_opt) return NULL;
1758 } 1770 }
1759 if (current_block()->IsDeoptimizing()) return NULL; 1771 if (current_block()->IsDeoptimizing()) return NULL;
1760 HBasicBlock* after_deopt_block = CreateBasicBlock( 1772 HBasicBlock* after_deopt_block = CreateBasicBlock(
1761 current_block()->last_environment()); 1773 current_block()->last_environment());
1762 HDeoptimize* instr = New<HDeoptimize>(reason, type, after_deopt_block); 1774 HDeoptimize* instr = New<HDeoptimize>(reason, type, after_deopt_block);
1763 if (type == Deoptimizer::SOFT) { 1775 if (type == Deoptimizer::SOFT) {
1764 isolate()->counters()->soft_deopts_inserted()->Increment(); 1776 isolate()->counters()->soft_deopts_inserted()->Increment();
1765 } 1777 }
1766 FinishCurrentBlock(instr); 1778 FinishCurrentBlock(instr);
1767 set_current_block(after_deopt_block); 1779 set_current_block(after_deopt_block);
1768 return instr; 1780 return instr;
1769 } 1781 }
1770 1782
1771 1783
1772 template<> 1784 template<>
1773 inline HDeoptimize* HGraphBuilder::Add<HDeoptimize>( 1785 inline HInstruction* HGraphBuilder::AddUncasted<HDeoptimize>(
1774 const char* reason, Deoptimizer::BailoutType type) { 1786 const char* reason, Deoptimizer::BailoutType type) {
1775 return static_cast<HDeoptimize*>(AddUncasted<HDeoptimize>(reason, type)); 1787 return Add<HDeoptimize>(reason, type);
1776 } 1788 }
1777 1789
1778 1790
1779 template<> 1791 template<>
1780 inline HInstruction* HGraphBuilder::AddUncasted<HSimulate>( 1792 inline HSimulate* HGraphBuilder::Add<HSimulate>(
1781 BailoutId id, 1793 BailoutId id,
1782 RemovableSimulate removable) { 1794 RemovableSimulate removable) {
1783 HSimulate* instr = current_block()->CreateSimulate(id, removable); 1795 HSimulate* instr = current_block()->CreateSimulate(id, removable);
1784 AddInstruction(instr); 1796 AddInstruction(instr);
1785 return instr; 1797 return instr;
1786 } 1798 }
1787 1799
1788 1800
1789 template<> 1801 template<>
1802 inline HSimulate* HGraphBuilder::Add<HSimulate>(
1803 BailoutId id) {
1804 return Add<HSimulate>(id, FIXED_SIMULATE);
1805 }
1806
1807
1808 template<>
1790 inline HInstruction* HGraphBuilder::AddUncasted<HSimulate>(BailoutId id) { 1809 inline HInstruction* HGraphBuilder::AddUncasted<HSimulate>(BailoutId id) {
1791 return AddUncasted<HSimulate>(id, FIXED_SIMULATE); 1810 return Add<HSimulate>(id, FIXED_SIMULATE);
1792 } 1811 }
1793 1812
1794 1813
1795 template<> 1814 template<>
1796 inline HInstruction* HGraphBuilder::AddUncasted<HReturn>(HValue* value) { 1815 inline HReturn* HGraphBuilder::Add<HReturn>(HValue* value) {
1797 int num_parameters = graph()->info()->num_parameters(); 1816 int num_parameters = graph()->info()->num_parameters();
1798 HValue* params = AddUncasted<HConstant>(num_parameters); 1817 HValue* params = AddUncasted<HConstant>(num_parameters);
1799 HReturn* return_instruction = New<HReturn>(value, params); 1818 HReturn* return_instruction = New<HReturn>(value, params);
1800 FinishExitCurrentBlock(return_instruction); 1819 FinishExitCurrentBlock(return_instruction);
1801 return return_instruction; 1820 return return_instruction;
1802 } 1821 }
1803 1822
1804 1823
1805 template<> 1824 template<>
1825 inline HReturn* HGraphBuilder::Add<HReturn>(HConstant* value) {
1826 return Add<HReturn>(static_cast<HValue*>(value));
1827 }
1828
1829 template<>
1830 inline HInstruction* HGraphBuilder::AddUncasted<HReturn>(HValue* value) {
1831 return Add<HReturn>(value);
1832 }
1833
1834
1835 template<>
1806 inline HInstruction* HGraphBuilder::AddUncasted<HReturn>(HConstant* value) { 1836 inline HInstruction* HGraphBuilder::AddUncasted<HReturn>(HConstant* value) {
1807 return AddUncasted<HReturn>(static_cast<HValue*>(value)); 1837 return Add<HReturn>(value);
1808 } 1838 }
1809 1839
1810 1840
1811 template<> 1841 template<>
1812 inline HInstruction* HGraphBuilder::AddUncasted<HCallRuntime>( 1842 inline HCallRuntime* HGraphBuilder::Add<HCallRuntime>(
1813 Handle<String> name, 1843 Handle<String> name,
1814 const Runtime::Function* c_function, 1844 const Runtime::Function* c_function,
1815 int argument_count) { 1845 int argument_count) {
1816 HCallRuntime* instr = New<HCallRuntime>(name, c_function, argument_count); 1846 HCallRuntime* instr = New<HCallRuntime>(name, c_function, argument_count);
1817 if (graph()->info()->IsStub()) { 1847 if (graph()->info()->IsStub()) {
1818 // When compiling code stubs, we don't want to save all double registers 1848 // When compiling code stubs, we don't want to save all double registers
1819 // upon entry to the stub, but instead have the call runtime instruction 1849 // upon entry to the stub, but instead have the call runtime instruction
1820 // save the double registers only on-demand (in the fallback case). 1850 // save the double registers only on-demand (in the fallback case).
1821 instr->set_save_doubles(kSaveFPRegs); 1851 instr->set_save_doubles(kSaveFPRegs);
1822 } 1852 }
1823 AddInstruction(instr); 1853 AddInstruction(instr);
1824 return instr; 1854 return instr;
1825 } 1855 }
1826 1856
1827 1857
1828 template<> 1858 template<>
1859 inline HInstruction* HGraphBuilder::AddUncasted<HCallRuntime>(
1860 Handle<String> name,
1861 const Runtime::Function* c_function,
1862 int argument_count) {
1863 return Add<HCallRuntime>(name, c_function, argument_count);
1864 }
1865
1866
1867 template<>
1868 inline HContext* HGraphBuilder::New<HContext>() {
1869 return HContext::New(zone());
1870 }
1871
1872
1873 template<>
1829 inline HInstruction* HGraphBuilder::NewUncasted<HContext>() { 1874 inline HInstruction* HGraphBuilder::NewUncasted<HContext>() {
1830 return HContext::New(zone()); 1875 return New<HContext>();
1831 } 1876 }
1832 1877
1833
1834 class HOptimizedGraphBuilder : public HGraphBuilder, public AstVisitor { 1878 class HOptimizedGraphBuilder : public HGraphBuilder, public AstVisitor {
1835 public: 1879 public:
1836 // A class encapsulating (lazily-allocated) break and continue blocks for 1880 // A class encapsulating (lazily-allocated) break and continue blocks for
1837 // a breakable statement. Separated from BreakAndContinueScope so that it 1881 // a breakable statement. Separated from BreakAndContinueScope so that it
1838 // can have a separate lifetime. 1882 // can have a separate lifetime.
1839 class BreakAndContinueInfo V8_FINAL BASE_EMBEDDED { 1883 class BreakAndContinueInfo V8_FINAL BASE_EMBEDDED {
1840 public: 1884 public:
1841 explicit BreakAndContinueInfo(BreakableStatement* target, 1885 explicit BreakAndContinueInfo(BreakableStatement* target,
1842 int drop_extra = 0) 1886 int drop_extra = 0)
1843 : target_(target), 1887 : target_(target),
(...skipping 733 matching lines...) Expand 10 before | Expand all | Expand 10 after
2577 } 2621 }
2578 2622
2579 private: 2623 private:
2580 HGraphBuilder* builder_; 2624 HGraphBuilder* builder_;
2581 }; 2625 };
2582 2626
2583 2627
2584 } } // namespace v8::internal 2628 } } // namespace v8::internal
2585 2629
2586 #endif // V8_HYDROGEN_H_ 2630 #endif // V8_HYDROGEN_H_
OLDNEW
« no previous file with comments | « src/code-stubs-hydrogen.cc ('k') | src/hydrogen.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698