| 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/js-typed-lowering.h" | 5 #include "src/compiler/js-typed-lowering.h" |
| 6 | 6 |
| 7 #include "src/ast/modules.h" | 7 #include "src/ast/modules.h" |
| 8 #include "src/builtins/builtins-utils.h" | 8 #include "src/builtins/builtins-utils.h" |
| 9 #include "src/code-factory.h" | 9 #include "src/code-factory.h" |
| 10 #include "src/compilation-dependencies.h" | 10 #include "src/compilation-dependencies.h" |
| (...skipping 554 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 565 if (r.OneInputIs(Type::String())) { | 565 if (r.OneInputIs(Type::String())) { |
| 566 if (r.ShouldCreateConsString()) { | 566 if (r.ShouldCreateConsString()) { |
| 567 return ReduceCreateConsString(node); | 567 return ReduceCreateConsString(node); |
| 568 } | 568 } |
| 569 StringAddFlags flags = STRING_ADD_CHECK_NONE; | 569 StringAddFlags flags = STRING_ADD_CHECK_NONE; |
| 570 if (!r.LeftInputIs(Type::String())) { | 570 if (!r.LeftInputIs(Type::String())) { |
| 571 flags = STRING_ADD_CONVERT_LEFT; | 571 flags = STRING_ADD_CONVERT_LEFT; |
| 572 } else if (!r.RightInputIs(Type::String())) { | 572 } else if (!r.RightInputIs(Type::String())) { |
| 573 flags = STRING_ADD_CONVERT_RIGHT; | 573 flags = STRING_ADD_CONVERT_RIGHT; |
| 574 } | 574 } |
| 575 Operator::Properties properties = node->op()->properties(); |
| 576 if (r.NeitherInputCanBe(Type::Receiver())) { |
| 577 // Both sides are already strings, so we know that the |
| 578 // string addition will not cause any observable side |
| 579 // effects; it can still throw obviously. |
| 580 properties = Operator::kNoWrite | Operator::kNoDeopt; |
| 581 } |
| 575 // JSAdd(x:string, y) => CallStub[StringAdd](x, y) | 582 // JSAdd(x:string, y) => CallStub[StringAdd](x, y) |
| 576 // JSAdd(x, y:string) => CallStub[StringAdd](x, y) | 583 // JSAdd(x, y:string) => CallStub[StringAdd](x, y) |
| 577 Callable const callable = | 584 Callable const callable = |
| 578 CodeFactory::StringAdd(isolate(), flags, NOT_TENURED); | 585 CodeFactory::StringAdd(isolate(), flags, NOT_TENURED); |
| 579 CallDescriptor const* const desc = Linkage::GetStubCallDescriptor( | 586 CallDescriptor const* const desc = Linkage::GetStubCallDescriptor( |
| 580 isolate(), graph()->zone(), callable.descriptor(), 0, | 587 isolate(), graph()->zone(), callable.descriptor(), 0, |
| 581 CallDescriptor::kNeedsFrameState, node->op()->properties()); | 588 CallDescriptor::kNeedsFrameState, properties); |
| 582 DCHECK_EQ(1, OperatorProperties::GetFrameStateInputCount(node->op())); | 589 DCHECK_EQ(1, OperatorProperties::GetFrameStateInputCount(node->op())); |
| 583 node->InsertInput(graph()->zone(), 0, | 590 node->InsertInput(graph()->zone(), 0, |
| 584 jsgraph()->HeapConstant(callable.code())); | 591 jsgraph()->HeapConstant(callable.code())); |
| 585 NodeProperties::ChangeOp(node, common()->Call(desc)); | 592 NodeProperties::ChangeOp(node, common()->Call(desc)); |
| 586 return Changed(node); | 593 return Changed(node); |
| 587 } | 594 } |
| 588 return NoChange(); | 595 return NoChange(); |
| 589 } | 596 } |
| 590 | 597 |
| 591 Reduction JSTypedLowering::ReduceNumberBinop(Node* node) { | 598 Reduction JSTypedLowering::ReduceNumberBinop(Node* node) { |
| (...skipping 1794 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2386 } | 2393 } |
| 2387 | 2394 |
| 2388 | 2395 |
| 2389 CompilationDependencies* JSTypedLowering::dependencies() const { | 2396 CompilationDependencies* JSTypedLowering::dependencies() const { |
| 2390 return dependencies_; | 2397 return dependencies_; |
| 2391 } | 2398 } |
| 2392 | 2399 |
| 2393 } // namespace compiler | 2400 } // namespace compiler |
| 2394 } // namespace internal | 2401 } // namespace internal |
| 2395 } // namespace v8 | 2402 } // namespace v8 |
| OLD | NEW |