| // Copyright 2012 the V8 project authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #ifndef V8_DEBUG_LIVEEDIT_H_ | |
| #define V8_DEBUG_LIVEEDIT_H_ | |
| #include <vector> | |
| #include "src/globals.h" | |
| #include "src/handles.h" | |
| namespace v8 { | |
| namespace debug { | |
| struct LiveEditResult; | |
| } | |
| namespace internal { | |
| class Script; | |
| class String; | |
| class Debug; | |
| class JavaScriptFrame; | |
| struct SourceChangeRange { | |
| int start_position; | |
| int end_position; | |
| int new_start_position; | |
| int new_end_position; | |
| }; | |
| /** | |
| Liveedit step-by-step: | |
| 1. calculate diff between old source and new source, | |
| 2. map function literals from old source to new source, | |
| 3. create new script for new_source, | |
| 4. mark literals with changed code as changed, all others as unchanged, | |
| 5. check that for changed literals there are no: | |
| - running generators in the heap, | |
| - non droppable frames (e.g. running generator) above them on stack. | |
| 6. mark the bottom most frame with changed function as scheduled for restart | |
| if any, | |
| 7. for unchanged functions: | |
| - deoptimize, | |
| - remove from cache, | |
| - update source positions, | |
| - move to new script, | |
| - reset feedback information and preparsed scope information if any, | |
| - replace any sfi in constant pool with changed one if any. | |
| 8. for changed functions: | |
| - deoptimize | |
| - remove from cache, | |
| - reset feedback information, | |
| - update all links from js functions to old shared with new one. | |
| 9. swap scripts. | |
| */ | |
| class LiveEdit : AllStatic { | |
| public: | |
| static void InitializeThreadLocal(Debug* debug); | |
| // Restarts the call frame and completely drops all frames above it. | |
| static bool RestartFrame(JavaScriptFrame* frame); | |
| static void CompareStrings(Isolate* isolate, Handle<String> a, | |
| Handle<String> b, | |
| std::vector<SourceChangeRange>* diffs); | |
| static int TranslatePosition(const std::vector<SourceChangeRange>& changed, | |
| int position); | |
| static void PatchScript(Isolate* isolate, Handle<Script> script, | |
| Handle<String> source, bool preview, | |
| debug::LiveEditResult* result); | |
| // Architecture-specific constant. | |
| static const bool kFrameDropperSupported; | |
| }; | |
| } // namespace internal | |
| } // namespace v8 | |
| #endif // V8_DEBUG_LIVEEDIT_H_ |