diff options
-rw-r--r-- | src/deno.cc | 9 | ||||
-rw-r--r-- | src/js/mock_runtime.js | 13 | ||||
-rw-r--r-- | src/mock_runtime_test.cc | 13 |
3 files changed, 32 insertions, 3 deletions
diff --git a/src/deno.cc b/src/deno.cc index 0ebdf380c..90d14f631 100644 --- a/src/deno.cc +++ b/src/deno.cc @@ -57,11 +57,14 @@ void HandleException(v8::Local<v8::Context> context, if (onerror->IsFunction()) { auto func = v8::Local<v8::Function>::Cast(onerror); v8::Local<v8::Value> 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 166df5fc5..bb814e7c8 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 5f44902ad..beb4e95a8 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<size_t>(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(); |