Only clear monomorphic ICs on GC after Context exit
Review URL: https://chromiumcodereview.appspot.com/9255014 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@10431 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
98013d9824
commit
3a4bed8a7e
@ -741,6 +741,7 @@ void Context::Exit() {
|
||||
i::Context* last_context =
|
||||
isolate->handle_scope_implementer()->RestoreContext();
|
||||
isolate->set_context(last_context);
|
||||
isolate->set_context_exit_happened(true);
|
||||
}
|
||||
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
// Copyright 2011 the V8 project authors. All rights reserved.
|
||||
// Copyright 2012 the V8 project authors. All rights reserved.
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
@ -872,6 +872,8 @@ void Heap::MarkCompact(GCTracer* tracer) {
|
||||
isolate_->counters()->objs_since_last_full()->Set(0);
|
||||
|
||||
contexts_disposed_ = 0;
|
||||
|
||||
isolate_->set_context_exit_happened(false);
|
||||
}
|
||||
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
// Copyright 2011 the V8 project authors. All rights reserved.
|
||||
// Copyright 2012 the V8 project authors. All rights reserved.
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
|
@ -1,4 +1,4 @@
|
||||
// Copyright 2011 the V8 project authors. All rights reserved.
|
||||
// Copyright 2012 the V8 project authors. All rights reserved.
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
@ -1454,7 +1454,8 @@ Isolate::Isolate()
|
||||
has_installed_extensions_(false),
|
||||
string_tracker_(NULL),
|
||||
regexp_stack_(NULL),
|
||||
embedder_data_(NULL) {
|
||||
embedder_data_(NULL),
|
||||
context_exit_happened_(false) {
|
||||
TRACE_ISOLATE(constructor);
|
||||
|
||||
memset(isolate_addresses_, 0,
|
||||
|
@ -1023,6 +1023,13 @@ class Isolate {
|
||||
thread_local_top_.top_lookup_result_ = top;
|
||||
}
|
||||
|
||||
bool context_exit_happened() {
|
||||
return context_exit_happened_;
|
||||
}
|
||||
void set_context_exit_happened(bool context_exit_happened) {
|
||||
context_exit_happened_ = context_exit_happened;
|
||||
}
|
||||
|
||||
private:
|
||||
Isolate();
|
||||
|
||||
@ -1188,6 +1195,10 @@ class Isolate {
|
||||
unibrow::Mapping<unibrow::Ecma262Canonicalize> interp_canonicalize_mapping_;
|
||||
void* embedder_data_;
|
||||
|
||||
// The garbage collector should be a little more aggressive when it knows
|
||||
// that a context was recently exited.
|
||||
bool context_exit_happened_;
|
||||
|
||||
#if defined(V8_TARGET_ARCH_ARM) && !defined(__arm__) || \
|
||||
defined(V8_TARGET_ARCH_MIPS) && !defined(__mips__)
|
||||
bool simulator_initialized_;
|
||||
|
@ -1,4 +1,4 @@
|
||||
// Copyright 2011 the V8 project authors. All rights reserved.
|
||||
// Copyright 2012 the V8 project authors. All rights reserved.
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
@ -63,6 +63,7 @@ MarkCompactCollector::MarkCompactCollector() : // NOLINT
|
||||
compacting_(false),
|
||||
was_marked_incrementally_(false),
|
||||
collect_maps_(FLAG_collect_maps),
|
||||
flush_monomorphic_ics_(false),
|
||||
tracer_(NULL),
|
||||
migration_slots_buffer_(NULL),
|
||||
heap_(NULL),
|
||||
@ -515,6 +516,12 @@ void MarkCompactCollector::Prepare(GCTracer* tracer) {
|
||||
// order which is not implemented for incremental marking.
|
||||
collect_maps_ = FLAG_collect_maps && !was_marked_incrementally_;
|
||||
|
||||
// Monomorphic ICs are preserved when possible, but need to be flushed
|
||||
// when they might be keeping a Context alive, or when the heap is about
|
||||
// to be serialized.
|
||||
flush_monomorphic_ics_ =
|
||||
heap()->isolate()->context_exit_happened() || Serializer::enabled();
|
||||
|
||||
// Rather than passing the tracer around we stash it in a static member
|
||||
// variable.
|
||||
tracer_ = tracer;
|
||||
@ -881,7 +888,9 @@ class StaticMarkingVisitor : public StaticVisitorBase {
|
||||
static inline void VisitCodeTarget(Heap* heap, RelocInfo* rinfo) {
|
||||
ASSERT(RelocInfo::IsCodeTarget(rinfo->rmode()));
|
||||
Code* target = Code::GetCodeFromTargetAddress(rinfo->target_address());
|
||||
if (FLAG_cleanup_code_caches_at_gc && target->is_inline_cache_stub()) {
|
||||
if (FLAG_cleanup_code_caches_at_gc && target->is_inline_cache_stub()
|
||||
&& (target->ic_state() == MEGAMORPHIC ||
|
||||
heap->mark_compact_collector()->flush_monomorphic_ics_)) {
|
||||
IC::Clear(rinfo->pc());
|
||||
target = Code::GetCodeFromTargetAddress(rinfo->target_address());
|
||||
} else {
|
||||
|
@ -1,4 +1,4 @@
|
||||
// Copyright 2011 the V8 project authors. All rights reserved.
|
||||
// Copyright 2012 the V8 project authors. All rights reserved.
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
@ -580,6 +580,8 @@ class MarkCompactCollector {
|
||||
|
||||
bool collect_maps_;
|
||||
|
||||
bool flush_monomorphic_ics_;
|
||||
|
||||
// A pointer to the current stack-allocated GC tracer object during a full
|
||||
// collection (NULL before and after).
|
||||
GCTracer* tracer_;
|
||||
|
Loading…
Reference in New Issue
Block a user