@@ -730,40 +730,29 @@ void EnvDeleter(Local<Name> property,
730
730
void EnvEnumerator (const PropertyCallbackInfo<Array>& info) {
731
731
Environment* env = Environment::GetCurrent (info);
732
732
Isolate* isolate = env->isolate ();
733
- Local<Context> ctx = env->context ();
734
- Local<Function> fn = env->push_values_to_array_function ();
735
- Local<Value> argv[NODE_PUSH_VAL_TO_ARRAY_MAX];
736
- size_t idx = 0 ;
737
733
738
734
Mutex::ScopedLock lock (environ_mutex);
735
+ Local<Array> envarr;
736
+ int env_size = 0 ;
739
737
#ifdef __POSIX__
740
- int size = 0 ;
741
- while (environ[size])
742
- size++;
743
-
744
- Local<Array> envarr = Array::New (isolate);
738
+ while (environ[env_size]) {
739
+ env_size++;
740
+ }
741
+ std::vector<Local<Value>> env_v (env_size);
745
742
746
- for (int i = 0 ; i < size ; ++i) {
743
+ for (int i = 0 ; i < env_size ; ++i) {
747
744
const char * var = environ[i];
748
745
const char * s = strchr (var, ' =' );
749
746
const int length = s ? s - var : strlen (var);
750
- argv[idx] = String::NewFromUtf8 (isolate,
751
- var,
752
- v8::NewStringType::kNormal ,
753
- length).ToLocalChecked ();
754
- if (++idx >= arraysize (argv)) {
755
- fn->Call (ctx, envarr, idx, argv).ToLocalChecked ();
756
- idx = 0 ;
757
- }
758
- }
759
- if (idx > 0 ) {
760
- fn->Call (ctx, envarr, idx, argv).ToLocalChecked ();
747
+ env_v[i] =
748
+ String::NewFromUtf8 (isolate, var, v8::NewStringType::kNormal , length)
749
+ .ToLocalChecked ();
761
750
}
762
751
#else // _WIN32
752
+ std::vector<Local<Value>> env_v;
763
753
WCHAR* environment = GetEnvironmentStringsW ();
764
754
if (environment == nullptr )
765
755
return ; // This should not happen.
766
- Local<Array> envarr = Array::New (isolate);
767
756
WCHAR* p = environment;
768
757
while (*p) {
769
758
WCHAR* s;
@@ -789,19 +778,13 @@ void EnvEnumerator(const PropertyCallbackInfo<Array>& info) {
789
778
FreeEnvironmentStringsW (environment);
790
779
return ;
791
780
}
792
- argv[idx] = rc.ToLocalChecked ();
793
- if (++idx >= arraysize (argv)) {
794
- fn->Call (ctx, envarr, idx, argv).ToLocalChecked ();
795
- idx = 0 ;
796
- }
781
+ env_v.push_back (rc.ToLocalChecked ());
797
782
p = s + wcslen (s) + 1 ;
798
783
}
799
- if (idx > 0 ) {
800
- fn->Call (ctx, envarr, idx, argv).ToLocalChecked ();
801
- }
802
784
FreeEnvironmentStringsW (environment);
803
785
#endif
804
786
787
+ envarr = Array::New (isolate, env_v.data (), env_v.size ());
805
788
info.GetReturnValue ().Set (envarr);
806
789
}
807
790
0 commit comments