summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/deno.cc9
-rw-r--r--src/js/mock_runtime.js13
-rw-r--r--src/mock_runtime_test.cc13
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();