@@ -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" 
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" 
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" 
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." ToString () + "  is out of range" c_str ());
90+         THROW_ERR_INVALID_ARG_VALUE (env, " option %s is out of range" 
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" 
98+         return  false ;
99+       }
100+       val = static_cast <uint64_t >(dbl);
67101    }
68102    options->*member = val;
69103  }
0 commit comments