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-builtin-reducer.h" | 5 #include "src/compiler/js-builtin-reducer.h" |
6 | 6 |
7 #include "src/compiler/access-builder.h" | 7 #include "src/compiler/access-builder.h" |
8 #include "src/compiler/js-graph.h" | 8 #include "src/compiler/js-graph.h" |
9 #include "src/compiler/node-matchers.h" | 9 #include "src/compiler/node-matchers.h" |
10 #include "src/compiler/node-properties.h" | 10 #include "src/compiler/node-properties.h" |
(...skipping 511 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
522 // Number.parseInt(a:safe-integer) -> NumberToInt32(a) | 522 // Number.parseInt(a:safe-integer) -> NumberToInt32(a) |
523 // Number.parseInt(a:safe-integer,b:#0\/undefined) -> NumberToInt32(a) | 523 // Number.parseInt(a:safe-integer,b:#0\/undefined) -> NumberToInt32(a) |
524 // Number.parseInt(a:safe-integer,b:#10\/undefined) -> NumberToInt32(a) | 524 // Number.parseInt(a:safe-integer,b:#10\/undefined) -> NumberToInt32(a) |
525 Node* input = r.GetJSCallInput(0); | 525 Node* input = r.GetJSCallInput(0); |
526 Node* value = graph()->NewNode(simplified()->NumberToInt32(), input); | 526 Node* value = graph()->NewNode(simplified()->NumberToInt32(), input); |
527 return Replace(value); | 527 return Replace(value); |
528 } | 528 } |
529 return NoChange(); | 529 return NoChange(); |
530 } | 530 } |
531 | 531 |
| 532 namespace { |
| 533 |
| 534 Node* GetNumberWitness(Node* node) { |
| 535 Node* receiver = NodeProperties::GetValueInput(node, 1); |
| 536 Type* receiver_type = NodeProperties::GetType(receiver); |
| 537 Node* effect = NodeProperties::GetEffectInput(node); |
| 538 if (receiver_type->Is(Type::Number())) return receiver; |
| 539 // Check if the {node} is dominated by a CheckNumber renaming for |
| 540 // it's {receiver}, and if so use that renaming as {receiver} for |
| 541 // the lowering below. |
| 542 for (Node* dominator = effect;;) { |
| 543 if (dominator->opcode() == IrOpcode::kCheckNumber && |
| 544 dominator->InputAt(0) == receiver) { |
| 545 return dominator; |
| 546 } |
| 547 if (dominator->op()->EffectInputCount() != 1) { |
| 548 // Didn't find any appropriate CheckNumber node. |
| 549 return nullptr; |
| 550 } |
| 551 dominator = NodeProperties::GetEffectInput(dominator); |
| 552 } |
| 553 } |
| 554 |
| 555 } // namespace |
| 556 |
| 557 // 20.1.3.6 Number.prototype.toString ( [ radix ] ) |
| 558 Reduction JSBuiltinReducer::ReduceNumberToString(Node* node) { |
| 559 if (Node* receiver = GetNumberWitness(node)) { |
| 560 // Determine the optional {radix} parameter. |
| 561 Node* radix = node->op()->ValueInputCount() > 2 |
| 562 ? NodeProperties::GetValueInput(node, 2) |
| 563 : jsgraph()->Constant(10); |
| 564 Type* radix_type = NodeProperties::GetType(radix); |
| 565 if (radix_type->Is(Type::Undefined())) { |
| 566 radix = jsgraph()->Constant(10.0); |
| 567 radix_type = type_cache_.kSingletonTen; |
| 568 } |
| 569 if (radix_type->Is(Type::Unsigned32())) { |
| 570 if (radix_type->Min() >= 2.0 && radix_type->Max() <= 36.0) { |
| 571 // Return the String representation of the Number {receiver} |
| 572 // according to the given {radix}. |
| 573 Node* value = |
| 574 graph()->NewNode(simplified()->NumberToString(), receiver, radix); |
| 575 return Replace(value); |
| 576 } |
| 577 } |
| 578 } |
| 579 return NoChange(); |
| 580 } |
| 581 |
532 // ES6 section 21.1.2.1 String.fromCharCode ( ...codeUnits ) | 582 // ES6 section 21.1.2.1 String.fromCharCode ( ...codeUnits ) |
533 Reduction JSBuiltinReducer::ReduceStringFromCharCode(Node* node) { | 583 Reduction JSBuiltinReducer::ReduceStringFromCharCode(Node* node) { |
534 JSCallReduction r(node); | 584 JSCallReduction r(node); |
535 if (r.InputsMatchOne(Type::PlainPrimitive())) { | 585 if (r.InputsMatchOne(Type::PlainPrimitive())) { |
536 // String.fromCharCode(a:plain-primitive) -> StringFromCharCode(a) | 586 // String.fromCharCode(a:plain-primitive) -> StringFromCharCode(a) |
537 Node* input = ToNumber(r.GetJSCallInput(0)); | 587 Node* input = ToNumber(r.GetJSCallInput(0)); |
538 Node* value = graph()->NewNode(simplified()->StringFromCharCode(), input); | 588 Node* value = graph()->NewNode(simplified()->StringFromCharCode(), input); |
539 return Replace(value); | 589 return Replace(value); |
540 } | 590 } |
541 return NoChange(); | 591 return NoChange(); |
(...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
844 break; | 894 break; |
845 case kMathTanh: | 895 case kMathTanh: |
846 reduction = ReduceMathTanh(node); | 896 reduction = ReduceMathTanh(node); |
847 break; | 897 break; |
848 case kMathTrunc: | 898 case kMathTrunc: |
849 reduction = ReduceMathTrunc(node); | 899 reduction = ReduceMathTrunc(node); |
850 break; | 900 break; |
851 case kNumberParseInt: | 901 case kNumberParseInt: |
852 reduction = ReduceNumberParseInt(node); | 902 reduction = ReduceNumberParseInt(node); |
853 break; | 903 break; |
| 904 case kNumberToString: |
| 905 reduction = ReduceNumberToString(node); |
| 906 break; |
854 case kStringFromCharCode: | 907 case kStringFromCharCode: |
855 reduction = ReduceStringFromCharCode(node); | 908 reduction = ReduceStringFromCharCode(node); |
856 break; | 909 break; |
857 case kStringCharAt: | 910 case kStringCharAt: |
858 return ReduceStringCharAt(node); | 911 return ReduceStringCharAt(node); |
859 case kStringCharCodeAt: | 912 case kStringCharCodeAt: |
860 return ReduceStringCharCodeAt(node); | 913 return ReduceStringCharCodeAt(node); |
861 case kDataViewByteLength: | 914 case kDataViewByteLength: |
862 return ReduceArrayBufferViewAccessor( | 915 return ReduceArrayBufferViewAccessor( |
863 node, JS_DATA_VIEW_TYPE, | 916 node, JS_DATA_VIEW_TYPE, |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
912 } | 965 } |
913 | 966 |
914 | 967 |
915 SimplifiedOperatorBuilder* JSBuiltinReducer::simplified() const { | 968 SimplifiedOperatorBuilder* JSBuiltinReducer::simplified() const { |
916 return jsgraph()->simplified(); | 969 return jsgraph()->simplified(); |
917 } | 970 } |
918 | 971 |
919 } // namespace compiler | 972 } // namespace compiler |
920 } // namespace internal | 973 } // namespace internal |
921 } // namespace v8 | 974 } // namespace v8 |
OLD | NEW |