| 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/compilation-dependencies.h" | 7 #include "src/compilation-dependencies.h" |
| 8 #include "src/compiler/access-builder.h" | 8 #include "src/compiler/access-builder.h" |
| 9 #include "src/compiler/js-graph.h" | 9 #include "src/compiler/js-graph.h" |
| 10 #include "src/compiler/node-matchers.h" | 10 #include "src/compiler/node-matchers.h" |
| (...skipping 944 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 955 if (HasInstanceTypeWitness(receiver, effect, JS_DATE_TYPE)) { | 955 if (HasInstanceTypeWitness(receiver, effect, JS_DATE_TYPE)) { |
| 956 Node* value = effect = graph()->NewNode( | 956 Node* value = effect = graph()->NewNode( |
| 957 simplified()->LoadField(AccessBuilder::ForJSDateValue()), receiver, | 957 simplified()->LoadField(AccessBuilder::ForJSDateValue()), receiver, |
| 958 effect, control); | 958 effect, control); |
| 959 ReplaceWithValue(node, value, effect, control); | 959 ReplaceWithValue(node, value, effect, control); |
| 960 return Replace(value); | 960 return Replace(value); |
| 961 } | 961 } |
| 962 return NoChange(); | 962 return NoChange(); |
| 963 } | 963 } |
| 964 | 964 |
| 965 // ES6 section 19.2.3.6 Function.prototype [ @@hasInstance ] ( V ) |
| 966 Reduction JSBuiltinReducer::ReduceFunctionHasInstance(Node* node) { |
| 967 Node* receiver = NodeProperties::GetValueInput(node, 1); |
| 968 Node* object = (node->op()->ValueInputCount() >= 3) |
| 969 ? NodeProperties::GetValueInput(node, 2) |
| 970 : jsgraph()->UndefinedConstant(); |
| 971 Node* context = NodeProperties::GetContextInput(node); |
| 972 Node* frame_state = NodeProperties::GetFrameStateInput(node); |
| 973 Node* effect = NodeProperties::GetEffectInput(node); |
| 974 Node* control = NodeProperties::GetControlInput(node); |
| 975 |
| 976 // TODO(turbofan): If JSOrdinaryToInstance raises an exception, the |
| 977 // stack trace doesn't contain the @@hasInstance call; we have the |
| 978 // corresponding bug in the baseline case. Some massaging of the frame |
| 979 // state would be necessary here. |
| 980 |
| 981 // Morph this {node} into a JSOrdinaryHasInstance node. |
| 982 node->ReplaceInput(0, receiver); |
| 983 node->ReplaceInput(1, object); |
| 984 node->ReplaceInput(2, context); |
| 985 node->ReplaceInput(3, frame_state); |
| 986 node->ReplaceInput(4, effect); |
| 987 node->ReplaceInput(5, control); |
| 988 node->TrimInputCount(6); |
| 989 NodeProperties::ChangeOp(node, javascript()->OrdinaryHasInstance()); |
| 990 return Changed(node); |
| 991 } |
| 992 |
| 965 // ES6 section 18.2.2 isFinite ( number ) | 993 // ES6 section 18.2.2 isFinite ( number ) |
| 966 Reduction JSBuiltinReducer::ReduceGlobalIsFinite(Node* node) { | 994 Reduction JSBuiltinReducer::ReduceGlobalIsFinite(Node* node) { |
| 967 JSCallReduction r(node); | 995 JSCallReduction r(node); |
| 968 if (r.InputsMatchOne(Type::PlainPrimitive())) { | 996 if (r.InputsMatchOne(Type::PlainPrimitive())) { |
| 969 // isFinite(a:plain-primitive) -> NumberEqual(a', a') | 997 // isFinite(a:plain-primitive) -> NumberEqual(a', a') |
| 970 // where a' = NumberSubtract(ToNumber(a), ToNumber(a)) | 998 // where a' = NumberSubtract(ToNumber(a), ToNumber(a)) |
| 971 Node* input = ToNumber(r.GetJSCallInput(0)); | 999 Node* input = ToNumber(r.GetJSCallInput(0)); |
| 972 Node* diff = graph()->NewNode(simplified()->NumberSubtract(), input, input); | 1000 Node* diff = graph()->NewNode(simplified()->NumberSubtract(), input, input); |
| 973 Node* value = graph()->NewNode(simplified()->NumberEqual(), diff, diff); | 1001 Node* value = graph()->NewNode(simplified()->NumberEqual(), diff, diff); |
| 974 return Replace(value); | 1002 return Replace(value); |
| (...skipping 863 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1838 case kArrayValues: | 1866 case kArrayValues: |
| 1839 return ReduceArrayIterator(node, IterationKind::kValues); | 1867 return ReduceArrayIterator(node, IterationKind::kValues); |
| 1840 case kArrayIteratorNext: | 1868 case kArrayIteratorNext: |
| 1841 return ReduceArrayIteratorNext(node); | 1869 return ReduceArrayIteratorNext(node); |
| 1842 case kArrayPop: | 1870 case kArrayPop: |
| 1843 return ReduceArrayPop(node); | 1871 return ReduceArrayPop(node); |
| 1844 case kArrayPush: | 1872 case kArrayPush: |
| 1845 return ReduceArrayPush(node); | 1873 return ReduceArrayPush(node); |
| 1846 case kDateGetTime: | 1874 case kDateGetTime: |
| 1847 return ReduceDateGetTime(node); | 1875 return ReduceDateGetTime(node); |
| 1876 case kFunctionHasInstance: |
| 1877 return ReduceFunctionHasInstance(node); |
| 1878 break; |
| 1848 case kGlobalIsFinite: | 1879 case kGlobalIsFinite: |
| 1849 reduction = ReduceGlobalIsFinite(node); | 1880 reduction = ReduceGlobalIsFinite(node); |
| 1850 break; | 1881 break; |
| 1851 case kGlobalIsNaN: | 1882 case kGlobalIsNaN: |
| 1852 reduction = ReduceGlobalIsNaN(node); | 1883 reduction = ReduceGlobalIsNaN(node); |
| 1853 break; | 1884 break; |
| 1854 case kMathAbs: | 1885 case kMathAbs: |
| 1855 reduction = ReduceMathAbs(node); | 1886 reduction = ReduceMathAbs(node); |
| 1856 break; | 1887 break; |
| 1857 case kMathAcos: | 1888 case kMathAcos: |
| (...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2041 return jsgraph()->simplified(); | 2072 return jsgraph()->simplified(); |
| 2042 } | 2073 } |
| 2043 | 2074 |
| 2044 JSOperatorBuilder* JSBuiltinReducer::javascript() const { | 2075 JSOperatorBuilder* JSBuiltinReducer::javascript() const { |
| 2045 return jsgraph()->javascript(); | 2076 return jsgraph()->javascript(); |
| 2046 } | 2077 } |
| 2047 | 2078 |
| 2048 } // namespace compiler | 2079 } // namespace compiler |
| 2049 } // namespace internal | 2080 } // namespace internal |
| 2050 } // namespace v8 | 2081 } // namespace v8 |
| OLD | NEW |