summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libdeno/binding.cc11
-rw-r--r--libdeno/libdeno_test.cc15
2 files changed, 22 insertions, 4 deletions
diff --git a/libdeno/binding.cc b/libdeno/binding.cc
index c3232bae1..ef5d5a226 100644
--- a/libdeno/binding.cc
+++ b/libdeno/binding.cc
@@ -99,10 +99,13 @@ std::string EncodeExceptionAsJSON(v8::Local<v8::Context> 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("<unknown>");
+ }
+ 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 6ee8979ee..5a4a93077 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\":\"<unknown>\","
+ "\"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};