Commit 0fc36340 authored by Clemens Hammacher's avatar Clemens Hammacher Committed by Commit Bot

[d8] Don't process message queues in load

After processing the string loaded from a file, don't process message
queues. Otherwise, stack traces generated in any processed task will
contain the stack trace of the load. This also introduces
nondeterminism, since it depends on the timing whether something will
be processed inside the load or outside.

Drive-by: Introduce enums for the different bools, to make their
meaning more obvious at call sites.

R=yangguo@chromium.org
CC=herhut@chromium.org

Change-Id: Ib48ee01be8c443a2a408ecb1c9e34bb9ba5a8fe7
Reviewed-on: https://chromium-review.googlesource.com/964141Reviewed-by: 's avatarYang Guo <yangguo@chromium.org>
Commit-Queue: Clemens Hammacher <clemensh@chromium.org>
Cr-Commit-Position: refs/heads/master@{#51952}
parent 9fe417cb
...@@ -572,8 +572,9 @@ void Shell::StoreInCodeCache(Isolate* isolate, Local<Value> source, ...@@ -572,8 +572,9 @@ void Shell::StoreInCodeCache(Isolate* isolate, Local<Value> source,
// Executes a string within the current v8 context. // Executes a string within the current v8 context.
bool Shell::ExecuteString(Isolate* isolate, Local<String> source, bool Shell::ExecuteString(Isolate* isolate, Local<String> source,
Local<Value> name, bool print_result, Local<Value> name, PrintResult print_result,
bool report_exceptions) { ReportExceptions report_exceptions,
ProcessMessageQueue process_message_queue) {
HandleScope handle_scope(isolate); HandleScope handle_scope(isolate);
TryCatch try_catch(isolate); TryCatch try_catch(isolate);
try_catch.SetVerbose(true); try_catch.SetVerbose(true);
...@@ -651,7 +652,7 @@ bool Shell::ExecuteString(Isolate* isolate, Local<String> source, ...@@ -651,7 +652,7 @@ bool Shell::ExecuteString(Isolate* isolate, Local<String> source,
StoreInCodeCache(isolate, source, cached_data); StoreInCodeCache(isolate, source, cached_data);
delete cached_data; delete cached_data;
} }
if (!EmptyMessageQueues(isolate)) success = false; if (process_message_queue && !EmptyMessageQueues(isolate)) success = false;
data->realm_current_ = data->realm_switch_; data->realm_current_ = data->realm_switch_;
} }
Local<Value> result; Local<Value> result;
...@@ -1373,11 +1374,14 @@ void Shell::Load(const v8::FunctionCallbackInfo<v8::Value>& args) { ...@@ -1373,11 +1374,14 @@ void Shell::Load(const v8::FunctionCallbackInfo<v8::Value>& args) {
Throw(args.GetIsolate(), "Error loading file"); Throw(args.GetIsolate(), "Error loading file");
return; return;
} }
if (!ExecuteString(args.GetIsolate(), source, if (!ExecuteString(
String::NewFromUtf8(args.GetIsolate(), *file, args.GetIsolate(), source,
NewStringType::kNormal) String::NewFromUtf8(args.GetIsolate(), *file,
.ToLocalChecked(), NewStringType::kNormal)
false, !options.quiet_load)) { .ToLocalChecked(),
kNoPrintResult,
options.quiet_load ? kNoReportExceptions : kReportExceptions,
kNoProcessMessageQueue)) {
Throw(args.GetIsolate(), "Error executing file"); Throw(args.GetIsolate(), "Error executing file");
return; return;
} }
...@@ -2269,7 +2273,8 @@ void Shell::RunShell(Isolate* isolate) { ...@@ -2269,7 +2273,8 @@ void Shell::RunShell(Isolate* isolate) {
printf("d8> "); printf("d8> ");
Local<String> input = Shell::ReadFromStdin(isolate); Local<String> input = Shell::ReadFromStdin(isolate);
if (input.IsEmpty()) break; if (input.IsEmpty()) break;
ExecuteString(isolate, input, name, true, true); ExecuteString(isolate, input, name, kPrintResult, kReportExceptions,
kProcessMessageQueue);
} }
printf("\n"); printf("\n");
// We need to explicitly clean up the module embedder data for // We need to explicitly clean up the module embedder data for
...@@ -2431,7 +2436,9 @@ void SourceGroup::Execute(Isolate* isolate) { ...@@ -2431,7 +2436,9 @@ void SourceGroup::Execute(Isolate* isolate) {
String::NewFromUtf8(isolate, argv_[i + 1], NewStringType::kNormal) String::NewFromUtf8(isolate, argv_[i + 1], NewStringType::kNormal)
.ToLocalChecked(); .ToLocalChecked();
Shell::options.script_executed = true; Shell::options.script_executed = true;
if (!Shell::ExecuteString(isolate, source, file_name, false, true)) { if (!Shell::ExecuteString(isolate, source, file_name,
Shell::kNoPrintResult, Shell::kReportExceptions,
Shell::kNoProcessMessageQueue)) {
exception_was_thrown = true; exception_was_thrown = true;
break; break;
} }
...@@ -2462,7 +2469,9 @@ void SourceGroup::Execute(Isolate* isolate) { ...@@ -2462,7 +2469,9 @@ void SourceGroup::Execute(Isolate* isolate) {
Shell::Exit(1); Shell::Exit(1);
} }
Shell::options.script_executed = true; Shell::options.script_executed = true;
if (!Shell::ExecuteString(isolate, source, file_name, false, true)) { if (!Shell::ExecuteString(isolate, source, file_name, Shell::kNoPrintResult,
Shell::kReportExceptions,
Shell::kProcessMessageQueue)) {
exception_was_thrown = true; exception_was_thrown = true;
break; break;
} }
...@@ -2670,7 +2679,9 @@ void Worker::ExecuteInThread() { ...@@ -2670,7 +2679,9 @@ void Worker::ExecuteInThread() {
Local<String> source = Local<String> source =
String::NewFromUtf8(isolate, script_, NewStringType::kNormal) String::NewFromUtf8(isolate, script_, NewStringType::kNormal)
.ToLocalChecked(); .ToLocalChecked();
if (Shell::ExecuteString(isolate, source, file_name, false, true)) { if (Shell::ExecuteString(
isolate, source, file_name, Shell::kNoPrintResult,
Shell::kReportExceptions, Shell::kProcessMessageQueue)) {
// Get the message handler // Get the message handler
Local<Value> onmessage = Local<Value> onmessage =
global->Get(context, String::NewFromUtf8(isolate, "onmessage", global->Get(context, String::NewFromUtf8(isolate, "onmessage",
......
...@@ -356,9 +356,20 @@ class ShellOptions { ...@@ -356,9 +356,20 @@ class ShellOptions {
class Shell : public i::AllStatic { class Shell : public i::AllStatic {
public: public:
enum PrintResult : bool { kPrintResult = true, kNoPrintResult = false };
enum ReportExceptions : bool {
kReportExceptions = true,
kNoReportExceptions = false
};
enum ProcessMessageQueue : bool {
kProcessMessageQueue = true,
kNoProcessMessageQueue = false
};
static bool ExecuteString(Isolate* isolate, Local<String> source, static bool ExecuteString(Isolate* isolate, Local<String> source,
Local<Value> name, bool print_result, Local<Value> name, PrintResult print_result,
bool report_exceptions); ReportExceptions report_exceptions,
ProcessMessageQueue process_message_queue);
static bool ExecuteModule(Isolate* isolate, const char* file_name); static bool ExecuteModule(Isolate* isolate, const char* file_name);
static void ReportException(Isolate* isolate, TryCatch* try_catch); static void ReportException(Isolate* isolate, TryCatch* try_catch);
static Local<String> ReadFile(Isolate* isolate, const char* name); static Local<String> ReadFile(Isolate* isolate, const char* name);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment