OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 | 5 |
6 #include "src/v8.h" | 6 #include "src/v8.h" |
7 | 7 |
8 #include "src/liveedit.h" | 8 #include "src/liveedit.h" |
9 | 9 |
10 #include "src/code-stubs.h" | 10 #include "src/code-stubs.h" |
(...skipping 977 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
988 // Name 'literals' is a misnomer. Rather it's a cache for complex object | 988 // Name 'literals' is a misnomer. Rather it's a cache for complex object |
989 // boilerplates and for a native context. We must clean cached values. | 989 // boilerplates and for a native context. We must clean cached values. |
990 // Additionally we may need to allocate a new array if number of literals | 990 // Additionally we may need to allocate a new array if number of literals |
991 // changed. | 991 // changed. |
992 class LiteralFixer { | 992 class LiteralFixer { |
993 public: | 993 public: |
994 static void PatchLiterals(FunctionInfoWrapper* compile_info_wrapper, | 994 static void PatchLiterals(FunctionInfoWrapper* compile_info_wrapper, |
995 Handle<SharedFunctionInfo> shared_info, | 995 Handle<SharedFunctionInfo> shared_info, |
996 Isolate* isolate) { | 996 Isolate* isolate) { |
997 int new_literal_count = compile_info_wrapper->GetLiteralCount(); | 997 int new_literal_count = compile_info_wrapper->GetLiteralCount(); |
998 if (new_literal_count > 0) { | |
999 new_literal_count += JSFunction::kLiteralsPrefixSize; | |
1000 } | |
1001 int old_literal_count = shared_info->num_literals(); | 998 int old_literal_count = shared_info->num_literals(); |
1002 | 999 |
1003 if (old_literal_count == new_literal_count) { | 1000 if (old_literal_count == new_literal_count) { |
1004 // If literal count didn't change, simply go over all functions | 1001 // If literal count didn't change, simply go over all functions |
1005 // and clear literal arrays. | 1002 // and clear literal arrays. |
1006 ClearValuesVisitor visitor; | 1003 ClearValuesVisitor visitor; |
1007 IterateJSFunctions(shared_info, &visitor); | 1004 IterateJSFunctions(shared_info, &visitor); |
1008 } else { | 1005 } else { |
1009 // When literal count changes, we have to create new array instances. | 1006 // When literal count changes, we have to create new array instances. |
1010 // Since we cannot create instances when iterating heap, we should first | 1007 // Since we cannot create instances when iterating heap, we should first |
1011 // collect all functions and fix their literal arrays. | 1008 // collect all functions and fix their literal arrays. |
1012 Handle<FixedArray> function_instances = | 1009 Handle<FixedArray> function_instances = |
1013 CollectJSFunctions(shared_info, isolate); | 1010 CollectJSFunctions(shared_info, isolate); |
1014 for (int i = 0; i < function_instances->length(); i++) { | 1011 for (int i = 0; i < function_instances->length(); i++) { |
1015 Handle<JSFunction> fun(JSFunction::cast(function_instances->get(i))); | 1012 Handle<JSFunction> fun(JSFunction::cast(function_instances->get(i))); |
1016 Handle<FixedArray> old_literals(fun->literals()); | |
1017 Handle<FixedArray> new_literals = | 1013 Handle<FixedArray> new_literals = |
1018 isolate->factory()->NewFixedArray(new_literal_count); | 1014 isolate->factory()->NewFixedArray(new_literal_count); |
1019 if (new_literal_count > 0) { | |
1020 Handle<Context> native_context; | |
1021 if (old_literals->length() > | |
1022 JSFunction::kLiteralNativeContextIndex) { | |
1023 native_context = Handle<Context>( | |
1024 JSFunction::NativeContextFromLiterals(fun->literals())); | |
1025 } else { | |
1026 native_context = Handle<Context>(fun->context()->native_context()); | |
1027 } | |
1028 new_literals->set(JSFunction::kLiteralNativeContextIndex, | |
1029 *native_context); | |
1030 } | |
1031 fun->set_literals(*new_literals); | 1015 fun->set_literals(*new_literals); |
1032 } | 1016 } |
1033 | 1017 |
1034 shared_info->set_num_literals(new_literal_count); | 1018 shared_info->set_num_literals(new_literal_count); |
1035 } | 1019 } |
1036 } | 1020 } |
1037 | 1021 |
1038 private: | 1022 private: |
1039 // Iterates all function instances in the HEAP that refers to the | 1023 // Iterates all function instances in the HEAP that refers to the |
1040 // provided shared_info. | 1024 // provided shared_info. |
(...skipping 27 matching lines...) Expand all Loading... |
1068 IterateJSFunctions(shared_info, &collect_visitor); | 1052 IterateJSFunctions(shared_info, &collect_visitor); |
1069 } | 1053 } |
1070 return result; | 1054 return result; |
1071 } | 1055 } |
1072 | 1056 |
1073 class ClearValuesVisitor { | 1057 class ClearValuesVisitor { |
1074 public: | 1058 public: |
1075 void visit(JSFunction* fun) { | 1059 void visit(JSFunction* fun) { |
1076 FixedArray* literals = fun->literals(); | 1060 FixedArray* literals = fun->literals(); |
1077 int len = literals->length(); | 1061 int len = literals->length(); |
1078 for (int j = JSFunction::kLiteralsPrefixSize; j < len; j++) { | 1062 for (int j = 0; j < len; j++) { |
1079 literals->set_undefined(j); | 1063 literals->set_undefined(j); |
1080 } | 1064 } |
1081 } | 1065 } |
1082 }; | 1066 }; |
1083 | 1067 |
1084 class CountVisitor { | 1068 class CountVisitor { |
1085 public: | 1069 public: |
1086 void visit(JSFunction* fun) { | 1070 void visit(JSFunction* fun) { |
1087 count++; | 1071 count++; |
1088 } | 1072 } |
(...skipping 981 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2070 void LiveEditFunctionTracker::RecordRootFunctionInfo(Handle<Code> code) { | 2054 void LiveEditFunctionTracker::RecordRootFunctionInfo(Handle<Code> code) { |
2071 isolate_->active_function_info_listener()->FunctionCode(code); | 2055 isolate_->active_function_info_listener()->FunctionCode(code); |
2072 } | 2056 } |
2073 | 2057 |
2074 | 2058 |
2075 bool LiveEditFunctionTracker::IsActive(Isolate* isolate) { | 2059 bool LiveEditFunctionTracker::IsActive(Isolate* isolate) { |
2076 return isolate->active_function_info_listener() != NULL; | 2060 return isolate->active_function_info_listener() != NULL; |
2077 } | 2061 } |
2078 | 2062 |
2079 } } // namespace v8::internal | 2063 } } // namespace v8::internal |
OLD | NEW |