blob: 4291efb2d0eb089245537ac6020983209607ce10 [file] [log] [blame]
// 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/common/globals.h"
#include "src/handles/handles.h"
namespace v8 {
namespace debug {
struct LiveEditResult;
} // namespace debug
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 V8_EXPORT_PRIVATE 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_