@@ -28,15 +28,38 @@ bool SetOption(Environment* env,
28
28
}
29
29
30
30
template <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>
31
42
bool SetOption (Environment* env,
32
43
Opt* options,
33
44
const v8::Local<v8::Object>& object,
34
45
const v8::Local<v8::String>& name) {
35
46
v8::Local<v8::Value> value;
36
47
if (!object->Get (env->context (), name).ToLocal (&value)) return false ;
37
48
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 ();
40
63
}
41
64
return true ;
42
65
}
@@ -50,20 +73,31 @@ bool SetOption(Environment* env,
50
73
if (!object->Get (env->context (), name).ToLocal (&value)) return false ;
51
74
52
75
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 ());
54
83
55
84
uint64_t val = 0 ;
56
85
if (value->IsBigInt ()) {
57
86
bool lossless = true ;
58
87
val = value.As <v8::BigInt>()->Uint64Value (&lossless);
59
88
if (!lossless) {
60
89
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);
63
91
return false ;
64
92
}
65
93
} 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);
67
101
}
68
102
options->*member = val;
69
103
}
0 commit comments