| Index: src/runtime.cc
|
| diff --git a/src/runtime.cc b/src/runtime.cc
|
| index e6eeb597aa426442c6acdda52f0486a1ae6cefa6..e8abdef7f5c17f27468cf1ef7901206b3dc7b281 100644
|
| --- a/src/runtime.cc
|
| +++ b/src/runtime.cc
|
| @@ -38,6 +38,7 @@
|
| #include "debug.h"
|
| #include "execution.h"
|
| #include "jsregexp.h"
|
| +#include "liveedit.h"
|
| #include "parser.h"
|
| #include "platform.h"
|
| #include "runtime.h"
|
| @@ -8291,6 +8292,157 @@ static Object* Runtime_FunctionGetInferredName(Arguments args) {
|
| return f->shared()->inferred_name();
|
| }
|
|
|
| +
|
| +static int FindSharedFunctionInfosForScript(Script* script,
|
| + FixedArray* buffer) {
|
| + AssertNoAllocation no_allocations;
|
| +
|
| + int counter = 0;
|
| + int buffer_size = buffer->length();
|
| + HeapIterator iterator;
|
| + for (HeapObject* obj = iterator.next(); obj != NULL; obj = iterator.next()) {
|
| + ASSERT(obj != NULL);
|
| + if (!obj->IsSharedFunctionInfo()) {
|
| + continue;
|
| + }
|
| + SharedFunctionInfo* shared = SharedFunctionInfo::cast(obj);
|
| + if (shared->script() != script) {
|
| + continue;
|
| + }
|
| + if (counter < buffer_size) {
|
| + buffer->set(counter, shared);
|
| + }
|
| + counter++;
|
| + }
|
| + return counter;
|
| +}
|
| +
|
| +// For a script finds all SharedFunctionInfo's in the heap that points
|
| +// to this script. Returns JSArray of SharedFunctionInfo wrapped
|
| +// in OpaqueReferences.
|
| +static Object* Runtime_LiveEditFindSharedFunctionInfosForScript(
|
| + Arguments args) {
|
| + ASSERT(args.length() == 1);
|
| + HandleScope scope;
|
| + CONVERT_CHECKED(JSValue, script_value, args[0]);
|
| +
|
| + Handle<Script> script = Handle<Script>(Script::cast(script_value->value()));
|
| +
|
| + const int kBufferSize = 32;
|
| +
|
| + Handle<FixedArray> array;
|
| + array = Factory::NewFixedArray(kBufferSize);
|
| + int number = FindSharedFunctionInfosForScript(*script, *array);
|
| + if (number > kBufferSize) {
|
| + array = Factory::NewFixedArray(number);
|
| + FindSharedFunctionInfosForScript(*script, *array);
|
| + }
|
| +
|
| + Handle<JSArray> result = Factory::NewJSArrayWithElements(array);
|
| + result->set_length(Smi::FromInt(number));
|
| +
|
| + LiveEdit::WrapSharedFunctionInfos(result);
|
| +
|
| + return *result;
|
| +}
|
| +
|
| +// For a script calculates compilation information about all its functions.
|
| +// The script source is explicitly specified by the second argument.
|
| +// The source of the actual script is not used, however it is important that
|
| +// all generated code keeps references to this particular instance of script.
|
| +// Returns a JSArray of compilation infos. The array is ordered so that
|
| +// each function with all its descendant is always stored in a continues range
|
| +// with the function itself going first. The root function is a script function.
|
| +static Object* Runtime_LiveEditGatherCompileInfo(Arguments args) {
|
| + ASSERT(args.length() == 2);
|
| + HandleScope scope;
|
| + CONVERT_CHECKED(JSValue, script, args[0]);
|
| + CONVERT_ARG_CHECKED(String, source, 1);
|
| + Handle<Script> script_handle = Handle<Script>(Script::cast(script->value()));
|
| +
|
| + JSArray* result = LiveEdit::GatherCompileInfo(script_handle, source);
|
| +
|
| + if (Top::has_pending_exception()) {
|
| + return Failure::Exception();
|
| + }
|
| +
|
| + return result;
|
| +}
|
| +
|
| +// Changes the source of the script to a new_source and creates a new
|
| +// script representing the old version of the script source.
|
| +static Object* Runtime_LiveEditReplaceScript(Arguments args) {
|
| + ASSERT(args.length() == 3);
|
| + HandleScope scope;
|
| + CONVERT_CHECKED(JSValue, original_script_value, args[0]);
|
| + CONVERT_ARG_CHECKED(String, new_source, 1);
|
| + CONVERT_ARG_CHECKED(String, old_script_name, 2);
|
| + Handle<Script> original_script =
|
| + Handle<Script>(Script::cast(original_script_value->value()));
|
| +
|
| + Handle<String> original_source(String::cast(original_script->source()));
|
| +
|
| + original_script->set_source(*new_source);
|
| + Handle<Script> old_script = Factory::NewScript(original_source);
|
| + old_script->set_name(*old_script_name);
|
| + old_script->set_line_offset(original_script->line_offset());
|
| + old_script->set_column_offset(original_script->column_offset());
|
| + old_script->set_data(original_script->data());
|
| + old_script->set_type(original_script->type());
|
| + old_script->set_context_data(original_script->context_data());
|
| + old_script->set_compilation_type(original_script->compilation_type());
|
| + old_script->set_eval_from_shared(original_script->eval_from_shared());
|
| + old_script->set_eval_from_instructions_offset(
|
| + original_script->eval_from_instructions_offset());
|
| +
|
| +
|
| + Debugger::OnAfterCompile(old_script, Debugger::SEND_WHEN_DEBUGGING);
|
| +
|
| + return *(GetScriptWrapper(old_script));
|
| +}
|
| +
|
| +// Replaces code of SharedFunctionInfo with a new one.
|
| +static Object* Runtime_LiveEditReplaceFunctionCode(Arguments args) {
|
| + ASSERT(args.length() == 2);
|
| + HandleScope scope;
|
| + CONVERT_ARG_CHECKED(JSArray, new_compile_info, 0);
|
| + CONVERT_ARG_CHECKED(JSArray, shared_info, 1);
|
| +
|
| + LiveEdit::ReplaceFunctionCode(new_compile_info, shared_info);
|
| +
|
| + return Heap::undefined_value();
|
| +}
|
| +
|
| +// Connects SharedFunctionInfo to another script.
|
| +static Object* Runtime_LiveEditRelinkFunctionToScript(Arguments args) {
|
| + ASSERT(args.length() == 2);
|
| + HandleScope scope;
|
| + CONVERT_ARG_CHECKED(JSArray, shared_info_array, 0);
|
| + CONVERT_ARG_CHECKED(JSValue, script_value, 1);
|
| + Handle<Script> script = Handle<Script>(Script::cast(script_value->value()));
|
| +
|
| + LiveEdit::RelinkFunctionToScript(shared_info_array, script);
|
| +
|
| + return Heap::undefined_value();
|
| +}
|
| +
|
| +// Updates positions of a shared function info (first parameter) according
|
| +// to script source change. Text change is described in second parameter as
|
| +// array of groups of 3 numbers:
|
| +// (change_begin, change_end, change_end_new_position).
|
| +// Each group describes a change in text; groups are sorted by change_begin.
|
| +static Object* Runtime_LiveEditPatchFunctionPositions(Arguments args) {
|
| + ASSERT(args.length() == 2);
|
| + HandleScope scope;
|
| + CONVERT_ARG_CHECKED(JSArray, shared_array, 0);
|
| + CONVERT_ARG_CHECKED(JSArray, position_change_array, 1);
|
| +
|
| + LiveEdit::PatchFunctionPositions(shared_array, position_change_array);
|
| +
|
| + return Heap::undefined_value();
|
| +}
|
| +
|
| +
|
| #endif // ENABLE_DEBUGGER_SUPPORT
|
|
|
| #ifdef ENABLE_LOGGING_AND_PROFILING
|
|
|