Revert of Preprocess structured stack trace on GC to get rid of code reference. (patchset #5 id:80001 of https://codereview.chromium.org/1103843002/)

Reason for revert:
Broke GCStress

Original issue's description:
> Preprocess structured stack trace on GC to get rid of code reference.
>
> R=verwaest@chromium.org
> BUG=v8:2340
> LOG=N
>
> Committed: https://crrev.com/462ffa1dfa0ab3a851ea0294470d1ed7ed12dd56
> Cr-Commit-Position: refs/heads/master@{#28085}

TBR=verwaest@chromium.org,ulan@chromium.org,hpayer@chromium.org,yurys@chromium.org,yangguo@chromium.org
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=v8:2340

Review URL: https://codereview.chromium.org/1102383002

Cr-Commit-Position: refs/heads/master@{#28086}
This commit is contained in:
dslomov 2015-04-27 08:53:46 -07:00 committed by Commit bot
parent 462ffa1dfa
commit 919c54910f
9 changed files with 5 additions and 76 deletions

View File

@ -644,10 +644,6 @@ class Factory final {
isolate()->heap()->set_string_table(*table);
}
inline void set_weak_stack_trace_list(Handle<WeakFixedArray> list) {
isolate()->heap()->set_weak_stack_trace_list(*list);
}
Handle<String> hidden_string() {
return Handle<String>(&isolate()->heap()->hidden_string_);
}

View File

@ -706,26 +706,6 @@ void Heap::GarbageCollectionEpilogue() {
}
void Heap::PreprocessStackTraces() {
if (!weak_stack_trace_list()->IsWeakFixedArray()) return;
WeakFixedArray* array = WeakFixedArray::cast(weak_stack_trace_list());
int length = array->Length();
for (int i = 0; i < length; i++) {
if (array->IsEmptySlot(i)) continue;
FixedArray* elements = FixedArray::cast(array->Get(i));
for (int j = 1; j < elements->length(); j += 4) {
Code* code = Code::cast(elements->get(j + 2));
int offset = Smi::cast(elements->get(j + 3))->value();
Address pc = code->address() + offset;
int pos = code->SourcePosition(pc);
elements->set(j + 2, Smi::FromInt(pos));
}
array->Clear(i);
}
array->Compact();
}
void Heap::HandleGCRequest() {
if (incremental_marking()->request_type() ==
IncrementalMarking::COMPLETE_MARKING) {
@ -1292,8 +1272,6 @@ void Heap::MarkCompactEpilogue() {
isolate_->counters()->objs_since_last_full()->Set(0);
incremental_marking()->Epilogue();
PreprocessStackTraces();
}
@ -3104,8 +3082,6 @@ void Heap::CreateInitialObjects() {
cell->set_value(Smi::FromInt(Isolate::kArrayProtectorValid));
set_array_protector(*cell);
set_weak_stack_trace_list(Smi::FromInt(0));
set_allocation_sites_scratchpad(
*factory->NewFixedArray(kAllocationSiteScratchpadSize, TENURED));
InitializeAllocationSitesScratchpad();
@ -3142,7 +3118,6 @@ bool Heap::RootCanBeWrittenAfterInitialization(Heap::RootListIndex root_index) {
case kDetachedContextsRootIndex:
case kWeakObjectToCodeTableRootIndex:
case kRetainedMapsRootIndex:
case kWeakStackTraceListRootIndex:
// Smi values
#define SMI_ENTRY(type, name, Name) case k##Name##RootIndex:
SMI_ROOT_LIST(SMI_ENTRY)

View File

@ -186,8 +186,7 @@ namespace internal {
V(FixedArray, detached_contexts, DetachedContexts) \
V(ArrayList, retained_maps, RetainedMaps) \
V(WeakHashTable, weak_object_to_code_table, WeakObjectToCodeTable) \
V(PropertyCell, array_protector, ArrayProtector) \
V(Object, weak_stack_trace_list, WeakStackTraceList)
V(PropertyCell, array_protector, ArrayProtector)
// Entries in this list are limited to Smis and are not visited during GC.
#define SMI_ROOT_LIST(V) \
@ -1743,8 +1742,6 @@ class Heap {
void GarbageCollectionPrologue();
void GarbageCollectionEpilogue();
void PreprocessStackTraces();
// Pretenuring decisions are made based on feedback collected during new
// space evacuation. Note that between feedback collection and calling this
// method object in old space must not move.

View File

@ -407,13 +407,8 @@ Handle<Object> Isolate::CaptureSimpleStackTrace(Handle<JSObject> error_object,
}
}
elements->set(0, Smi::FromInt(sloppy_frames));
elements->Shrink(cursor);
Handle<JSArray> result = factory()->NewJSArrayWithElements(elements);
result->set_length(Smi::FromInt(cursor));
// Queue this structured stack trace for preprocessing on GC.
Handle<WeakFixedArray> new_weak_list =
WeakFixedArray::Add(factory()->weak_stack_trace_list(), elements);
factory()->set_weak_stack_trace_list(new_weak_list);
return result;
}

View File

@ -1009,7 +1009,7 @@ function GetStackFrames(raw_stack) {
var fun = raw_stack[i + 1];
var code = raw_stack[i + 2];
var pc = raw_stack[i + 3];
var pos = %_IsSmi(code) ? code : %FunctionGetPositionForOffset(code, pc);
var pos = %FunctionGetPositionForOffset(code, pc);
sloppy_frames--;
frames.push(new CallSite(recv, fun, pos, (sloppy_frames < 0)));
}

View File

@ -2356,7 +2356,7 @@ bool WeakFixedArray::IsEmptySlot(int index) const {
}
void WeakFixedArray::Clear(int index) {
void WeakFixedArray::clear(int index) {
FixedArray::cast(this)->set(index + kFirstIndex, Smi::FromInt(0));
}

View File

@ -8347,7 +8347,7 @@ bool WeakFixedArray::Remove(Handle<HeapObject> value) {
int first_index = last_used_index();
for (int i = first_index;;) {
if (Get(i) == *value) {
Clear(i);
clear(i);
// Users of WeakFixedArray should make sure that there are no duplicates,
// they can use Add(..., kAddIfNotFound) if necessary.
return true;

View File

@ -2632,10 +2632,8 @@ class WeakFixedArray : public FixedArray {
void Compact();
inline Object* Get(int index) const;
inline void Clear(int index);
inline int Length() const;
inline bool IsEmptySlot(int index) const;
static Object* Empty() { return Smi::FromInt(0); }
DECLARE_CAST(WeakFixedArray)
@ -2650,6 +2648,7 @@ class WeakFixedArray : public FixedArray {
static void Set(Handle<WeakFixedArray> array, int index,
Handle<HeapObject> value);
inline void clear(int index);
inline bool IsEmptySlot(int index) const;
inline int last_used_index() const;
inline void set_last_used_index(int index);

View File

@ -5379,36 +5379,3 @@ TEST(WeakFixedArray) {
array->Compact();
WeakFixedArray::Add(array, number);
}
TEST(PreprocessStackTrace) {
// Do not automatically trigger early GC.
FLAG_gc_interval = -1;
CcTest::InitializeVM();
v8::HandleScope scope(CcTest::isolate());
v8::TryCatch try_catch;
CompileRun("throw new Error();");
CHECK(try_catch.HasCaught());
Isolate* isolate = CcTest::i_isolate();
Handle<Object> exception = v8::Utils::OpenHandle(*try_catch.Exception());
Handle<Name> key = isolate->factory()->stack_trace_symbol();
Handle<Object> stack_trace =
JSObject::GetProperty(exception, key).ToHandleChecked();
Handle<Object> code =
Object::GetElement(isolate, stack_trace, 3).ToHandleChecked();
CHECK(code->IsCode());
isolate->heap()->CollectAllAvailableGarbage("stack trace preprocessing");
Handle<Object> pos =
Object::GetElement(isolate, stack_trace, 3).ToHandleChecked();
CHECK(pos->IsSmi());
Handle<JSArray> stack_trace_array = Handle<JSArray>::cast(stack_trace);
int array_length = Smi::cast(stack_trace_array->length())->value();
for (int i = 0; i < array_length; i++) {
Handle<Object> element =
Object::GetElement(isolate, stack_trace, i).ToHandleChecked();
CHECK(!element->IsCode());
}
}