@@ -28,15 +28,38 @@ bool SetOption(Environment* env,
2828}
2929
3030template <typename Opt, bool Opt::*member>
31+ bool SetOption (Environment* env,
32+ Opt* options,
33+ const v8::Local<v8::Object>& object,
34+ const v8::Local<v8::String>& name) {
35+ v8::Local<v8::Value> value;
36+ if (!object->Get (env->context (), name).ToLocal (&value)) return false ;
37+ options->*member = value->BooleanValue (env->isolate ());
38+ return true ;
39+ }
40+
41+ template <typename Opt, uint32_t Opt::*member>
3142bool SetOption (Environment* env,
3243 Opt* options,
3344 const v8::Local<v8::Object>& object,
3445 const v8::Local<v8::String>& name) {
3546 v8::Local<v8::Value> value;
3647 if (!object->Get (env->context (), name).ToLocal (&value)) return false ;
3748 if (!value->IsUndefined ()) {
38- CHECK (value->IsBoolean ());
39- options->*member = value->IsTrue ();
49+ if (!value->IsUint32 ()) {
50+ Utf8Value nameStr (env->isolate (), name);
51+ THROW_ERR_INVALID_ARG_VALUE (
52+ env, " The %s option must be an uint32" , *nameStr);
53+ return false ;
54+ }
55+ v8::Local<v8::Uint32> num;
56+ if (!value->ToUint32 (env->context ()).ToLocal (&num)) {
57+ Utf8Value nameStr (env->isolate (), name);
58+ THROW_ERR_INVALID_ARG_VALUE (
59+ env, " The %s option must be an uint32" , *nameStr);
60+ return false ;
61+ }
62+ options->*member = num->Value ();
4063 }
4164 return true ;
4265}
@@ -50,20 +73,31 @@ bool SetOption(Environment* env,
5073 if (!object->Get (env->context (), name).ToLocal (&value)) return false ;
5174
5275 if (!value->IsUndefined ()) {
53- CHECK_IMPLIES (!value->IsBigInt (), value->IsNumber ());
76+ if (!value->IsBigInt () && !value->IsNumber ()) {
77+ Utf8Value nameStr (env->isolate (), name);
78+ THROW_ERR_INVALID_ARG_VALUE (
79+ env, " option %s must be a bigint or number" , *nameStr);
80+ return false ;
81+ }
82+ DCHECK_IMPLIES (!value->IsBigInt (), value->IsNumber ());
5483
5584 uint64_t val = 0 ;
5685 if (value->IsBigInt ()) {
5786 bool lossless = true ;
5887 val = value.As <v8::BigInt>()->Uint64Value (&lossless);
5988 if (!lossless) {
6089 Utf8Value label (env->isolate (), name);
61- THROW_ERR_OUT_OF_RANGE (
62- env, (" options." + label.ToString () + " is out of range" ).c_str ());
90+ THROW_ERR_INVALID_ARG_VALUE (env, " option %s is out of range" , *label);
6391 return false ;
6492 }
6593 } else {
66- val = static_cast <int64_t >(value.As <v8::Number>()->Value ());
94+ double dbl = value.As <v8::Number>()->Value ();
95+ if (dbl < 0 ) {
96+ Utf8Value label (env->isolate (), name);
97+ THROW_ERR_INVALID_ARG_VALUE (env, " option %s is out of range" , *label);
98+ return false ;
99+ }
100+ val = static_cast <uint64_t >(dbl);
67101 }
68102 options->*member = val;
69103 }
0 commit comments