OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/compiler/ast-graph-builder.h" | 5 #include "src/compiler/ast-graph-builder.h" |
6 | 6 |
7 #include "src/compiler.h" | 7 #include "src/compiler.h" |
8 #include "src/compiler/control-builders.h" | 8 #include "src/compiler/control-builders.h" |
9 #include "src/compiler/node-properties.h" | 9 #include "src/compiler/node-properties.h" |
10 #include "src/compiler/node-properties-inl.h" | 10 #include "src/compiler/node-properties-inl.h" |
(...skipping 714 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
725 info()->context()->builtins()->javascript_builtin( | 725 info()->context()->builtins()->javascript_builtin( |
726 Builtins::FILTER_KEY))); | 726 Builtins::FILTER_KEY))); |
727 // Callee. | 727 // Callee. |
728 environment()->Push(jsgraph()->HeapConstant(function)); | 728 environment()->Push(jsgraph()->HeapConstant(function)); |
729 // Receiver. | 729 // Receiver. |
730 environment()->Push(obj); | 730 environment()->Push(obj); |
731 // Args. | 731 // Args. |
732 environment()->Push(value); | 732 environment()->Push(value); |
733 // result is either the string key or Smi(0) indicating the property | 733 // result is either the string key or Smi(0) indicating the property |
734 // is gone. | 734 // is gone. |
| 735 // TODO(jarin) Insert lazy deoptimization support here - the call |
| 736 // actually |
| 737 // can deoptimize. |
735 Node* res = ProcessArguments( | 738 Node* res = ProcessArguments( |
736 javascript()->Call(3, NO_CALL_FUNCTION_FLAGS), 3); | 739 javascript()->Call(3, NO_CALL_FUNCTION_FLAGS, |
| 740 CallDescriptor::kCannotDeoptimize), |
| 741 3); |
737 Node* property_missing = NewNode(javascript()->StrictEqual(), res, | 742 Node* property_missing = NewNode(javascript()->StrictEqual(), res, |
738 jsgraph()->ZeroConstant()); | 743 jsgraph()->ZeroConstant()); |
739 { | 744 { |
740 IfBuilder is_property_missing(this); | 745 IfBuilder is_property_missing(this); |
741 is_property_missing.If(property_missing); | 746 is_property_missing.If(property_missing); |
742 is_property_missing.Then(); | 747 is_property_missing.Then(); |
743 // Inc counter and continue. | 748 // Inc counter and continue. |
744 Node* index_inc = | 749 Node* index_inc = |
745 NewNode(javascript()->Add(), index, jsgraph()->OneConstant()); | 750 NewNode(javascript()->Add(), index, jsgraph()->OneConstant()); |
746 environment()->Poke(0, index_inc); | 751 environment()->Poke(0, index_inc); |
(...skipping 502 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1249 Node* pair = NewNode(op, callee, source, receiver, strict, position); | 1254 Node* pair = NewNode(op, callee, source, receiver, strict, position); |
1250 Node* new_callee = NewNode(common()->Projection(0), pair); | 1255 Node* new_callee = NewNode(common()->Projection(0), pair); |
1251 Node* new_receiver = NewNode(common()->Projection(1), pair); | 1256 Node* new_receiver = NewNode(common()->Projection(1), pair); |
1252 | 1257 |
1253 // Patch callee and receiver on the environment. | 1258 // Patch callee and receiver on the environment. |
1254 environment()->Poke(arg_count + 1, new_callee); | 1259 environment()->Poke(arg_count + 1, new_callee); |
1255 environment()->Poke(arg_count + 0, new_receiver); | 1260 environment()->Poke(arg_count + 0, new_receiver); |
1256 } | 1261 } |
1257 | 1262 |
1258 // Create node to perform the function call. | 1263 // Create node to perform the function call. |
1259 Operator* call = javascript()->Call(args->length() + 2, flags); | 1264 Operator* call = javascript()->Call(args->length() + 2, flags, |
| 1265 CallDescriptor::kCanDeoptimize); |
1260 Node* value = ProcessArguments(call, args->length() + 2); | 1266 Node* value = ProcessArguments(call, args->length() + 2); |
1261 ast_context()->ProduceValue(value); | 1267 ast_context()->ProduceValue(value); |
| 1268 |
| 1269 BuildLazyBailout(value, expr->id()); |
1262 } | 1270 } |
1263 | 1271 |
1264 | 1272 |
1265 void AstGraphBuilder::VisitCallNew(CallNew* expr) { | 1273 void AstGraphBuilder::VisitCallNew(CallNew* expr) { |
1266 VisitForValue(expr->expression()); | 1274 VisitForValue(expr->expression()); |
1267 | 1275 |
1268 // Evaluate all arguments to the construct call. | 1276 // Evaluate all arguments to the construct call. |
1269 ZoneList<Expression*>* args = expr->arguments(); | 1277 ZoneList<Expression*>* args = expr->arguments(); |
1270 VisitForValues(args); | 1278 VisitForValues(args); |
1271 | 1279 |
(...skipping 14 matching lines...) Expand all Loading... |
1286 PrintableUnique<String> unique = MakeUnique(name); | 1294 PrintableUnique<String> unique = MakeUnique(name); |
1287 Node* callee_value = NewNode(javascript()->LoadNamed(unique), receiver_value); | 1295 Node* callee_value = NewNode(javascript()->LoadNamed(unique), receiver_value); |
1288 environment()->Push(callee_value); | 1296 environment()->Push(callee_value); |
1289 environment()->Push(receiver_value); | 1297 environment()->Push(receiver_value); |
1290 | 1298 |
1291 // Evaluate all arguments to the JS runtime call. | 1299 // Evaluate all arguments to the JS runtime call. |
1292 ZoneList<Expression*>* args = expr->arguments(); | 1300 ZoneList<Expression*>* args = expr->arguments(); |
1293 VisitForValues(args); | 1301 VisitForValues(args); |
1294 | 1302 |
1295 // Create node to perform the JS runtime call. | 1303 // Create node to perform the JS runtime call. |
1296 Operator* call = javascript()->Call(args->length() + 2, flags); | 1304 Operator* call = javascript()->Call(args->length() + 2, flags, |
| 1305 CallDescriptor::kCanDeoptimize); |
1297 Node* value = ProcessArguments(call, args->length() + 2); | 1306 Node* value = ProcessArguments(call, args->length() + 2); |
1298 ast_context()->ProduceValue(value); | 1307 ast_context()->ProduceValue(value); |
| 1308 |
| 1309 BuildLazyBailout(value, expr->id()); |
1299 } | 1310 } |
1300 | 1311 |
1301 | 1312 |
1302 void AstGraphBuilder::VisitCallRuntime(CallRuntime* expr) { | 1313 void AstGraphBuilder::VisitCallRuntime(CallRuntime* expr) { |
1303 const Runtime::Function* function = expr->function(); | 1314 const Runtime::Function* function = expr->function(); |
1304 | 1315 |
1305 // Handle calls to runtime functions implemented in JavaScript separately as | 1316 // Handle calls to runtime functions implemented in JavaScript separately as |
1306 // the call follows JavaScript ABI and the callee is statically unknown. | 1317 // the call follows JavaScript ABI and the callee is statically unknown. |
1307 if (expr->is_jsruntime()) { | 1318 if (expr->is_jsruntime()) { |
1308 DCHECK(function == NULL && expr->name()->length() > 0); | 1319 DCHECK(function == NULL && expr->name()->length() > 0); |
(...skipping 668 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1977 | 1988 |
1978 // Continue with the original environment. | 1989 // Continue with the original environment. |
1979 set_environment(continuation_env); | 1990 set_environment(continuation_env); |
1980 | 1991 |
1981 NewNode(common()->Continuation()); | 1992 NewNode(common()->Continuation()); |
1982 } | 1993 } |
1983 } | 1994 } |
1984 } | 1995 } |
1985 } | 1996 } |
1986 } // namespace v8::internal::compiler | 1997 } // namespace v8::internal::compiler |
OLD | NEW |