aboutsummaryrefslogtreecommitdiff
path: root/deps/v8/src/d8.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/d8.cc')
-rw-r--r--deps/v8/src/d8.cc69
1 files changed, 48 insertions, 21 deletions
diff --git a/deps/v8/src/d8.cc b/deps/v8/src/d8.cc
index cd54285d3a..0c069ba713 100644
--- a/deps/v8/src/d8.cc
+++ b/deps/v8/src/d8.cc
@@ -36,10 +36,14 @@
#include "src/objects-inl.h"
#include "src/objects.h"
#include "src/ostreams.h"
+#include "src/parsing/parse-info.h"
+#include "src/parsing/parsing.h"
+#include "src/parsing/scanner-character-streams.h"
#include "src/snapshot/natives.h"
#include "src/trap-handler/trap-handler.h"
#include "src/utils.h"
#include "src/v8.h"
+#include "src/vm-state-inl.h"
#include "src/wasm/wasm-engine.h"
#if !defined(_WIN32) && !defined(_WIN64)
@@ -464,6 +468,27 @@ bool Shell::ExecuteString(Isolate* isolate, Local<String> source,
Local<Value> name, PrintResult print_result,
ReportExceptions report_exceptions,
ProcessMessageQueue process_message_queue) {
+ if (i::FLAG_parse_only) {
+ i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
+ i::VMState<PARSER> state(i_isolate);
+ i::Handle<i::String> str = Utils::OpenHandle(*(source));
+
+ // Set up ParseInfo.
+ i::ParseInfo parse_info(i_isolate);
+ parse_info.set_toplevel();
+ parse_info.set_allow_lazy_parsing();
+ parse_info.set_language_mode(
+ i::construct_language_mode(i::FLAG_use_strict));
+ parse_info.set_script(
+ parse_info.CreateScript(i_isolate, str, options.compile_options));
+
+ if (!i::parsing::ParseProgram(&parse_info, i_isolate)) {
+ fprintf(stderr, "Failed parsing\n");
+ return false;
+ }
+ return true;
+ }
+
HandleScope handle_scope(isolate);
TryCatch try_catch(isolate);
try_catch.SetVerbose(true);
@@ -2285,6 +2310,7 @@ class InspectorFrontend final : public v8_inspector::V8Inspector::Channel {
void Send(const v8_inspector::StringView& string) {
v8::Isolate::AllowJavascriptExecutionScope allow_script(isolate_);
+ v8::HandleScope handle_scope(isolate_);
int length = static_cast<int>(string.length());
DCHECK_LT(length, v8::String::kMaxLength);
Local<String> message =
@@ -2382,7 +2408,10 @@ class InspectorClient : public v8_inspector::V8InspectorClient {
std::unique_ptr<uint16_t[]> buffer(new uint16_t[length]);
message->Write(isolate, buffer.get(), 0, length);
v8_inspector::StringView message_view(buffer.get(), length);
- session->dispatchProtocolMessage(message_view);
+ {
+ v8::SealHandleScope seal_handle_scope(isolate);
+ session->dispatchProtocolMessage(message_view);
+ }
args.GetReturnValue().Set(True(isolate));
}
@@ -2409,8 +2438,8 @@ bool ends_with(const char* input, const char* suffix) {
return false;
}
-void SourceGroup::Execute(Isolate* isolate) {
- bool exception_was_thrown = false;
+bool SourceGroup::Execute(Isolate* isolate) {
+ bool success = true;
for (int i = begin_offset_; i < end_offset_; ++i) {
const char* arg = argv_[i];
if (strcmp(arg, "-e") == 0 && i + 1 < end_offset_) {
@@ -2426,7 +2455,7 @@ void SourceGroup::Execute(Isolate* isolate) {
if (!Shell::ExecuteString(isolate, source, file_name,
Shell::kNoPrintResult, Shell::kReportExceptions,
Shell::kNoProcessMessageQueue)) {
- exception_was_thrown = true;
+ success = false;
break;
}
++i;
@@ -2434,7 +2463,7 @@ void SourceGroup::Execute(Isolate* isolate) {
} else if (ends_with(arg, ".mjs")) {
Shell::set_script_executed();
if (!Shell::ExecuteModule(isolate, arg)) {
- exception_was_thrown = true;
+ success = false;
break;
}
continue;
@@ -2443,7 +2472,7 @@ void SourceGroup::Execute(Isolate* isolate) {
arg = argv_[++i];
Shell::set_script_executed();
if (!Shell::ExecuteModule(isolate, arg)) {
- exception_was_thrown = true;
+ success = false;
break;
}
continue;
@@ -2466,13 +2495,11 @@ void SourceGroup::Execute(Isolate* isolate) {
if (!Shell::ExecuteString(isolate, source, file_name, Shell::kNoPrintResult,
Shell::kReportExceptions,
Shell::kProcessMessageQueue)) {
- exception_was_thrown = true;
+ success = false;
break;
}
}
- if (exception_was_thrown != Shell::options.expected_to_throw) {
- base::OS::ExitProcess(1);
- }
+ return success;
}
Local<String> SourceGroup::ReadFile(Isolate* isolate, const char* name) {
@@ -2929,10 +2956,11 @@ int Shell::RunMain(Isolate* isolate, int argc, char* argv[], bool last_run) {
for (int i = 1; i < options.num_isolates; ++i) {
options.isolate_sources[i].StartExecuteInThread();
}
+ bool success = true;
{
SetWaitUntilDone(isolate, false);
if (options.lcov_file) {
- debug::Coverage::SelectMode(isolate, debug::Coverage::kBlockCount);
+ debug::Coverage::SelectMode(isolate, debug::CoverageMode::kBlockCount);
}
HandleScope scope(isolate);
Local<Context> context = CreateEvaluationContext(isolate);
@@ -2945,8 +2973,8 @@ int Shell::RunMain(Isolate* isolate, int argc, char* argv[], bool last_run) {
Context::Scope cscope(context);
InspectorClient inspector_client(context, options.enable_inspector);
PerIsolateData::RealmScope realm_scope(PerIsolateData::Get(isolate));
- options.isolate_sources[0].Execute(isolate);
- CompleteMessageLoop(isolate);
+ if (!options.isolate_sources[0].Execute(isolate)) success = false;
+ if (!CompleteMessageLoop(isolate)) success = false;
}
if (!use_existing_context) {
DisposeModuleEmbedderData(context);
@@ -2962,7 +2990,8 @@ int Shell::RunMain(Isolate* isolate, int argc, char* argv[], bool last_run) {
}
}
CleanupWorkers();
- return 0;
+ // In order to finish successfully, success must be != expected_to_throw.
+ return success == Shell::options.expected_to_throw ? 1 : 0;
}
@@ -2996,8 +3025,7 @@ bool ProcessMessages(
const std::function<platform::MessageLoopBehavior()>& behavior) {
while (true) {
i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
- i::SaveContext saved_context(i_isolate);
- i_isolate->set_context(i::Context());
+ i::SaveAndSwitchContext saved_context(i_isolate, i::Context());
SealHandleScope shs(isolate);
while (v8::platform::PumpMessageLoop(g_default_platform, isolate,
behavior())) {
@@ -3025,7 +3053,7 @@ bool ProcessMessages(
}
} // anonymous namespace
-void Shell::CompleteMessageLoop(Isolate* isolate) {
+bool Shell::CompleteMessageLoop(Isolate* isolate) {
auto get_waiting_behaviour = [isolate]() {
base::MutexGuard guard(isolate_status_lock_.Pointer());
DCHECK_GT(isolate_status_.count(isolate), 0);
@@ -3037,7 +3065,7 @@ void Shell::CompleteMessageLoop(Isolate* isolate) {
return should_wait ? platform::MessageLoopBehavior::kWaitForWork
: platform::MessageLoopBehavior::kDoNotWait;
};
- ProcessMessages(isolate, get_waiting_behaviour);
+ return ProcessMessages(isolate, get_waiting_behaviour);
}
bool Shell::EmptyMessageQueues(Isolate* isolate) {
@@ -3244,10 +3272,9 @@ class Deserializer : public ValueDeserializer::Delegate {
Isolate* isolate, uint32_t clone_id) override {
DCHECK_NOT_NULL(data_);
if (clone_id < data_->shared_array_buffer_contents().size()) {
- SharedArrayBuffer::Contents contents =
+ const SharedArrayBuffer::Contents contents =
data_->shared_array_buffer_contents().at(clone_id);
- return SharedArrayBuffer::New(isolate_, contents.Data(),
- contents.ByteLength());
+ return SharedArrayBuffer::New(isolate_, contents);
}
return MaybeLocal<SharedArrayBuffer>();
}