Restore r4358 which was reverted by 4366.
Review URL: http://codereview.chromium.org/1594023 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@4379 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
16799e203f
commit
7b8afe4c2c
@ -447,6 +447,13 @@ static void ReplaceCodeObject(Code* original, Code* substitution) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Check whether the code is natural function code (not a lazy-compile stub
|
||||||
|
// code).
|
||||||
|
static bool IsJSFunctionCode(Code* code) {
|
||||||
|
return code->kind() == Code::FUNCTION;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void LiveEdit::ReplaceFunctionCode(Handle<JSArray> new_compile_info_array,
|
void LiveEdit::ReplaceFunctionCode(Handle<JSArray> new_compile_info_array,
|
||||||
Handle<JSArray> shared_info_array) {
|
Handle<JSArray> shared_info_array) {
|
||||||
HandleScope scope;
|
HandleScope scope;
|
||||||
@ -456,15 +463,30 @@ void LiveEdit::ReplaceFunctionCode(Handle<JSArray> new_compile_info_array,
|
|||||||
|
|
||||||
Handle<SharedFunctionInfo> shared_info = shared_info_wrapper.GetInfo();
|
Handle<SharedFunctionInfo> shared_info = shared_info_wrapper.GetInfo();
|
||||||
|
|
||||||
ReplaceCodeObject(shared_info->code(),
|
|
||||||
*(compile_info_wrapper.GetFunctionCode()));
|
if (IsJSFunctionCode(shared_info->code())) {
|
||||||
|
ReplaceCodeObject(shared_info->code(),
|
||||||
|
*(compile_info_wrapper.GetFunctionCode()));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (shared_info->debug_info()->IsDebugInfo()) {
|
||||||
|
Handle<DebugInfo> debug_info(DebugInfo::cast(shared_info->debug_info()));
|
||||||
|
Handle<Code> new_original_code =
|
||||||
|
Factory::CopyCode(compile_info_wrapper.GetFunctionCode());
|
||||||
|
debug_info->set_original_code(*new_original_code);
|
||||||
|
}
|
||||||
|
|
||||||
shared_info->set_start_position(compile_info_wrapper.GetStartPosition());
|
shared_info->set_start_position(compile_info_wrapper.GetStartPosition());
|
||||||
shared_info->set_end_position(compile_info_wrapper.GetEndPosition());
|
shared_info->set_end_position(compile_info_wrapper.GetEndPosition());
|
||||||
// update breakpoints, original code, constructor stub
|
|
||||||
|
shared_info->set_construct_stub(
|
||||||
|
Builtins::builtin(Builtins::JSConstructStubGeneric));
|
||||||
|
// update breakpoints
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// TODO(635): Eval caches its scripts (same text -- same compiled info).
|
||||||
|
// Make sure we clear such caches.
|
||||||
void LiveEdit::RelinkFunctionToScript(Handle<JSArray> shared_info_array,
|
void LiveEdit::RelinkFunctionToScript(Handle<JSArray> shared_info_array,
|
||||||
Handle<Script> script_handle) {
|
Handle<Script> script_handle) {
|
||||||
SharedInfoWrapper shared_info_wrapper(shared_info_array);
|
SharedInfoWrapper shared_info_wrapper(shared_info_array);
|
||||||
@ -651,15 +673,18 @@ Handle<JSArray> LiveEdit::PatchFunctionPositions(
|
|||||||
TranslatePosition(info->function_token_position(),
|
TranslatePosition(info->function_token_position(),
|
||||||
position_change_array));
|
position_change_array));
|
||||||
|
|
||||||
// Patch relocation info section of the code.
|
if (IsJSFunctionCode(info->code())) {
|
||||||
Handle<Code> patched_code = PatchPositionsInCode(Handle<Code>(info->code()),
|
// Patch relocation info section of the code.
|
||||||
position_change_array);
|
Handle<Code> patched_code = PatchPositionsInCode(Handle<Code>(info->code()),
|
||||||
if (*patched_code != info->code()) {
|
position_change_array);
|
||||||
// Replace all references to the code across the heap. In particular,
|
if (*patched_code != info->code()) {
|
||||||
// some stubs may refer to this code and this code may be being executed
|
// Replace all references to the code across the heap. In particular,
|
||||||
// on stack (it is safe to substitute the code object on stack, because
|
// some stubs may refer to this code and this code may be being executed
|
||||||
// we only change the structure of rinfo and leave instructions untouched).
|
// on stack (it is safe to substitute the code object on stack, because
|
||||||
ReplaceCodeObject(info->code(), *patched_code);
|
// we only change the structure of rinfo and leave instructions
|
||||||
|
// untouched).
|
||||||
|
ReplaceCodeObject(info->code(), *patched_code);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user