Implement ClearFunctionTypeFeedback for test cases.

R=danno@chromium.org
TEST=mjsunit/compiler/inline-construct

Review URL: https://chromiumcodereview.appspot.com/10332010

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@11509 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 9f75aa3d
...@@ -1186,16 +1186,7 @@ class StaticMarkingVisitor : public StaticVisitorBase { ...@@ -1186,16 +1186,7 @@ class StaticMarkingVisitor : public StaticVisitorBase {
Heap* heap = map->GetHeap(); Heap* heap = map->GetHeap();
Code* code = reinterpret_cast<Code*>(object); Code* code = reinterpret_cast<Code*>(object);
if (FLAG_cleanup_code_caches_at_gc) { if (FLAG_cleanup_code_caches_at_gc) {
Object* raw_info = code->type_feedback_info(); code->ClearTypeFeedbackCells(heap);
if (raw_info->IsTypeFeedbackInfo()) {
TypeFeedbackCells* type_feedback_cells =
TypeFeedbackInfo::cast(raw_info)->type_feedback_cells();
for (int i = 0; i < type_feedback_cells->CellCount(); i++) {
ASSERT(type_feedback_cells->AstId(i)->IsSmi());
JSGlobalPropertyCell* cell = type_feedback_cells->Cell(i);
cell->set_value(TypeFeedbackCells::RawUninitializedSentinel(heap));
}
}
} }
code->CodeIterateBody<StaticMarkingVisitor>(heap); code->CodeIterateBody<StaticMarkingVisitor>(heap);
} }
......
...@@ -8320,6 +8320,20 @@ void Code::ClearInlineCaches() { ...@@ -8320,6 +8320,20 @@ void Code::ClearInlineCaches() {
} }
void Code::ClearTypeFeedbackCells(Heap* heap) {
Object* raw_info = type_feedback_info();
if (raw_info->IsTypeFeedbackInfo()) {
TypeFeedbackCells* type_feedback_cells =
TypeFeedbackInfo::cast(raw_info)->type_feedback_cells();
for (int i = 0; i < type_feedback_cells->CellCount(); i++) {
ASSERT(type_feedback_cells->AstId(i)->IsSmi());
JSGlobalPropertyCell* cell = type_feedback_cells->Cell(i);
cell->set_value(TypeFeedbackCells::RawUninitializedSentinel(heap));
}
}
}
#ifdef ENABLE_DISASSEMBLER #ifdef ENABLE_DISASSEMBLER
void DeoptimizationInputData::DeoptimizationInputDataPrint(FILE* out) { void DeoptimizationInputData::DeoptimizationInputDataPrint(FILE* out) {
......
...@@ -4440,6 +4440,7 @@ class Code: public HeapObject { ...@@ -4440,6 +4440,7 @@ class Code: public HeapObject {
void CodeVerify(); void CodeVerify();
#endif #endif
void ClearInlineCaches(); void ClearInlineCaches();
void ClearTypeFeedbackCells(Heap* heap);
// Max loop nesting marker used to postpose OSR. We don't take loop // Max loop nesting marker used to postpose OSR. We don't take loop
// nesting that is deeper than 5 levels into account. // nesting that is deeper than 5 levels into account.
......
...@@ -8277,6 +8277,19 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_DeoptimizeFunction) { ...@@ -8277,6 +8277,19 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_DeoptimizeFunction) {
} }
RUNTIME_FUNCTION(MaybeObject*, Runtime_ClearFunctionTypeFeedback) {
HandleScope scope(isolate);
ASSERT(args.length() == 1);
CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0);
Code* unoptimized = function->shared()->code();
if (unoptimized->kind() == Code::FUNCTION) {
unoptimized->ClearInlineCaches();
unoptimized->ClearTypeFeedbackCells(isolate->heap());
}
return isolate->heap()->undefined_value();
}
RUNTIME_FUNCTION(MaybeObject*, Runtime_RunningInSimulator) { RUNTIME_FUNCTION(MaybeObject*, Runtime_RunningInSimulator) {
#if defined(USE_SIMULATOR) #if defined(USE_SIMULATOR)
return isolate->heap()->true_value(); return isolate->heap()->true_value();
......
...@@ -89,6 +89,7 @@ namespace internal { ...@@ -89,6 +89,7 @@ namespace internal {
F(NotifyDeoptimized, 1, 1) \ F(NotifyDeoptimized, 1, 1) \
F(NotifyOSR, 0, 1) \ F(NotifyOSR, 0, 1) \
F(DeoptimizeFunction, 1, 1) \ F(DeoptimizeFunction, 1, 1) \
F(ClearFunctionTypeFeedback, 1, 1) \
F(RunningInSimulator, 0, 1) \ F(RunningInSimulator, 0, 1) \
F(OptimizeFunctionOnNextCall, -1, 1) \ F(OptimizeFunctionOnNextCall, -1, 1) \
F(GetOptimizationStatus, 1, 1) \ F(GetOptimizationStatus, 1, 1) \
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// Flags: --allow-natives-syntax --expose-gc --inline-construct // Flags: --allow-natives-syntax --inline-construct
// Test inlining of constructor calls. // Test inlining of constructor calls.
...@@ -68,7 +68,9 @@ function TestInAllContexts(constructor) { ...@@ -68,7 +68,9 @@ function TestInAllContexts(constructor) {
%DeoptimizeFunction(value_context); %DeoptimizeFunction(value_context);
%DeoptimizeFunction(test_context); %DeoptimizeFunction(test_context);
%DeoptimizeFunction(effect_context); %DeoptimizeFunction(effect_context);
gc(); // Makes V8 forget about type information for *_context. %ClearFunctionTypeFeedback(value_context);
%ClearFunctionTypeFeedback(test_context);
%ClearFunctionTypeFeedback(effect_context);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment