Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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/effect-control-linearizer.h" | 5 #include "src/compiler/effect-control-linearizer.h" |
| 6 | 6 |
| 7 #include "src/code-factory.h" | 7 #include "src/code-factory.h" |
| 8 #include "src/compiler/access-builder.h" | 8 #include "src/compiler/access-builder.h" |
| 9 #include "src/compiler/compiler-source-position-table.h" | 9 #include "src/compiler/compiler-source-position-table.h" |
| 10 #include "src/compiler/js-graph.h" | 10 #include "src/compiler/js-graph.h" |
| (...skipping 720 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 731 break; | 731 break; |
| 732 case IrOpcode::kObjectIsSmi: | 732 case IrOpcode::kObjectIsSmi: |
| 733 result = LowerObjectIsSmi(node); | 733 result = LowerObjectIsSmi(node); |
| 734 break; | 734 break; |
| 735 case IrOpcode::kObjectIsString: | 735 case IrOpcode::kObjectIsString: |
| 736 result = LowerObjectIsString(node); | 736 result = LowerObjectIsString(node); |
| 737 break; | 737 break; |
| 738 case IrOpcode::kObjectIsUndetectable: | 738 case IrOpcode::kObjectIsUndetectable: |
| 739 result = LowerObjectIsUndetectable(node); | 739 result = LowerObjectIsUndetectable(node); |
| 740 break; | 740 break; |
| 741 case IrOpcode::kTypeOfIsFunction: | |
| 742 result = LowerObjectTypeOfIsFunction(node); | |
| 743 break; | |
| 741 case IrOpcode::kNewRestParameterElements: | 744 case IrOpcode::kNewRestParameterElements: |
| 742 result = LowerNewRestParameterElements(node); | 745 result = LowerNewRestParameterElements(node); |
| 743 break; | 746 break; |
| 744 case IrOpcode::kNewUnmappedArgumentsElements: | 747 case IrOpcode::kNewUnmappedArgumentsElements: |
| 745 result = LowerNewUnmappedArgumentsElements(node); | 748 result = LowerNewUnmappedArgumentsElements(node); |
| 746 break; | 749 break; |
| 747 case IrOpcode::kArrayBufferWasNeutered: | 750 case IrOpcode::kArrayBufferWasNeutered: |
| 748 result = LowerArrayBufferWasNeutered(node); | 751 result = LowerArrayBufferWasNeutered(node); |
| 749 break; | 752 break; |
| 750 case IrOpcode::kStringFromCharCode: | 753 case IrOpcode::kStringFromCharCode: |
| (...skipping 1089 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1840 __ Int32Constant(0)); | 1843 __ Int32Constant(0)); |
| 1841 __ Goto(&done, vfalse); | 1844 __ Goto(&done, vfalse); |
| 1842 | 1845 |
| 1843 __ Bind(&if_smi); | 1846 __ Bind(&if_smi); |
| 1844 __ Goto(&done, __ Int32Constant(0)); | 1847 __ Goto(&done, __ Int32Constant(0)); |
| 1845 | 1848 |
| 1846 __ Bind(&done); | 1849 __ Bind(&done); |
| 1847 return done.PhiAt(0); | 1850 return done.PhiAt(0); |
| 1848 } | 1851 } |
| 1849 | 1852 |
| 1853 Node* EffectControlLinearizer::LowerObjectTypeOfIsFunction(Node* node) { | |
| 1854 Node* value = node->InputAt(0); | |
| 1855 | |
| 1856 auto return_false = __ MakeDeferredLabel<3>(); | |
| 1857 auto done = __ MakeLabel<2>(MachineRepresentation::kBit); | |
| 1858 | |
| 1859 Node* check0 = ObjectIsSmi(value); | |
| 1860 __ GotoIf(check0, &return_false); | |
| 1861 | |
| 1862 Node* value_map = __ LoadField(AccessBuilder::ForMap(), value); | |
| 1863 Node* value_instance_type = | |
| 1864 __ LoadField(AccessBuilder::ForMapInstanceType(), value_map); | |
| 1865 Node* check1 = __ Uint32LessThanOrEqual( | |
| 1866 __ Uint32Constant(FIRST_FUNCTION_TYPE), value_instance_type); | |
| 1867 __ GotoUnless(check1, &return_false); | |
| 1868 Node* check2 = __ Uint32LessThanOrEqual( | |
| 1869 value_instance_type, __ Uint32Constant(LAST_FUNCTION_TYPE)); | |
| 1870 __ GotoUnless(check2, &return_false); | |
|
vabr (Chromium)
2017/02/15 23:36:41
This ignores proxies (which was helpfully pointed
Benedikt Meurer
2017/02/16 04:01:19
The code of ObjectIsCallable is the correct code f
| |
| 1871 | |
| 1872 __ Goto(&done, __ Int32Constant(1)); | |
| 1873 | |
| 1874 __ Bind(&return_false); | |
| 1875 __ Goto(&done, __ Int32Constant(0)); | |
| 1876 | |
| 1877 __ Bind(&done); | |
| 1878 return done.PhiAt(0); | |
| 1879 } | |
| 1880 | |
| 1850 Node* EffectControlLinearizer::LowerNewRestParameterElements(Node* node) { | 1881 Node* EffectControlLinearizer::LowerNewRestParameterElements(Node* node) { |
| 1851 int const formal_parameter_count = ParameterCountOf(node->op()); | 1882 int const formal_parameter_count = ParameterCountOf(node->op()); |
| 1852 | 1883 |
| 1853 Callable const callable = CodeFactory::NewRestParameterElements(isolate()); | 1884 Callable const callable = CodeFactory::NewRestParameterElements(isolate()); |
| 1854 Operator::Properties const properties = node->op()->properties(); | 1885 Operator::Properties const properties = node->op()->properties(); |
| 1855 CallDescriptor::Flags const flags = CallDescriptor::kNoFlags; | 1886 CallDescriptor::Flags const flags = CallDescriptor::kNoFlags; |
| 1856 CallDescriptor* desc = Linkage::GetStubCallDescriptor( | 1887 CallDescriptor* desc = Linkage::GetStubCallDescriptor( |
| 1857 isolate(), graph()->zone(), callable.descriptor(), 0, flags, properties); | 1888 isolate(), graph()->zone(), callable.descriptor(), 0, flags, properties); |
| 1858 return __ Call(desc, __ HeapConstant(callable.code()), | 1889 return __ Call(desc, __ HeapConstant(callable.code()), |
| 1859 __ IntPtrConstant(formal_parameter_count), | 1890 __ IntPtrConstant(formal_parameter_count), |
| (...skipping 935 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2795 return isolate()->factory(); | 2826 return isolate()->factory(); |
| 2796 } | 2827 } |
| 2797 | 2828 |
| 2798 Isolate* EffectControlLinearizer::isolate() const { | 2829 Isolate* EffectControlLinearizer::isolate() const { |
| 2799 return jsgraph()->isolate(); | 2830 return jsgraph()->isolate(); |
| 2800 } | 2831 } |
| 2801 | 2832 |
| 2802 } // namespace compiler | 2833 } // namespace compiler |
| 2803 } // namespace internal | 2834 } // namespace internal |
| 2804 } // namespace v8 | 2835 } // namespace v8 |
| OLD | NEW |