| Index: src/deoptimizer.cc
|
| diff --git a/src/deoptimizer.cc b/src/deoptimizer.cc
|
| index c9386d407585724bcc3ab9e7624206202eca489a..7018346842a84eb4c493444e6b3bf1cb2dc17192 100644
|
| --- a/src/deoptimizer.cc
|
| +++ b/src/deoptimizer.cc
|
| @@ -79,6 +79,36 @@ void DeoptimizerData::Iterate(ObjectVisitor* v) {
|
| #endif
|
|
|
|
|
| +Code* DeoptimizerData::FindDeoptimizingCode(Address addr) {
|
| + for (DeoptimizingCodeListNode* node = deoptimizing_code_list_;
|
| + node != NULL;
|
| + node = node->next()) {
|
| + if (node->code()->contains(addr)) return *node->code();
|
| + }
|
| + return NULL;
|
| +}
|
| +
|
| +
|
| +void DeoptimizerData::RemoveDeoptimizingCode(Code* code) {
|
| + for (DeoptimizingCodeListNode *prev = NULL, *cur = deoptimizing_code_list_;
|
| + cur != NULL;
|
| + prev = cur, cur = cur->next()) {
|
| + if (*cur->code() == code) {
|
| + if (prev == NULL) {
|
| + deoptimizing_code_list_ = cur->next();
|
| + } else {
|
| + prev->set_next(cur->next());
|
| + }
|
| + delete cur;
|
| + return;
|
| + }
|
| + }
|
| + // Deoptimizing code is removed through weak callback. Each object is expected
|
| + // to be removed once and only once.
|
| + UNREACHABLE();
|
| +}
|
| +
|
| +
|
| // We rely on this function not causing a GC. It is called from generated code
|
| // without having a real stack frame in place.
|
| Deoptimizer* Deoptimizer::New(JSFunction* function,
|
| @@ -426,16 +456,17 @@ void Deoptimizer::DeoptimizeAllFunctionsWith(OptimizedFunctionFilter* filter) {
|
| }
|
|
|
|
|
| -void Deoptimizer::HandleWeakDeoptimizedCode(
|
| - v8::Persistent<v8::Value> obj, void* data) {
|
| +void Deoptimizer::HandleWeakDeoptimizedCode(v8::Persistent<v8::Value> obj,
|
| + void* parameter) {
|
| DeoptimizingCodeListNode* node =
|
| - reinterpret_cast<DeoptimizingCodeListNode*>(data);
|
| - RemoveDeoptimizingCode(*node->code());
|
| + reinterpret_cast<DeoptimizingCodeListNode*>(parameter);
|
| + DeoptimizerData* data = Isolate::Current()->deoptimizer_data();
|
| + data->RemoveDeoptimizingCode(*node->code());
|
| #ifdef DEBUG
|
| - node = Isolate::Current()->deoptimizer_data()->deoptimizing_code_list_;
|
| - while (node != NULL) {
|
| - ASSERT(node != reinterpret_cast<DeoptimizingCodeListNode*>(data));
|
| - node = node->next();
|
| + for (DeoptimizingCodeListNode* current = data->deoptimizing_code_list_;
|
| + current != NULL;
|
| + current = current->next()) {
|
| + ASSERT(current != node);
|
| }
|
| #endif
|
| }
|
| @@ -519,7 +550,7 @@ Deoptimizer::Deoptimizer(Isolate* isolate,
|
| }
|
| }
|
| } else if (type == LAZY) {
|
| - compiled_code_ = FindDeoptimizingCodeFromAddress(from);
|
| + compiled_code_ = isolate->deoptimizer_data()->FindDeoptimizingCode(from);
|
| if (compiled_code_ == NULL) {
|
| compiled_code_ =
|
| static_cast<Code*>(isolate->heap()->FindCodeObject(from));
|
| @@ -1534,44 +1565,6 @@ void Deoptimizer::EnsureCodeForDeoptimizationEntry(BailoutType type,
|
| }
|
|
|
|
|
| -Code* Deoptimizer::FindDeoptimizingCodeFromAddress(Address addr) {
|
| - DeoptimizingCodeListNode* node =
|
| - Isolate::Current()->deoptimizer_data()->deoptimizing_code_list_;
|
| - while (node != NULL) {
|
| - if (node->code()->contains(addr)) return *node->code();
|
| - node = node->next();
|
| - }
|
| - return NULL;
|
| -}
|
| -
|
| -
|
| -void Deoptimizer::RemoveDeoptimizingCode(Code* code) {
|
| - DeoptimizerData* data = Isolate::Current()->deoptimizer_data();
|
| - ASSERT(data->deoptimizing_code_list_ != NULL);
|
| - // Run through the code objects to find this one and remove it.
|
| - DeoptimizingCodeListNode* prev = NULL;
|
| - DeoptimizingCodeListNode* current = data->deoptimizing_code_list_;
|
| - while (current != NULL) {
|
| - if (*current->code() == code) {
|
| - // Unlink from list. If prev is NULL we are looking at the first element.
|
| - if (prev == NULL) {
|
| - data->deoptimizing_code_list_ = current->next();
|
| - } else {
|
| - prev->set_next(current->next());
|
| - }
|
| - delete current;
|
| - return;
|
| - }
|
| - // Move to next in list.
|
| - prev = current;
|
| - current = current->next();
|
| - }
|
| - // Deoptimizing code is removed through weak callback. Each object is expected
|
| - // to be removed once and only once.
|
| - UNREACHABLE();
|
| -}
|
| -
|
| -
|
| void Deoptimizer::ReplaceCodeForRelatedFunctions(JSFunction* function,
|
| Code* code) {
|
| SharedFunctionInfo* shared = function->shared();
|
|
|