Fix reliability crash caused by wrong assert.

These two asserts in ComputeEntryFrame are wrong since the
virtual frame already knows how to deal with the number type
information of copy elements: We do not store type 
information with copy elements. Instead the backing element
contains the type information.


Review URL: http://codereview.chromium.org/652044

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@3927 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 2074e484
...@@ -65,6 +65,9 @@ class FrameElement BASE_EMBEDDED { ...@@ -65,6 +65,9 @@ class FrameElement BASE_EMBEDDED {
} }
inline void set_number_info(NumberInfo::Type info) { inline void set_number_info(NumberInfo::Type info) {
// Copied elements do not have number info. Instead
// we have to inspect their backing element in the frame.
ASSERT(!is_copy());
value_ = value_ & ~NumberInfoField::mask(); value_ = value_ & ~NumberInfoField::mask();
value_ = value_ | NumberInfoField::encode(info); value_ = value_ | NumberInfoField::encode(info);
} }
......
...@@ -42,7 +42,7 @@ void JumpTarget::InitializeEntryElement(int index, FrameElement* target) { ...@@ -42,7 +42,7 @@ void JumpTarget::InitializeEntryElement(int index, FrameElement* target) {
} else if (target->is_copy()) { } else if (target->is_copy()) {
entry_frame_->elements_[target->index()].set_copied(); entry_frame_->elements_[target->index()].set_copied();
} }
if (direction_ == BIDIRECTIONAL) { if (direction_ == BIDIRECTIONAL && !target->is_copy()) {
entry_frame_->elements_[index].set_number_info(NumberInfo::kUnknown); entry_frame_->elements_[index].set_number_info(NumberInfo::kUnknown);
} }
} }
......
...@@ -105,7 +105,6 @@ void JumpTarget::ComputeEntryFrame() { ...@@ -105,7 +105,6 @@ void JumpTarget::ComputeEntryFrame() {
FrameElement* other = &reaching_frames_[j]->elements_[i]; FrameElement* other = &reaching_frames_[j]->elements_[i];
if (element != NULL && !element->is_copy()) { if (element != NULL && !element->is_copy()) {
ASSERT(other != NULL); ASSERT(other != NULL);
ASSERT(!other->is_copy());
// We overwrite the number information of one of the incoming frames. // We overwrite the number information of one of the incoming frames.
// This is safe because we only use the frame for emitting merge code. // This is safe because we only use the frame for emitting merge code.
// The number information of incoming frames is not used anymore. // The number information of incoming frames is not used anymore.
...@@ -128,7 +127,6 @@ void JumpTarget::ComputeEntryFrame() { ...@@ -128,7 +127,6 @@ void JumpTarget::ComputeEntryFrame() {
// elements as copied exactly when they have a copy. Undetermined // elements as copied exactly when they have a copy. Undetermined
// elements are initially recorded as if in memory. // elements are initially recorded as if in memory.
if (target != NULL) { if (target != NULL) {
ASSERT(!target->is_copy()); // These initial elements are never copies.
entry_frame_->elements_[index] = *target; entry_frame_->elements_[index] = *target;
InitializeEntryElement(index, target); InitializeEntryElement(index, target);
} }
......
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