Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(523)

Unified Diff: src/liveedit.cc

Issue 11421100: Issue 2429, core implementation and the protocol change (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: follow codereview Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/isolate.cc ('k') | src/liveedit-debugger.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/liveedit.cc
diff --git a/src/liveedit.cc b/src/liveedit.cc
index 574a37691c0a0e99e0e46617455d734ff7e50d2c..ddb1371c4c651a41ce8a1f695665ef54144bd6d5 100644
--- a/src/liveedit.cc
+++ b/src/liveedit.cc
@@ -36,6 +36,7 @@
#include "debug.h"
#include "deoptimizer.h"
#include "global-handles.h"
+#include "messages.h"
#include "parser.h"
#include "scopeinfo.h"
#include "scopes.h"
@@ -925,11 +926,58 @@ JSArray* LiveEdit::GatherCompileInfo(Handle<Script> script,
Handle<Object> original_source = Handle<Object>(script->source());
script->set_source(*source);
isolate->set_active_function_info_listener(&listener);
- CompileScriptForTracker(isolate, script);
+
+ {
+ // Creating verbose TryCatch from public API is currently the only way to
+ // force code save location. We do not use this the object directly.
+ v8::TryCatch try_catch;
+ try_catch.SetVerbose(true);
+
+ // A logical 'try' section.
+ CompileScriptForTracker(isolate, script);
+ }
+
+ // A logical 'catch' section.
+ Handle<Object> rethrow_exception;
+ if (isolate->has_pending_exception()) {
+ Handle<Object> exception(isolate->pending_exception()->ToObjectChecked());
+ MessageLocation message_location = isolate->GetMessageLocation();
+
+ isolate->clear_pending_message();
+ isolate->clear_pending_exception();
+
+ // If possible, copy positions from message object to exception object.
+ if (exception->IsJSObject() && !message_location.script().is_null()) {
+ Handle<JSObject> exception_struct = Handle<JSObject>::cast(exception);
+
+ Factory* factory = isolate->factory();
+ JSReceiver::SetProperty(exception_struct,
+ factory->LookupAsciiSymbol("startPosition"),
Michael Starzinger 2012/12/04 09:51:05 This pattern is not GC safe. Other handles might h
+ Handle<Smi>(Smi::FromInt(message_location.start_pos())),
+ NONE, kNonStrictMode);
+ JSReceiver::SetProperty(exception_struct,
+ factory->LookupAsciiSymbol("endPosition"),
Michael Starzinger 2012/12/04 09:51:05 Likewise.
+ Handle<Smi>(Smi::FromInt(message_location.end_pos())),
+ NONE, kNonStrictMode);
+ JSReceiver::SetProperty(exception_struct,
+ factory->LookupAsciiSymbol("scriptObject"),
Michael Starzinger 2012/12/04 09:51:05 Likewise.
+ GetScriptWrapper(message_location.script()),
+ NONE, kNonStrictMode);
+ }
+
+ rethrow_exception = exception;
+ }
+
+ // A logical 'finally' section.
isolate->set_active_function_info_listener(NULL);
script->set_source(*original_source);
- return *(listener.GetResult());
+ if (rethrow_exception.is_null()) {
+ return *(listener.GetResult());
+ } else {
+ isolate->Throw(*rethrow_exception);
+ return 0;
+ }
}
« no previous file with comments | « src/isolate.cc ('k') | src/liveedit-debugger.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698