diff --git a/core/libdeno/binding.cc b/core/libdeno/binding.cc index 4aeb6003af..f8ef1c7a79 100644 --- a/core/libdeno/binding.cc +++ b/core/libdeno/binding.cc @@ -96,9 +96,11 @@ void PromiseRejectCallback(v8::PromiseRejectMessage promise_reject_message) { } void Print(const v8::FunctionCallbackInfo& args) { - CHECK_GE(args.Length(), 1); - CHECK_LE(args.Length(), 3); auto* isolate = args.GetIsolate(); + int argsLen = args.Length(); + if (argsLen < 1 || argsLen > 2) { + ThrowInvalidArgument(isolate); + } DenoIsolate* d = DenoIsolate::FromIsolate(isolate); auto context = d->context_.Get(d->isolate_); v8::HandleScope handle_scope(isolate); @@ -375,7 +377,11 @@ void EvalContext(const v8::FunctionCallbackInfo& args) { auto context = d->context_.Get(isolate); v8::Context::Scope context_scope(context); - CHECK(args[0]->IsString()); + if (!(args[0]->IsString())) { + ThrowInvalidArgument(isolate); + return; + } + auto source = args[0].As(); auto output = v8::Array::New(isolate, 2); diff --git a/core/libdeno/exceptions.cc b/core/libdeno/exceptions.cc index 85f0ca3408..8f5779acdc 100644 --- a/core/libdeno/exceptions.cc +++ b/core/libdeno/exceptions.cc @@ -214,4 +214,9 @@ void HandleExceptionMessage(v8::Local context, CHECK_NOT_NULL(d); d->last_exception_ = json_str; } + +void ThrowInvalidArgument(v8::Isolate* isolate) { + isolate->ThrowException(v8::Exception::TypeError(v8_str("Invalid Argument"))); +} + } // namespace deno diff --git a/core/libdeno/exceptions.h b/core/libdeno/exceptions.h index e07ff183a1..413bcb7ef6 100644 --- a/core/libdeno/exceptions.h +++ b/core/libdeno/exceptions.h @@ -18,6 +18,8 @@ void HandleException(v8::Local context, void HandleExceptionMessage(v8::Local context, v8::Local message); + +void ThrowInvalidArgument(v8::Isolate* isolate); } // namespace deno #endif // EXCEPTIONS_H_ diff --git a/core/libdeno/libdeno_test.cc b/core/libdeno/libdeno_test.cc index e09a973b21..485c95bff2 100644 --- a/core/libdeno/libdeno_test.cc +++ b/core/libdeno/libdeno_test.cc @@ -235,6 +235,20 @@ TEST(LibDenoTest, LibDenoEvalContextError) { deno_delete(d); } +TEST(LibDenoTest, LibDenoEvalContextInvalidArgument) { + Deno* d = deno_new(deno_config{0, snapshot, empty, nullptr, nullptr}); + deno_execute(d, nullptr, "a.js", "LibDenoEvalContextInvalidArgument();"); + EXPECT_EQ(nullptr, deno_last_exception(d)); + deno_delete(d); +} + +TEST(LibDenoTest, LibDenoPrintInvalidArgument) { + Deno* d = deno_new(deno_config{0, snapshot, empty, nullptr, nullptr}); + deno_execute(d, nullptr, "a.js", "LibDenoPrintInvalidArgument();"); + EXPECT_EQ(nullptr, deno_last_exception(d)); + deno_delete(d); +} + TEST(LibDenoTest, SharedAtomics) { int32_t s[] = {0, 1, 2}; deno_buf shared = {reinterpret_cast(s), sizeof s}; diff --git a/core/libdeno/libdeno_test.js b/core/libdeno/libdeno_test.js index 156af1e471..17a6343cfc 100644 --- a/core/libdeno/libdeno_test.js +++ b/core/libdeno/libdeno_test.js @@ -195,3 +195,27 @@ global.LibDenoEvalContextError = () => { assert(!errInfo5.isCompileError); // is NOT a compilation error! (just eval) assert(errInfo5.thrown.message === "Unexpected end of input"); }; + +global.LibDenoEvalContextInvalidArgument = () => { + try { + Deno.core.evalContext(); + } catch (e) { + assert(e instanceof TypeError); + assert(e.message === "Invalid Argument"); + } +}; + +global.LibDenoPrintInvalidArgument = () => { + try { + Deno.core.print(); + } catch (e) { + assert(e instanceof TypeError); + assert(e.message === "Invalid Argument"); + } + try { + Deno.core.print(2, 3, 4); + } catch (e) { + assert(e instanceof TypeError); + assert(e.message === "Invalid Argument"); + } +};