Index: src/hydrogen.cc |
diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
index 23831925f3738c8b6abedf6e0a391a9097ff1ad3..8573ba1eb3090fc3eab8d7b01019fd9d9295517e 100644 |
--- a/src/hydrogen.cc |
+++ b/src/hydrogen.cc |
@@ -2767,9 +2767,33 @@ void HGraphBuilder::VisitDebuggerStatement(DebuggerStatement* stmt) { |
} |
+static Handle<SharedFunctionInfo> SearchSharedFunctionInfo( |
+ Code* unoptimized_code, FunctionLiteral* expr) { |
+ int start_position = expr->start_position(); |
+ RelocIterator it(unoptimized_code); |
+ for (;!it.done(); it.next()) { |
+ RelocInfo* rinfo = it.rinfo(); |
+ if (rinfo->rmode() != RelocInfo::EMBEDDED_OBJECT) continue; |
+ Object* obj = rinfo->target_object(); |
+ if (obj->IsSharedFunctionInfo()) { |
+ SharedFunctionInfo* shared = SharedFunctionInfo::cast(obj); |
+ if (shared->start_position() == start_position) { |
+ return Handle<SharedFunctionInfo>(shared); |
+ } |
+ } |
+ } |
+ |
+ return Handle<SharedFunctionInfo>(); |
+} |
+ |
+ |
void HGraphBuilder::VisitFunctionLiteral(FunctionLiteral* expr) { |
Handle<SharedFunctionInfo> shared_info = |
- Compiler::BuildFunctionInfo(expr, info()->script()); |
+ SearchSharedFunctionInfo(info()->shared_info()->code(), |
+ expr); |
+ if (shared_info.is_null()) { |
+ shared_info = Compiler::BuildFunctionInfo(expr, info()->script()); |
+ } |
CHECK_BAILOUT; |
HFunctionLiteral* instr = |
new HFunctionLiteral(shared_info, expr->pretenure()); |