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/graph-inl.h" | 5 #include "src/compiler/graph-inl.h" |
6 #include "src/compiler/js-operator.h" | 6 #include "src/compiler/js-operator.h" |
7 #include "src/compiler/node.h" | 7 #include "src/compiler/node.h" |
8 #include "src/compiler/node-properties-inl.h" | 8 #include "src/compiler/node-properties-inl.h" |
9 #include "src/compiler/node-properties.h" | 9 #include "src/compiler/node-properties.h" |
10 #include "src/compiler/simplified-operator.h" | 10 #include "src/compiler/simplified-operator.h" |
(...skipping 806 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
817 // TODO(rossberg): implement | 817 // TODO(rossberg): implement |
818 #define DEFINE_METHOD(x) \ | 818 #define DEFINE_METHOD(x) \ |
819 Bounds Typer::Visitor::Type##x(Node* node) { return Bounds(Type::None()); } | 819 Bounds Typer::Visitor::Type##x(Node* node) { return Bounds(Type::None()); } |
820 MACHINE_OP_LIST(DEFINE_METHOD) | 820 MACHINE_OP_LIST(DEFINE_METHOD) |
821 #undef DEFINE_METHOD | 821 #undef DEFINE_METHOD |
822 | 822 |
823 | 823 |
824 // Heap constants. | 824 // Heap constants. |
825 | 825 |
826 Type* Typer::Visitor::TypeConstant(Handle<Object> value) { | 826 Type* Typer::Visitor::TypeConstant(Handle<Object> value) { |
827 if (value->IsJSFunction() && JSFunction::cast(*value)->IsBuiltin() && | 827 if (value->IsJSFunction()) { |
828 !context().is_null()) { | 828 if (JSFunction::cast(*value)->shared()->HasBuiltinFunctionId()) { |
829 Handle<Context> native = | 829 switch (JSFunction::cast(*value)->shared()->builtin_function_id()) { |
830 handle(context().ToHandleChecked()->native_context(), isolate()); | 830 // TODO(rossberg): can't express overloading |
831 if (*value == native->math_abs_fun()) { | 831 case kMathAbs: |
832 return typer_->number_fun1_; // TODO(rossberg): can't express overloading | 832 return typer_->number_fun1_; |
833 } else if (*value == native->math_acos_fun()) { | 833 case kMathAcos: |
834 return typer_->number_fun1_; | 834 return typer_->number_fun1_; |
835 } else if (*value == native->math_asin_fun()) { | 835 case kMathAsin: |
836 return typer_->number_fun1_; | 836 return typer_->number_fun1_; |
837 } else if (*value == native->math_atan_fun()) { | 837 case kMathAtan: |
838 return typer_->number_fun1_; | 838 return typer_->number_fun1_; |
839 } else if (*value == native->math_atan2_fun()) { | 839 case kMathAtan2: |
840 return typer_->number_fun2_; | 840 return typer_->number_fun2_; |
841 } else if (*value == native->math_ceil_fun()) { | 841 case kMathCeil: |
842 return typer_->weakint_fun1_; | 842 return typer_->weakint_fun1_; |
843 } else if (*value == native->math_cos_fun()) { | 843 case kMathCos: |
844 return typer_->number_fun1_; | 844 return typer_->number_fun1_; |
845 } else if (*value == native->math_exp_fun()) { | 845 case kMathExp: |
846 return typer_->number_fun1_; | 846 return typer_->number_fun1_; |
847 } else if (*value == native->math_floor_fun()) { | 847 case kMathFloor: |
848 return typer_->weakint_fun1_; | 848 return typer_->weakint_fun1_; |
849 } else if (*value == native->math_imul_fun()) { | 849 case kMathImul: |
850 return typer_->imul_fun_; | 850 return typer_->imul_fun_; |
851 } else if (*value == native->math_log_fun()) { | 851 case kMathLog: |
852 return typer_->number_fun1_; | 852 return typer_->number_fun1_; |
853 } else if (*value == native->math_pow_fun()) { | 853 case kMathPow: |
854 return typer_->number_fun2_; | 854 return typer_->number_fun2_; |
855 } else if (*value == native->math_random_fun()) { | 855 case kMathRandom: |
856 return typer_->random_fun_; | 856 return typer_->random_fun_; |
857 } else if (*value == native->math_round_fun()) { | 857 case kMathRound: |
858 return typer_->weakint_fun1_; | 858 return typer_->weakint_fun1_; |
859 } else if (*value == native->math_sin_fun()) { | 859 case kMathSin: |
860 return typer_->number_fun1_; | 860 return typer_->number_fun1_; |
861 } else if (*value == native->math_sqrt_fun()) { | 861 case kMathSqrt: |
862 return typer_->number_fun1_; | 862 return typer_->number_fun1_; |
863 } else if (*value == native->math_tan_fun()) { | 863 case kMathTan: |
864 return typer_->number_fun1_; | 864 return typer_->number_fun1_; |
865 } else if (*value == native->array_buffer_fun()) { | 865 default: |
866 return typer_->array_buffer_fun_; | 866 break; |
867 } else if (*value == native->int8_array_fun()) { | 867 } |
868 return typer_->int8_array_fun_; | 868 } else if (JSFunction::cast(*value)->IsBuiltin() && !context().is_null()) { |
869 } else if (*value == native->int16_array_fun()) { | 869 Handle<Context> native = |
870 return typer_->int16_array_fun_; | 870 handle(context().ToHandleChecked()->native_context(), isolate()); |
871 } else if (*value == native->int32_array_fun()) { | 871 if (*value == native->array_buffer_fun()) { |
872 return typer_->int32_array_fun_; | 872 return typer_->array_buffer_fun_; |
873 } else if (*value == native->uint8_array_fun()) { | 873 } else if (*value == native->int8_array_fun()) { |
874 return typer_->uint8_array_fun_; | 874 return typer_->int8_array_fun_; |
875 } else if (*value == native->uint16_array_fun()) { | 875 } else if (*value == native->int16_array_fun()) { |
876 return typer_->uint16_array_fun_; | 876 return typer_->int16_array_fun_; |
877 } else if (*value == native->uint32_array_fun()) { | 877 } else if (*value == native->int32_array_fun()) { |
878 return typer_->uint32_array_fun_; | 878 return typer_->int32_array_fun_; |
879 } else if (*value == native->float32_array_fun()) { | 879 } else if (*value == native->uint8_array_fun()) { |
880 return typer_->float32_array_fun_; | 880 return typer_->uint8_array_fun_; |
881 } else if (*value == native->float64_array_fun()) { | 881 } else if (*value == native->uint16_array_fun()) { |
882 return typer_->float64_array_fun_; | 882 return typer_->uint16_array_fun_; |
| 883 } else if (*value == native->uint32_array_fun()) { |
| 884 return typer_->uint32_array_fun_; |
| 885 } else if (*value == native->float32_array_fun()) { |
| 886 return typer_->float32_array_fun_; |
| 887 } else if (*value == native->float64_array_fun()) { |
| 888 return typer_->float64_array_fun_; |
| 889 } |
883 } | 890 } |
884 } | 891 } |
885 return Type::Constant(value, zone()); | 892 return Type::Constant(value, zone()); |
886 } | 893 } |
887 | 894 |
888 | 895 |
889 namespace { | 896 namespace { |
890 | 897 |
891 class TyperDecorator : public GraphDecorator { | 898 class TyperDecorator : public GraphDecorator { |
892 public: | 899 public: |
893 explicit TyperDecorator(Typer* typer) : typer_(typer) {} | 900 explicit TyperDecorator(Typer* typer) : typer_(typer) {} |
894 virtual void Decorate(Node* node) { typer_->Init(node); } | 901 virtual void Decorate(Node* node) { typer_->Init(node); } |
895 | 902 |
896 private: | 903 private: |
897 Typer* typer_; | 904 Typer* typer_; |
898 }; | 905 }; |
899 | 906 |
900 } | 907 } |
901 | 908 |
902 | 909 |
903 void Typer::DecorateGraph(Graph* graph) { | 910 void Typer::DecorateGraph(Graph* graph) { |
904 graph->AddDecorator(new (zone()) TyperDecorator(this)); | 911 graph->AddDecorator(new (zone()) TyperDecorator(this)); |
905 } | 912 } |
906 | 913 |
907 } | 914 } |
908 } | 915 } |
909 } // namespace v8::internal::compiler | 916 } // namespace v8::internal::compiler |
OLD | NEW |