Skip to content

Commit

Permalink
bootstrap: mksnapshot should show JS error
Browse files Browse the repository at this point in the history
PR-URL: nodejs#38174
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: James M Snell <jasnell@gmail.com>
  • Loading branch information
bmeck committed Apr 13, 2021
1 parent 7b2bad4 commit 8d9d823
Showing 1 changed file with 41 additions and 0 deletions.
41 changes: 41 additions & 0 deletions tools/snapshot/snapshot_builder.cc
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,12 @@ using v8::Context;
using v8::HandleScope;
using v8::Isolate;
using v8::Local;
using v8::Object;
using v8::SnapshotCreator;
using v8::StartupData;
using v8::String;
using v8::TryCatch;
using v8::Value;

template <typename T>
void WriteVector(std::stringstream* ss, const T* vec, size_t size) {
Expand Down Expand Up @@ -79,6 +83,10 @@ std::string SnapshotBuilder::Generate(
const std::vector<std::string> args,
const std::vector<std::string> exec_args) {
Isolate* isolate = Isolate::Allocate();
isolate->SetCaptureStackTraceForUncaughtExceptions(
true,
10,
v8::StackTrace::StackTraceOptions::kDetailed);
per_process::v8_platform.Platform()->RegisterIsolate(isolate,
uv_default_loop());
std::unique_ptr<NodeMainInstance> main_instance;
Expand All @@ -104,7 +112,40 @@ std::string SnapshotBuilder::Generate(
creator.SetDefaultContext(Context::New(isolate));
isolate_data_indexes = main_instance->isolate_data()->Serialize(&creator);

TryCatch bootstrapCatch(isolate);
Local<Context> context = NewContext(isolate);
if (bootstrapCatch.HasCaught()) {
Local<Object> obj = bootstrapCatch.Exception()->ToObject(context)
.ToLocalChecked();
Local<Value> stack = obj->Get(
context,
FIXED_ONE_BYTE_STRING(isolate, "stack")).ToLocalChecked();
if (stack->IsUndefined()) {
Local<String> str = obj->Get(
context,
FIXED_ONE_BYTE_STRING(isolate, "name"))
.ToLocalChecked()->ToString(context).ToLocalChecked();
str = String::Concat(
isolate,
str,
FIXED_ONE_BYTE_STRING(isolate, ": "));
stack = String::Concat(
isolate,
str,
obj->Get(
context,
FIXED_ONE_BYTE_STRING(isolate, "message"))
.ToLocalChecked()->ToString(context).ToLocalChecked());
}
v8::String::Utf8Value utf8_value(isolate, stack);
if (*utf8_value != nullptr) {
std::string out(*utf8_value, utf8_value.length());
fprintf(stderr, "Had Exception: %s\n", out.c_str());
} else {
fprintf(stderr, "Unknown JS Exception\n");
}
abort();
}
Context::Scope context_scope(context);

env = new Environment(main_instance->isolate_data(),
Expand Down

0 comments on commit 8d9d823

Please sign in to comment.