@@ -2560,31 +2560,42 @@ static void EnvDeleter(Local<String> property,
2560
2560
2561
2561
2562
2562
static void EnvEnumerator (const PropertyCallbackInfo<Array>& info) {
2563
- Isolate* isolate = info.GetIsolate ();
2563
+ Environment* env = Environment::GetCurrent (info);
2564
+ Isolate* isolate = env->isolate ();
2565
+ Local<Context> ctx = env->context ();
2566
+ Local<Function> fn = env->push_values_to_array_function ();
2567
+ Local<Value> argv[NODE_PUSH_VAL_TO_ARRAY_MAX];
2568
+ size_t idx = 0 ;
2569
+
2564
2570
#ifdef __POSIX__
2565
2571
int size = 0 ;
2566
2572
while (environ[size])
2567
2573
size++;
2568
2574
2569
- Local<Array> envarr = Array::New (isolate, size );
2575
+ Local<Array> envarr = Array::New (isolate);
2570
2576
2571
2577
for (int i = 0 ; i < size; ++i) {
2572
2578
const char * var = environ[i];
2573
2579
const char * s = strchr (var, ' =' );
2574
2580
const int length = s ? s - var : strlen (var);
2575
- Local<String> name = String::NewFromUtf8 (isolate,
2576
- var,
2577
- String::kNormalString ,
2578
- length);
2579
- envarr->Set (i, name);
2581
+ argv[idx] = String::NewFromUtf8 (isolate,
2582
+ var,
2583
+ String::kNormalString ,
2584
+ length);
2585
+ if (++idx >= ARRAY_SIZE (argv)) {
2586
+ fn->Call (ctx, envarr, idx, argv).ToLocalChecked ();
2587
+ idx = 0 ;
2588
+ }
2589
+ }
2590
+ if (idx > 0 ) {
2591
+ fn->Call (ctx, envarr, idx, argv).ToLocalChecked ();
2580
2592
}
2581
2593
#else // _WIN32
2582
2594
WCHAR* environment = GetEnvironmentStringsW ();
2583
2595
if (environment == nullptr )
2584
2596
return ; // This should not happen.
2585
2597
Local<Array> envarr = Array::New (isolate);
2586
2598
WCHAR* p = environment;
2587
- int i = 0 ;
2588
2599
while (*p) {
2589
2600
WCHAR *s;
2590
2601
if (*p == L' =' ) {
@@ -2599,13 +2610,19 @@ static void EnvEnumerator(const PropertyCallbackInfo<Array>& info) {
2599
2610
}
2600
2611
const uint16_t * two_byte_buffer = reinterpret_cast <const uint16_t *>(p);
2601
2612
const size_t two_byte_buffer_len = s - p;
2602
- Local<String> value = String::NewFromTwoByte (isolate,
2603
- two_byte_buffer,
2604
- String::kNormalString ,
2605
- two_byte_buffer_len);
2606
- envarr->Set (i++, value);
2613
+ argv[idx] = String::NewFromTwoByte (isolate,
2614
+ two_byte_buffer,
2615
+ String::kNormalString ,
2616
+ two_byte_buffer_len);
2617
+ if (++idx >= ARRAY_SIZE (argv)) {
2618
+ fn->Call (ctx, envarr, idx, argv).ToLocalChecked ();
2619
+ idx = 0 ;
2620
+ }
2607
2621
p = s + wcslen (s) + 1 ;
2608
2622
}
2623
+ if (idx > 0 ) {
2624
+ fn->Call (ctx, envarr, idx, argv).ToLocalChecked ();
2625
+ }
2609
2626
FreeEnvironmentStringsW (environment);
2610
2627
#endif
2611
2628
0 commit comments