diff --git a/src/deno.cc b/src/deno.cc index 0ebdf380cb..90d14f6316 100644 --- a/src/deno.cc +++ b/src/deno.cc @@ -57,11 +57,14 @@ void HandleException(v8::Local context, if (onerror->IsFunction()) { auto func = v8::Local::Cast(onerror); v8::Local args[5]; - auto origin = message->GetScriptOrigin(); + auto line = + v8::Integer::New(isolate, message->GetLineNumber(context).FromJust()); + auto column = + v8::Integer::New(isolate, message->GetStartColumn(context).FromJust()); args[0] = exception->ToString(); args[1] = message->GetScriptResourceName(); - args[2] = origin.ResourceLineOffset(); - args[3] = origin.ResourceColumnOffset(); + args[2] = line; + args[3] = column; args[4] = exception; func->Call(context->Global(), 5, args); /* message, source, lineno, colno, error */ diff --git a/src/js/mock_runtime.js b/src/js/mock_runtime.js index 166df5fc5d..bb814e7c86 100644 --- a/src/js/mock_runtime.js +++ b/src/js/mock_runtime.js @@ -75,3 +75,16 @@ global.DoubleSubFails = () => { global.SnapshotBug = () => { assert("1,2,3" === String([1, 2, 3])); }; + +global.ErrorHandling = () => { + global.onerror = (message, source, line, col, error) => { + deno.print(`line ${line} col ${col}`); + assert("ReferenceError: notdefined is not defined" === message); + assert(source === "helloworld.js"); + assert(line === 3); + assert(col === 1); + assert(error instanceof Error); + deno.pub("ErrorHandling", typedArrayToArrayBuffer(new Uint8Array([42]))); + }; + eval("\n\n notdefined()\n//# sourceURL=helloworld.js"); +}; diff --git a/src/mock_runtime_test.cc b/src/mock_runtime_test.cc index 5f44902adc..beb4e95a89 100644 --- a/src/mock_runtime_test.cc +++ b/src/mock_runtime_test.cc @@ -96,6 +96,19 @@ TEST(MockRuntimeTest, SnapshotBug) { deno_delete(d); } +TEST(MockRuntimeTest, ErrorHandling) { + static int count = 0; + Deno* d = deno_new(nullptr, [](auto deno, auto channel, auto buf) { + count++; + EXPECT_STREQ(channel, "ErrorHandling"); + EXPECT_EQ(static_cast(1), buf.len); + EXPECT_EQ(buf.data[0], 42); + }); + EXPECT_FALSE(deno_execute(d, "a.js", "ErrorHandling()")); + EXPECT_EQ(count, 1); + deno_delete(d); +} + int main(int argc, char** argv) { testing::InitGoogleTest(&argc, argv); deno_init();