@@ -26,7 +26,6 @@ using v8::Maybe;
26
26
using v8::MaybeLocal;
27
27
using v8::Name;
28
28
using v8::NamedPropertyHandlerConfiguration;
29
- using v8::NewStringType;
30
29
using v8::Nothing;
31
30
using v8::Object;
32
31
using v8::ObjectTemplate;
@@ -45,7 +44,7 @@ class RealEnvStore final : public KVStore {
45
44
int32_t Query (Isolate* isolate, Local<String> key) const override ;
46
45
int32_t Query (const char * key) const override ;
47
46
void Delete (Isolate* isolate, Local<String> key) override ;
48
- Local <Array> Enumerate (Isolate* isolate) const override ;
47
+ MaybeLocal <Array> Enumerate (Isolate* isolate) const override ;
49
48
};
50
49
51
50
class MapKVStore final : public KVStore {
@@ -56,7 +55,7 @@ class MapKVStore final : public KVStore {
56
55
int32_t Query (Isolate* isolate, Local<String> key) const override ;
57
56
int32_t Query (const char * key) const override ;
58
57
void Delete (Isolate* isolate, Local<String> key) override ;
59
- Local <Array> Enumerate (Isolate* isolate) const override ;
58
+ MaybeLocal <Array> Enumerate (Isolate* isolate) const override ;
60
59
61
60
std::shared_ptr<KVStore> Clone (Isolate* isolate) const override ;
62
61
@@ -131,8 +130,12 @@ MaybeLocal<String> RealEnvStore::Get(Isolate* isolate,
131
130
132
131
if (value.has_value ()) {
133
132
std::string val = value.value ();
134
- return String::NewFromUtf8 (
135
- isolate, val.data (), NewStringType::kNormal , val.size ());
133
+ Local<Value> ret;
134
+ if (!ToV8Value (isolate->GetCurrentContext (), val).ToLocal (&ret)) {
135
+ return {};
136
+ }
137
+ DCHECK (ret->IsString ());
138
+ return ret.As <String>();
136
139
}
137
140
138
141
return MaybeLocal<String>();
@@ -188,7 +191,7 @@ void RealEnvStore::Delete(Isolate* isolate, Local<String> property) {
188
191
DateTimeConfigurationChangeNotification (isolate, key);
189
192
}
190
193
191
- Local <Array> RealEnvStore::Enumerate (Isolate* isolate) const {
194
+ MaybeLocal <Array> RealEnvStore::Enumerate (Isolate* isolate) const {
192
195
Mutex::ScopedLock lock (per_process::env_var_mutex);
193
196
uv_env_item_t * items;
194
197
int count;
@@ -203,12 +206,12 @@ Local<Array> RealEnvStore::Enumerate(Isolate* isolate) const {
203
206
// If the key starts with '=' it is a hidden environment variable.
204
207
if (items[i].name [0 ] == ' =' ) continue ;
205
208
#endif
206
- MaybeLocal<String > str = String::NewFromUtf8 (isolate, items[i]. name ) ;
207
- if (str. IsEmpty ( )) {
209
+ Local<Value > str;
210
+ if (! String::NewFromUtf8 (isolate, items[i]. name ). ToLocal (&str )) {
208
211
isolate->ThrowException (ERR_STRING_TOO_LONG (isolate));
209
- return Local<Array>() ;
212
+ return {} ;
210
213
}
211
- env_v[env_v_index++] = str. ToLocalChecked () ;
214
+ env_v[env_v_index++] = str;
212
215
}
213
216
214
217
return Array::New (isolate, env_v.out (), env_v_index);
@@ -219,14 +222,22 @@ std::shared_ptr<KVStore> KVStore::Clone(Isolate* isolate) const {
219
222
Local<Context> context = isolate->GetCurrentContext ();
220
223
221
224
std::shared_ptr<KVStore> copy = KVStore::CreateMapKVStore ();
222
- Local<Array> keys = Enumerate (isolate);
225
+ Local<Array> keys;
226
+ if (!Enumerate (isolate).ToLocal (&keys)) {
227
+ return nullptr ;
228
+ }
223
229
uint32_t keys_length = keys->Length ();
224
230
for (uint32_t i = 0 ; i < keys_length; i++) {
225
- Local<Value> key = keys->Get (context, i).ToLocalChecked ();
231
+ Local<Value> key;
232
+ Local<Value> value;
233
+ if (!keys->Get (context, i).ToLocal (&key)) {
234
+ return nullptr ;
235
+ }
226
236
CHECK (key->IsString ());
227
- copy->Set (isolate,
228
- key.As <String>(),
229
- Get (isolate, key.As <String>()).ToLocalChecked ());
237
+ if (!Get (isolate, key.As <String>()).ToLocal (&value)) {
238
+ return nullptr ;
239
+ }
240
+ copy->Set (isolate, key.As <String>(), value.As <String>());
230
241
}
231
242
return copy;
232
243
}
@@ -242,8 +253,12 @@ MaybeLocal<String> MapKVStore::Get(Isolate* isolate, Local<String> key) const {
242
253
std::optional<std::string> value = Get (*str);
243
254
if (!value.has_value ()) return MaybeLocal<String>();
244
255
std::string val = value.value ();
245
- return String::NewFromUtf8 (
246
- isolate, val.data (), NewStringType::kNormal , val.size ());
256
+ Local<Value> ret;
257
+ if (!ToV8Value (isolate->GetCurrentContext (), val).ToLocal (&ret)) {
258
+ return {};
259
+ }
260
+ DCHECK (ret->IsString ());
261
+ return ret.As <String>();
247
262
}
248
263
249
264
void MapKVStore::Set (Isolate* isolate, Local<String> key, Local<String> value) {
@@ -272,15 +287,16 @@ void MapKVStore::Delete(Isolate* isolate, Local<String> key) {
272
287
map_.erase (std::string (*str, str.length ()));
273
288
}
274
289
275
- Local <Array> MapKVStore::Enumerate (Isolate* isolate) const {
290
+ MaybeLocal <Array> MapKVStore::Enumerate (Isolate* isolate) const {
276
291
Mutex::ScopedLock lock (mutex_);
277
292
LocalVector<Value> values (isolate);
278
293
values.reserve (map_.size ());
279
294
for (const auto & pair : map_) {
280
- values.emplace_back (
281
- String::NewFromUtf8 (isolate, pair.first .data (),
282
- NewStringType::kNormal , pair.first .size ())
283
- .ToLocalChecked ());
295
+ Local<Value> val;
296
+ if (!ToV8Value (isolate->GetCurrentContext (), pair.first ).ToLocal (&val)) {
297
+ return {};
298
+ }
299
+ values.emplace_back (val);
284
300
}
285
301
return Array::New (isolate, values.data (), values.size ());
286
302
}
@@ -324,7 +340,10 @@ Maybe<void> KVStore::AssignToObject(v8::Isolate* isolate,
324
340
v8::Local<v8::Context> context,
325
341
v8::Local<v8::Object> object) {
326
342
HandleScope scope (isolate);
327
- Local<Array> keys = Enumerate (isolate);
343
+ Local<Array> keys;
344
+ if (!Enumerate (isolate).ToLocal (&keys)) {
345
+ return Nothing<void >();
346
+ }
328
347
uint32_t keys_length = keys->Length ();
329
348
for (uint32_t i = 0 ; i < keys_length; i++) {
330
349
Local<Value> key;
@@ -421,6 +440,7 @@ static Intercepted EnvGetter(Local<Name> property,
421
440
TraceEnvVar (env, " get" , property.As <String>());
422
441
423
442
if (has_env) {
443
+ // ToLocalChecked here is ok since we check IsEmpty above.
424
444
info.GetReturnValue ().Set (value_string.ToLocalChecked ());
425
445
return Intercepted::kYes ;
426
446
}
@@ -502,8 +522,10 @@ static void EnvEnumerator(const PropertyCallbackInfo<Array>& info) {
502
522
503
523
TraceEnvVar (env, " enumerate environment variables" );
504
524
505
- info.GetReturnValue ().Set (
506
- env->env_vars ()->Enumerate (env->isolate ()));
525
+ Local<Array> ret;
526
+ if (env->env_vars ()->Enumerate (env->isolate ()).ToLocal (&ret)) {
527
+ info.GetReturnValue ().Set (ret);
528
+ }
507
529
}
508
530
509
531
static Intercepted EnvDefiner (Local<Name> property,
0 commit comments