| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 | 2 |
| 3 #include <stdlib.h> | 3 #include <stdlib.h> |
| 4 | 4 |
| 5 #include "v8.h" | 5 #include "v8.h" |
| 6 | 6 |
| 7 #include "compilation-cache.h" | 7 #include "compilation-cache.h" |
| 8 #include "execution.h" | 8 #include "execution.h" |
| 9 #include "factory.h" | 9 #include "factory.h" |
| 10 #include "macro-assembler.h" | 10 #include "macro-assembler.h" |
| (...skipping 963 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 974 } | 974 } |
| 975 | 975 |
| 976 // Check function is compiled. | 976 // Check function is compiled. |
| 977 Object* func_value = Isolate::Current()->context()->global_object()-> | 977 Object* func_value = Isolate::Current()->context()->global_object()-> |
| 978 GetProperty(*foo_name)->ToObjectChecked(); | 978 GetProperty(*foo_name)->ToObjectChecked(); |
| 979 CHECK(func_value->IsJSFunction()); | 979 CHECK(func_value->IsJSFunction()); |
| 980 Handle<JSFunction> function(JSFunction::cast(func_value)); | 980 Handle<JSFunction> function(JSFunction::cast(func_value)); |
| 981 CHECK(function->shared()->is_compiled()); | 981 CHECK(function->shared()->is_compiled()); |
| 982 | 982 |
| 983 // The code will survive at least two GCs. | 983 // The code will survive at least two GCs. |
| 984 HEAP->CollectAllGarbage(Heap::kNoGCFlags); | 984 HEAP->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); |
| 985 HEAP->CollectAllGarbage(Heap::kNoGCFlags); | 985 HEAP->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); |
| 986 CHECK(function->shared()->is_compiled()); | 986 CHECK(function->shared()->is_compiled()); |
| 987 | 987 |
| 988 // Simulate several GCs that use full marking. | 988 // Simulate several GCs that use full marking. |
| 989 const int kAgingThreshold = 6; | 989 const int kAgingThreshold = 6; |
| 990 for (int i = 0; i < kAgingThreshold; i++) { | 990 for (int i = 0; i < kAgingThreshold; i++) { |
| 991 HEAP->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); | 991 HEAP->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); |
| 992 } | 992 } |
| 993 | 993 |
| 994 // foo should no longer be in the compilation cache | 994 // foo should no longer be in the compilation cache |
| 995 CHECK(!function->shared()->is_compiled() || function->IsOptimized()); | 995 CHECK(!function->shared()->is_compiled() || function->IsOptimized()); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 1021 } | 1021 } |
| 1022 | 1022 |
| 1023 // Check function is compiled. | 1023 // Check function is compiled. |
| 1024 Object* func_value = Isolate::Current()->context()->global_object()-> | 1024 Object* func_value = Isolate::Current()->context()->global_object()-> |
| 1025 GetProperty(*foo_name)->ToObjectChecked(); | 1025 GetProperty(*foo_name)->ToObjectChecked(); |
| 1026 CHECK(func_value->IsJSFunction()); | 1026 CHECK(func_value->IsJSFunction()); |
| 1027 Handle<JSFunction> function(JSFunction::cast(func_value)); | 1027 Handle<JSFunction> function(JSFunction::cast(func_value)); |
| 1028 CHECK(function->shared()->is_compiled()); | 1028 CHECK(function->shared()->is_compiled()); |
| 1029 | 1029 |
| 1030 // The code will survive at least two GCs. | 1030 // The code will survive at least two GCs. |
| 1031 HEAP->CollectAllGarbage(Heap::kNoGCFlags); | 1031 HEAP->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); |
| 1032 HEAP->CollectAllGarbage(Heap::kNoGCFlags); | 1032 HEAP->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); |
| 1033 CHECK(function->shared()->is_compiled()); | 1033 CHECK(function->shared()->is_compiled()); |
| 1034 | 1034 |
| 1035 // Simulate several GCs that use incremental marking. | 1035 // Simulate several GCs that use incremental marking. |
| 1036 const int kAgingThreshold = 6; | 1036 const int kAgingThreshold = 6; |
| 1037 for (int i = 0; i < kAgingThreshold; i++) { | 1037 for (int i = 0; i < kAgingThreshold; i++) { |
| 1038 HEAP->incremental_marking()->Abort(); | 1038 HEAP->incremental_marking()->Abort(); |
| 1039 SimulateIncrementalMarking(); | 1039 SimulateIncrementalMarking(); |
| 1040 HEAP->CollectAllGarbage(Heap::kNoGCFlags); | 1040 HEAP->CollectAllGarbage(Heap::kNoGCFlags); |
| 1041 } | 1041 } |
| 1042 CHECK(!function->shared()->is_compiled() || function->IsOptimized()); | 1042 CHECK(!function->shared()->is_compiled() || function->IsOptimized()); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1082 "};" | 1082 "};" |
| 1083 "foo();" | 1083 "foo();" |
| 1084 "var bar = function() {" | 1084 "var bar = function() {" |
| 1085 " var x = 23;" | 1085 " var x = 23;" |
| 1086 "};" | 1086 "};" |
| 1087 "bar();"; | 1087 "bar();"; |
| 1088 Handle<String> foo_name = FACTORY->LookupAsciiSymbol("foo"); | 1088 Handle<String> foo_name = FACTORY->LookupAsciiSymbol("foo"); |
| 1089 Handle<String> bar_name = FACTORY->LookupAsciiSymbol("bar"); | 1089 Handle<String> bar_name = FACTORY->LookupAsciiSymbol("bar"); |
| 1090 | 1090 |
| 1091 // Perfrom one initial GC to enable code flushing. | 1091 // Perfrom one initial GC to enable code flushing. |
| 1092 HEAP->CollectAllGarbage(Heap::kNoGCFlags); | 1092 HEAP->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); |
| 1093 | 1093 |
| 1094 // This compile will add the code to the compilation cache. | 1094 // This compile will add the code to the compilation cache. |
| 1095 { v8::HandleScope scope; | 1095 { v8::HandleScope scope; |
| 1096 CompileRun(source); | 1096 CompileRun(source); |
| 1097 } | 1097 } |
| 1098 | 1098 |
| 1099 // Check functions are compiled. | 1099 // Check functions are compiled. |
| 1100 Object* func_value = Isolate::Current()->context()->global_object()-> | 1100 Object* func_value = Isolate::Current()->context()->global_object()-> |
| 1101 GetProperty(*foo_name)->ToObjectChecked(); | 1101 GetProperty(*foo_name)->ToObjectChecked(); |
| 1102 CHECK(func_value->IsJSFunction()); | 1102 CHECK(func_value->IsJSFunction()); |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1155 } | 1155 } |
| 1156 | 1156 |
| 1157 // Check function is compiled. | 1157 // Check function is compiled. |
| 1158 Object* func_value = Isolate::Current()->context()->global_object()-> | 1158 Object* func_value = Isolate::Current()->context()->global_object()-> |
| 1159 GetProperty(*foo_name)->ToObjectChecked(); | 1159 GetProperty(*foo_name)->ToObjectChecked(); |
| 1160 CHECK(func_value->IsJSFunction()); | 1160 CHECK(func_value->IsJSFunction()); |
| 1161 Handle<JSFunction> function(JSFunction::cast(func_value)); | 1161 Handle<JSFunction> function(JSFunction::cast(func_value)); |
| 1162 CHECK(function->shared()->is_compiled()); | 1162 CHECK(function->shared()->is_compiled()); |
| 1163 | 1163 |
| 1164 // The code will survive at least two GCs. | 1164 // The code will survive at least two GCs. |
| 1165 HEAP->CollectAllGarbage(Heap::kNoGCFlags); | 1165 HEAP->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); |
| 1166 HEAP->CollectAllGarbage(Heap::kNoGCFlags); | 1166 HEAP->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); |
| 1167 CHECK(function->shared()->is_compiled()); | 1167 CHECK(function->shared()->is_compiled()); |
| 1168 | 1168 |
| 1169 // Bump the code age so that flushing is triggered. | 1169 // Bump the code age so that flushing is triggered. |
| 1170 const int kAgingThreshold = 6; | 1170 const int kAgingThreshold = 6; |
| 1171 for (int i = 0; i < kAgingThreshold; i++) { | 1171 for (int i = 0; i < kAgingThreshold; i++) { |
| 1172 function->shared()->code()->MakeOlder(static_cast<MarkingParity>(i % 2)); | 1172 function->shared()->code()->MakeOlder(static_cast<MarkingParity>(i % 2)); |
| 1173 } | 1173 } |
| 1174 | 1174 |
| 1175 // Simulate incremental marking so that the function is enqueued as | 1175 // Simulate incremental marking so that the function is enqueued as |
| 1176 // code flushing candidate. | 1176 // code flushing candidate. |
| (...skipping 1333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2510 } | 2510 } |
| 2511 | 2511 |
| 2512 | 2512 |
| 2513 TEST(Regress159140) { | 2513 TEST(Regress159140) { |
| 2514 i::FLAG_allow_natives_syntax = true; | 2514 i::FLAG_allow_natives_syntax = true; |
| 2515 i::FLAG_flush_code_incrementally = true; | 2515 i::FLAG_flush_code_incrementally = true; |
| 2516 InitializeVM(); | 2516 InitializeVM(); |
| 2517 v8::HandleScope scope; | 2517 v8::HandleScope scope; |
| 2518 | 2518 |
| 2519 // Perform one initial GC to enable code flushing. | 2519 // Perform one initial GC to enable code flushing. |
| 2520 HEAP->CollectAllGarbage(Heap::kNoGCFlags); | 2520 HEAP->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); |
| 2521 | 2521 |
| 2522 // Prepare several closures that are all eligible for code flushing | 2522 // Prepare several closures that are all eligible for code flushing |
| 2523 // because all reachable ones are not optimized. Make sure that the | 2523 // because all reachable ones are not optimized. Make sure that the |
| 2524 // optimized code object is directly reachable through a handle so | 2524 // optimized code object is directly reachable through a handle so |
| 2525 // that it is marked black during incremental marking. | 2525 // that it is marked black during incremental marking. |
| 2526 Handle<Code> code; | 2526 Handle<Code> code; |
| 2527 { | 2527 { |
| 2528 HandleScope inner_scope; | 2528 HandleScope inner_scope; |
| 2529 CompileRun("function h(x) {}" | 2529 CompileRun("function h(x) {}" |
| 2530 "function mkClosure() {" | 2530 "function mkClosure() {" |
| (...skipping 30 matching lines...) Expand all Loading... |
| 2561 // Simulate incremental marking so that the functions are enqueued as | 2561 // Simulate incremental marking so that the functions are enqueued as |
| 2562 // code flushing candidates. Then optimize one function. Finally | 2562 // code flushing candidates. Then optimize one function. Finally |
| 2563 // finish the GC to complete code flushing. | 2563 // finish the GC to complete code flushing. |
| 2564 SimulateIncrementalMarking(); | 2564 SimulateIncrementalMarking(); |
| 2565 CompileRun("%OptimizeFunctionOnNextCall(g); g(3);"); | 2565 CompileRun("%OptimizeFunctionOnNextCall(g); g(3);"); |
| 2566 HEAP->CollectAllGarbage(Heap::kNoGCFlags); | 2566 HEAP->CollectAllGarbage(Heap::kNoGCFlags); |
| 2567 | 2567 |
| 2568 // Unoptimized code is missing and the deoptimizer will go ballistic. | 2568 // Unoptimized code is missing and the deoptimizer will go ballistic. |
| 2569 CompileRun("g('bozo');"); | 2569 CompileRun("g('bozo');"); |
| 2570 } | 2570 } |
| OLD | NEW |