Index: src/liveedit.cc |
=================================================================== |
--- src/liveedit.cc (revision 7267) |
+++ src/liveedit.cc (working copy) |
@@ -268,10 +268,10 @@ |
} |
-static bool CompareSubstrings(Handle<String> s1, int pos1, |
+static bool CompareSubstrings(Isolate* isolate, Handle<String> s1, int pos1, |
Handle<String> s2, int pos2, int len) { |
- static StringInputBuffer buf1; |
- static StringInputBuffer buf2; |
+ StringInputBuffer& buf1 = *isolate->liveedit_compare_substrings_buf1(); |
+ StringInputBuffer& buf2 = *isolate->liveedit_compare_substrings_buf2(); |
buf1.Reset(*s1); |
buf1.Seek(pos1); |
buf2.Reset(*s2); |
@@ -291,7 +291,7 @@ |
class CompareOutputArrayWriter { |
public: |
CompareOutputArrayWriter() |
- : array_(Factory::NewJSArray(10)), current_size_(0) {} |
+ : array_(FACTORY->NewJSArray(10)), current_size_(0) {} |
Handle<JSArray> GetResult() { |
return array_; |
@@ -410,9 +410,10 @@ |
// Represents 2 strings as 2 arrays of lines. |
class LineArrayCompareInput : public Comparator::Input { |
public: |
- LineArrayCompareInput(Handle<String> s1, Handle<String> s2, |
+ LineArrayCompareInput(Isolate* isolate, Handle<String> s1, Handle<String> s2, |
LineEndsWrapper line_ends1, LineEndsWrapper line_ends2) |
- : s1_(s1), s2_(s2), line_ends1_(line_ends1), line_ends2_(line_ends2) { |
+ : isolate_(isolate), s1_(s1), s2_(s2), line_ends1_(line_ends1), |
+ line_ends2_(line_ends2) { |
} |
int getLength1() { |
return line_ends1_.length(); |
@@ -430,10 +431,12 @@ |
if (len1 != len2) { |
return false; |
} |
- return CompareSubstrings(s1_, line_start1, s2_, line_start2, len1); |
+ return CompareSubstrings(isolate_, s1_, line_start1, s2_, line_start2, |
+ len1); |
} |
private: |
+ Isolate* isolate_; |
Handle<String> s1_; |
Handle<String> s2_; |
LineEndsWrapper line_ends1_; |
@@ -492,7 +495,8 @@ |
LineEndsWrapper line_ends1(s1); |
LineEndsWrapper line_ends2(s2); |
- LineArrayCompareInput input(s1, s2, line_ends1, line_ends2); |
+ LineArrayCompareInput |
+ input(Isolate::Current(), s1, s2, line_ends1, line_ends2); |
TokenizingLineArrayCompareOutput output(line_ends1, line_ends2, s1, s2); |
Comparator::CalculateDifference(&input, &output); |
@@ -501,21 +505,21 @@ |
} |
-static void CompileScriptForTracker(Handle<Script> script) { |
+static void CompileScriptForTracker(Isolate* isolate, Handle<Script> script) { |
// TODO(635): support extensions. |
- PostponeInterruptsScope postpone; |
+ PostponeInterruptsScope postpone(isolate); |
// Build AST. |
CompilationInfo info(script); |
info.MarkAsGlobal(); |
if (ParserApi::Parse(&info)) { |
// Compile the code. |
- LiveEditFunctionTracker tracker(info.function()); |
+ LiveEditFunctionTracker tracker(info.isolate(), info.function()); |
if (Compiler::MakeCodeForLiveEdit(&info)) { |
ASSERT(!info.code().is_null()); |
tracker.RecordRootFunctionInfo(info.code()); |
} else { |
- Top::StackOverflow(); |
+ info.isolate()->StackOverflow(); |
} |
} |
} |
@@ -530,9 +534,10 @@ |
// Wraps any object into a OpaqueReference, that will hide the object |
// from JavaScript. |
static Handle<JSValue> WrapInJSValue(Object* object) { |
- Handle<JSFunction> constructor = Top::opaque_reference_function(); |
+ Handle<JSFunction> constructor = |
+ Isolate::Current()->opaque_reference_function(); |
Handle<JSValue> result = |
- Handle<JSValue>::cast(Factory::NewJSObject(constructor)); |
+ Handle<JSValue>::cast(FACTORY->NewJSObject(constructor)); |
result->set_value(object); |
return result; |
} |
@@ -545,7 +550,7 @@ |
class JSArrayBasedStruct { |
public: |
static S Create() { |
- Handle<JSArray> array = Factory::NewJSArray(S::kSize_); |
+ Handle<JSArray> array = FACTORY->NewJSArray(S::kSize_); |
return S(array); |
} |
static S cast(Object* object) { |
@@ -695,7 +700,7 @@ |
FunctionInfoListener() { |
current_parent_index_ = -1; |
len_ = 0; |
- result_ = Factory::NewJSArray(10); |
+ result_ = FACTORY->NewJSArray(10); |
} |
void FunctionStarted(FunctionLiteral* fun) { |
@@ -723,7 +728,7 @@ |
FunctionInfoWrapper info = |
FunctionInfoWrapper::cast( |
result_->GetElementNoExceptionThrown(current_parent_index_)); |
- info.SetFunctionCode(function_code, Handle<Object>(Heap::null_value())); |
+ info.SetFunctionCode(function_code, Handle<Object>(HEAP->null_value())); |
} |
// Saves full information about a function: its code, its scope info |
@@ -749,7 +754,7 @@ |
Object* SerializeFunctionScope(Scope* scope) { |
HandleScope handle_scope; |
- Handle<JSArray> scope_info_list = Factory::NewJSArray(10); |
+ Handle<JSArray> scope_info_list = FACTORY->NewJSArray(10); |
int scope_info_length = 0; |
// Saves some description of scope. It stores name and indexes of |
@@ -757,7 +762,7 @@ |
// scopes of this chain. |
Scope* outer_scope = scope->outer_scope(); |
if (outer_scope == NULL) { |
- return Heap::undefined_value(); |
+ return HEAP->undefined_value(); |
} |
do { |
ZoneList<Variable*> list(10); |
@@ -797,7 +802,7 @@ |
} |
SetElementNonStrict(scope_info_list, |
scope_info_length, |
- Handle<Object>(Heap::null_value())); |
+ Handle<Object>(HEAP->null_value())); |
scope_info_length++; |
outer_scope = outer_scope->outer_scope(); |
@@ -812,18 +817,17 @@ |
}; |
-static FunctionInfoListener* active_function_info_listener = NULL; |
- |
JSArray* LiveEdit::GatherCompileInfo(Handle<Script> script, |
Handle<String> source) { |
+ Isolate* isolate = Isolate::Current(); |
CompilationZoneScope zone_scope(DELETE_ON_EXIT); |
FunctionInfoListener listener; |
Handle<Object> original_source = Handle<Object>(script->source()); |
script->set_source(*source); |
- active_function_info_listener = &listener; |
- CompileScriptForTracker(script); |
- active_function_info_listener = NULL; |
+ isolate->set_active_function_info_listener(&listener); |
+ CompileScriptForTracker(isolate, script); |
+ isolate->set_active_function_info_listener(NULL); |
script->set_source(*original_source); |
return *(listener.GetResult()); |
@@ -905,7 +909,7 @@ |
// Finds all references to original and replaces them with substitution. |
static void ReplaceCodeObject(Code* original, Code* substitution) { |
- ASSERT(!Heap::InNewSpace(substitution)); |
+ ASSERT(!HEAP->InNewSpace(substitution)); |
AssertNoAllocation no_allocations_please; |
@@ -918,7 +922,7 @@ |
// so temporary replace the pointers with offset numbers |
// in prologue/epilogue. |
{ |
- Heap::IterateStrongRoots(&visitor, VISIT_ALL); |
+ HEAP->IterateStrongRoots(&visitor, VISIT_ALL); |
} |
// Now iterate over all pointers of all objects, including code_target |
@@ -948,7 +952,7 @@ |
DeoptimizationInputData* data = |
DeoptimizationInputData::cast(function->code()->deoptimization_data()); |
- if (data == Heap::empty_fixed_array()) return false; |
+ if (data == HEAP->empty_fixed_array()) return false; |
FixedArray* literals = data->LiteralArray(); |
@@ -1000,7 +1004,7 @@ |
HandleScope scope; |
if (!SharedInfoWrapper::IsInstance(shared_info_array)) { |
- return Top::ThrowIllegalOperation(); |
+ return Isolate::Current()->ThrowIllegalOperation(); |
} |
FunctionInfoWrapper compile_info_wrapper(new_compile_info_array); |
@@ -1020,7 +1024,7 @@ |
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()); |
+ FACTORY->CopyCode(compile_info_wrapper.GetFunctionCode()); |
debug_info->set_original_code(*new_original_code); |
} |
@@ -1028,12 +1032,13 @@ |
shared_info->set_end_position(compile_info_wrapper.GetEndPosition()); |
shared_info->set_construct_stub( |
- Builtins::builtin(Builtins::JSConstructStubGeneric)); |
+ Isolate::Current()->builtins()->builtin( |
+ Builtins::JSConstructStubGeneric)); |
DeoptimizeDependentFunctions(*shared_info); |
- CompilationCache::Remove(shared_info); |
+ Isolate::Current()->compilation_cache()->Remove(shared_info); |
- return Heap::undefined_value(); |
+ return HEAP->undefined_value(); |
} |
@@ -1042,16 +1047,16 @@ |
HandleScope scope; |
if (!SharedInfoWrapper::IsInstance(shared_info_array)) { |
- return Top::ThrowIllegalOperation(); |
+ return Isolate::Current()->ThrowIllegalOperation(); |
} |
SharedInfoWrapper shared_info_wrapper(shared_info_array); |
Handle<SharedFunctionInfo> shared_info = shared_info_wrapper.GetInfo(); |
DeoptimizeDependentFunctions(*shared_info); |
- CompilationCache::Remove(shared_info); |
+ Isolate::Current()->compilation_cache()->Remove(shared_info); |
- return Heap::undefined_value(); |
+ return HEAP->undefined_value(); |
} |
@@ -1061,7 +1066,7 @@ |
Handle<SharedFunctionInfo>::cast(UnwrapJSValue(function_wrapper)); |
shared_info->set_script(*script_handle); |
- CompilationCache::Remove(shared_info); |
+ Isolate::Current()->compilation_cache()->Remove(shared_info); |
} |
@@ -1209,7 +1214,7 @@ |
// Relocation info section now has different size. We cannot simply |
// rewrite it inside code object. Instead we have to create a new |
// code object. |
- Handle<Code> result(Factory::CopyCode(code, buffer)); |
+ Handle<Code> result(FACTORY->CopyCode(code, buffer)); |
return result; |
} |
} |
@@ -1219,7 +1224,7 @@ |
Handle<JSArray> shared_info_array, Handle<JSArray> position_change_array) { |
if (!SharedInfoWrapper::IsInstance(shared_info_array)) { |
- return Top::ThrowIllegalOperation(); |
+ return Isolate::Current()->ThrowIllegalOperation(); |
} |
SharedInfoWrapper shared_info_wrapper(shared_info_array); |
@@ -1250,14 +1255,14 @@ |
} |
} |
- return Heap::undefined_value(); |
+ return HEAP->undefined_value(); |
} |
static Handle<Script> CreateScriptCopy(Handle<Script> original) { |
Handle<String> original_source(String::cast(original->source())); |
- Handle<Script> copy = Factory::NewScript(original_source); |
+ Handle<Script> copy = FACTORY->NewScript(original_source); |
copy->set_name(original->name()); |
copy->set_line_offset(original->line_offset()); |
@@ -1282,15 +1287,16 @@ |
Handle<Script> old_script = CreateScriptCopy(original_script); |
old_script->set_name(String::cast(*old_script_name)); |
old_script_object = old_script; |
- Debugger::OnAfterCompile(old_script, Debugger::SEND_WHEN_DEBUGGING); |
+ Isolate::Current()->debugger()->OnAfterCompile( |
+ old_script, Debugger::SEND_WHEN_DEBUGGING); |
} else { |
- old_script_object = Handle<Object>(Heap::null_value()); |
+ old_script_object = Handle<Object>(HEAP->null_value()); |
} |
original_script->set_source(*new_source); |
// Drop line ends so that they will be recalculated. |
- original_script->set_line_ends(Heap::undefined_value()); |
+ original_script->set_line_ends(HEAP->undefined_value()); |
return *old_script_object; |
} |
@@ -1351,7 +1357,8 @@ |
static bool FixTryCatchHandler(StackFrame* top_frame, |
StackFrame* bottom_frame) { |
Address* pointer_address = |
- &Memory::Address_at(Top::get_address_from_id(Top::k_handler_address)); |
+ &Memory::Address_at(Isolate::Current()->get_address_from_id( |
+ Isolate::k_handler_address)); |
while (*pointer_address < top_frame->sp()) { |
pointer_address = &Memory::Address_at(*pointer_address); |
@@ -1386,19 +1393,22 @@ |
ASSERT(bottom_js_frame->is_java_script()); |
// Check the nature of the top frame. |
- if (pre_top_frame->code()->is_inline_cache_stub() && |
- pre_top_frame->code()->ic_state() == DEBUG_BREAK) { |
+ Code* pre_top_frame_code = pre_top_frame->LookupCode(Isolate::Current()); |
+ if (pre_top_frame_code->is_inline_cache_stub() && |
+ pre_top_frame_code->ic_state() == DEBUG_BREAK) { |
// OK, we can drop inline cache calls. |
*mode = Debug::FRAME_DROPPED_IN_IC_CALL; |
- } else if (pre_top_frame->code() == Debug::debug_break_slot()) { |
+ } else if (pre_top_frame_code == |
+ Isolate::Current()->debug()->debug_break_slot()) { |
// OK, we can drop debug break slot. |
*mode = Debug::FRAME_DROPPED_IN_DEBUG_SLOT_CALL; |
- } else if (pre_top_frame->code() == |
- Builtins::builtin(Builtins::FrameDropper_LiveEdit)) { |
+ } else if (pre_top_frame_code == |
+ Isolate::Current()->builtins()->builtin( |
+ Builtins::FrameDropper_LiveEdit)) { |
// OK, we can drop our own code. |
*mode = Debug::FRAME_DROPPED_IN_DIRECT_CALL; |
- } else if (pre_top_frame->code()->kind() == Code::STUB && |
- pre_top_frame->code()->major_key()) { |
+ } else if (pre_top_frame_code->kind() == Code::STUB && |
+ pre_top_frame_code->major_key()) { |
// Entry from our unit tests, it's fine, we support this case. |
*mode = Debug::FRAME_DROPPED_IN_DIRECT_CALL; |
} else { |
@@ -1420,7 +1430,8 @@ |
// Make sure FixTryCatchHandler is idempotent. |
ASSERT(!FixTryCatchHandler(pre_top_frame, bottom_js_frame)); |
- Handle<Code> code(Builtins::builtin(Builtins::FrameDropper_LiveEdit)); |
+ Handle<Code> code(Isolate::Current()->builtins()->builtin( |
+ Builtins::FrameDropper_LiveEdit)); |
top_frame->set_pc(code->entry()); |
pre_top_frame->SetCallerFp(bottom_js_frame->fp()); |
@@ -1447,7 +1458,7 @@ |
// removing all listed function if possible and if do_drop is true. |
static const char* DropActivationsInActiveThread( |
Handle<JSArray> shared_info_array, Handle<JSArray> result, bool do_drop) { |
- |
+ Debug* debug = Isolate::Current()->debug(); |
ZoneScope scope(DELETE_ON_EXIT); |
Vector<StackFrame*> frames = CreateStackMap(); |
@@ -1457,7 +1468,7 @@ |
int frame_index = 0; |
for (; frame_index < frames.length(); frame_index++) { |
StackFrame* frame = frames[frame_index]; |
- if (frame->id() == Debug::break_frame_id()) { |
+ if (frame->id() == debug->break_frame_id()) { |
top_frame_index = frame_index; |
break; |
} |
@@ -1534,7 +1545,7 @@ |
break; |
} |
} |
- Debug::FramesHaveBeenDropped(new_id, drop_mode, |
+ debug->FramesHaveBeenDropped(new_id, drop_mode, |
restarter_frame_function_pointer); |
// Replace "blocked on active" with "replaced on active" status. |
@@ -1579,7 +1590,7 @@ |
Handle<JSArray> shared_info_array, bool do_drop) { |
int len = Smi::cast(shared_info_array->length())->value(); |
- Handle<JSArray> result = Factory::NewJSArray(len); |
+ Handle<JSArray> result = FACTORY->NewJSArray(len); |
// Fill the default values. |
for (int i = 0; i < len; i++) { |
@@ -1593,7 +1604,8 @@ |
// First check inactive threads. Fail if some functions are blocked there. |
InactiveThreadActivationsChecker inactive_threads_checker(shared_info_array, |
result); |
- ThreadManager::IterateArchivedThreads(&inactive_threads_checker); |
+ Isolate::Current()->thread_manager()->IterateArchivedThreads( |
+ &inactive_threads_checker); |
if (inactive_threads_checker.HasBlockedFunctions()) { |
return result; |
} |
@@ -1604,42 +1616,44 @@ |
if (error_message != NULL) { |
// Add error message as an array extra element. |
Vector<const char> vector_message(error_message, StrLength(error_message)); |
- Handle<String> str = Factory::NewStringFromAscii(vector_message); |
+ Handle<String> str = FACTORY->NewStringFromAscii(vector_message); |
SetElementNonStrict(result, len, str); |
} |
return result; |
} |
-LiveEditFunctionTracker::LiveEditFunctionTracker(FunctionLiteral* fun) { |
- if (active_function_info_listener != NULL) { |
- active_function_info_listener->FunctionStarted(fun); |
+LiveEditFunctionTracker::LiveEditFunctionTracker(Isolate* isolate, |
+ FunctionLiteral* fun) |
+ : isolate_(isolate) { |
+ if (isolate_->active_function_info_listener() != NULL) { |
+ isolate_->active_function_info_listener()->FunctionStarted(fun); |
} |
} |
LiveEditFunctionTracker::~LiveEditFunctionTracker() { |
- if (active_function_info_listener != NULL) { |
- active_function_info_listener->FunctionDone(); |
+ if (isolate_->active_function_info_listener() != NULL) { |
+ isolate_->active_function_info_listener()->FunctionDone(); |
} |
} |
void LiveEditFunctionTracker::RecordFunctionInfo( |
Handle<SharedFunctionInfo> info, FunctionLiteral* lit) { |
- if (active_function_info_listener != NULL) { |
- active_function_info_listener->FunctionInfo(info, lit->scope()); |
+ if (isolate_->active_function_info_listener() != NULL) { |
+ isolate_->active_function_info_listener()->FunctionInfo(info, lit->scope()); |
} |
} |
void LiveEditFunctionTracker::RecordRootFunctionInfo(Handle<Code> code) { |
- active_function_info_listener->FunctionCode(code); |
+ isolate_->active_function_info_listener()->FunctionCode(code); |
} |
-bool LiveEditFunctionTracker::IsActive() { |
- return active_function_info_listener != NULL; |
+bool LiveEditFunctionTracker::IsActive(Isolate* isolate) { |
+ return isolate->active_function_info_listener() != NULL; |
} |
@@ -1647,7 +1661,8 @@ |
// This ifdef-else-endif section provides working or stub implementation of |
// LiveEditFunctionTracker. |
-LiveEditFunctionTracker::LiveEditFunctionTracker(FunctionLiteral* fun) { |
+LiveEditFunctionTracker::LiveEditFunctionTracker(Isolate* isolate, |
+ FunctionLiteral* fun) { |
} |