OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 960 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
971 receiver_maps->Add(new_receiver_map); | 971 receiver_maps->Add(new_receiver_map); |
972 return true; | 972 return true; |
973 } | 973 } |
974 | 974 |
975 | 975 |
976 bool IC::UpdatePolymorphicIC(State state, | 976 bool IC::UpdatePolymorphicIC(State state, |
977 Handle<JSObject> receiver, | 977 Handle<JSObject> receiver, |
978 Handle<String> name, | 978 Handle<String> name, |
979 Handle<Code> code, | 979 Handle<Code> code, |
980 StrictModeFlag strict_mode) { | 980 StrictModeFlag strict_mode) { |
981 if (code->type() == Code::NORMAL) return false; | |
982 if (target()->ic_state() == MONOMORPHIC && | |
983 target()->type() == Code::NORMAL) { | |
984 return false; | |
985 } | |
986 | |
987 MapHandleList receiver_maps; | 981 MapHandleList receiver_maps; |
988 CodeHandleList handlers; | 982 CodeHandleList handlers; |
989 | 983 |
990 int number_of_valid_maps; | 984 int number_of_valid_maps; |
991 int handler_to_overwrite = -1; | 985 int handler_to_overwrite = -1; |
992 Handle<Map> new_receiver_map(receiver->map()); | 986 Handle<Map> new_receiver_map(receiver->map()); |
993 { | 987 { |
994 DisallowHeapAllocation no_gc; | 988 DisallowHeapAllocation no_gc; |
995 target()->FindAllMaps(&receiver_maps); | 989 if (target()->ic_state() == POLYMORPHIC || |
| 990 (target()->ic_state() == MONOMORPHIC && |
| 991 target()->type() != Code::NORMAL)) { |
| 992 target()->FindAllMaps(&receiver_maps); |
| 993 } |
| 994 |
996 int number_of_maps = receiver_maps.length(); | 995 int number_of_maps = receiver_maps.length(); |
997 number_of_valid_maps = number_of_maps; | 996 number_of_valid_maps = number_of_maps; |
998 | 997 |
999 for (int i = 0; i < number_of_maps; i++) { | 998 for (int i = 0; i < number_of_maps; i++) { |
1000 Handle<Map> map = receiver_maps.at(i); | 999 Handle<Map> map = receiver_maps.at(i); |
1001 // Filter out deprecated maps to ensure its instances get migrated. | 1000 // Filter out deprecated maps to ensure its instances get migrated. |
1002 if (map->is_deprecated()) { | 1001 if (map->is_deprecated()) { |
1003 number_of_valid_maps--; | 1002 number_of_valid_maps--; |
1004 // If the receiver map is already in the polymorphic IC, this indicates | 1003 // If the receiver map is already in the polymorphic IC, this indicates |
1005 // there was a prototoype chain failure. In that case, just overwrite the | 1004 // there was a prototoype chain failure. In that case, just overwrite the |
1006 // handler. | 1005 // handler. |
1007 } else if (map.is_identical_to(new_receiver_map)) { | 1006 } else if (map.is_identical_to(new_receiver_map)) { |
1008 number_of_valid_maps--; | 1007 number_of_valid_maps--; |
1009 handler_to_overwrite = i; | 1008 handler_to_overwrite = i; |
1010 } | 1009 } |
1011 } | 1010 } |
1012 | 1011 |
1013 if (number_of_valid_maps >= 4) return false; | 1012 if (number_of_valid_maps >= 4) return false; |
1014 | 1013 |
1015 // Only allow 0 maps in case target() was reset to UNINITIALIZED by the GC. | 1014 if (number_of_maps > 0) { |
1016 // In that case, allow the IC to go back monomorphic. | 1015 target()->FindAllCode(&handlers, receiver_maps.length()); |
1017 if (number_of_maps == 0 && target()->ic_state() != UNINITIALIZED) { | |
1018 return false; | |
1019 } | 1016 } |
1020 target()->FindAllCode(&handlers, receiver_maps.length()); | |
1021 } | 1017 } |
1022 | 1018 |
1023 number_of_valid_maps++; | 1019 number_of_valid_maps++; |
1024 if (handler_to_overwrite >= 0) { | 1020 if (handler_to_overwrite >= 0) { |
1025 handlers.Set(handler_to_overwrite, code); | 1021 handlers.Set(handler_to_overwrite, code); |
1026 } else { | 1022 } else { |
1027 receiver_maps.Add(new_receiver_map); | 1023 receiver_maps.Add(new_receiver_map); |
1028 handlers.Add(code); | 1024 handlers.Add(code); |
1029 } | 1025 } |
1030 | 1026 |
(...skipping 2050 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3081 #undef ADDR | 3077 #undef ADDR |
3082 }; | 3078 }; |
3083 | 3079 |
3084 | 3080 |
3085 Address IC::AddressFromUtilityId(IC::UtilityId id) { | 3081 Address IC::AddressFromUtilityId(IC::UtilityId id) { |
3086 return IC_utilities[id]; | 3082 return IC_utilities[id]; |
3087 } | 3083 } |
3088 | 3084 |
3089 | 3085 |
3090 } } // namespace v8::internal | 3086 } } // namespace v8::internal |
OLD | NEW |