diff --git a/libdeno/binding.cc b/libdeno/binding.cc index c3232bae10..ef5d5a2269 100644 --- a/libdeno/binding.cc +++ b/libdeno/binding.cc @@ -99,10 +99,13 @@ std::string EncodeExceptionAsJSON(v8::Local context, CHECK(frame_obj ->Set(context, v8_str("functionName"), frame->GetFunctionName()) .FromJust()); - CHECK(frame_obj - ->Set(context, v8_str("scriptName"), - frame->GetScriptNameOrSourceURL()) - .FromJust()); + // scriptName can be empty in special conditions e.g. eval + auto scriptName = frame->GetScriptNameOrSourceURL(); + if (scriptName.IsEmpty()) { + scriptName = v8_str(""); + } + CHECK( + frame_obj->Set(context, v8_str("scriptName"), scriptName).FromJust()); CHECK(frame_obj ->Set(context, v8_str("isEval"), v8::Boolean::New(isolate, frame->IsEval())) diff --git a/libdeno/libdeno_test.cc b/libdeno/libdeno_test.cc index 6ee8979eec..5a4a930775 100644 --- a/libdeno/libdeno_test.cc +++ b/libdeno/libdeno_test.cc @@ -236,6 +236,21 @@ TEST(LibDenoTest, LastException) { deno_delete(d); } +TEST(LibDenoTest, EncodeErrorBug) { + Deno* d = deno_new(deno_config{0, empty, empty, nullptr, nullptr}); + EXPECT_EQ(deno_last_exception(d), nullptr); + EXPECT_FALSE(deno_execute(d, nullptr, "a.js", "eval('a')")); + EXPECT_STREQ(deno_last_exception(d), + "{\"message\":\"ReferenceError: a is not defined\"," + "\"frames\":[{\"line\":1,\"column\":1," + "\"functionName\":\"\",\"scriptName\":\"\"," + "\"isEval\":true," + "\"isConstructor\":false,\"isWasm\":false},{\"line\":1," + "\"column\":1,\"functionName\":\"\",\"scriptName\":\"a.js\"," + "\"isEval\":false,\"isConstructor\":false,\"isWasm\":false}]}"); + deno_delete(d); +} + TEST(LibDenoTest, Shared) { uint8_t s[] = {0, 1, 2}; deno_buf shared = {nullptr, 0, s, 3};