@@ -506,66 +506,110 @@ bool JsArgConverter::ConvertJavaScriptArray(const Local<Array>& jsArr, int index
506
506
507
507
JEnv env;
508
508
switch (elementTypePrefix) {
509
- case ' Z' :
509
+ case ' Z' : {
510
510
arr = env.NewBooleanArray (arrLength);
511
+ jboolean bools[arrLength];
511
512
for (jsize i = 0 ; i < arrLength; i++) {
512
- jboolean value = jsArr->Get (context, i).ToLocalChecked ()->BooleanValue (m_isolate);
513
- env.SetBooleanArrayRegion ((jbooleanArray) arr, i, 1 , &value);
513
+ bools[i] = jsArr
514
+ ->Get (context, i)
515
+ .ToLocalChecked ()
516
+ ->BooleanValue (m_isolate);
514
517
}
518
+ env.SetBooleanArrayRegion ((jbooleanArray) arr, 0 , arrLength, bools);
515
519
break ;
516
- case ' B' :
520
+ }
521
+ case ' B' : {
517
522
arr = env.NewByteArray (arrLength);
523
+ jbyte bytes[arrLength];
518
524
for (jsize i = 0 ; i < arrLength; i++) {
519
- jbyte value = jsArr->Get (context, i).ToLocalChecked ()->Int32Value (context).ToChecked ();
520
- env.SetByteArrayRegion ((jbyteArray) arr, i, 1 , &value);
525
+ bytes[i] = jsArr
526
+ ->Get (context, i)
527
+ .ToLocalChecked ()
528
+ ->Int32Value (context)
529
+ .ToChecked ();
521
530
}
531
+ env.SetByteArrayRegion ((jbyteArray) arr, 0 , arrLength, bytes);
522
532
break ;
523
- case ' C' :
533
+ }
534
+ case ' C' : {
524
535
arr = env.NewCharArray (arrLength);
536
+ jchar chars[arrLength];
525
537
for (jsize i = 0 ; i < arrLength; i++) {
526
- String::Utf8Value utf8 (m_isolate, jsArr->Get (context, i).ToLocalChecked ()->ToString (context).ToLocalChecked ());
527
- JniLocalRef s (env.NewString ((jchar*) *utf8, 1 ));
528
- const char * singleChar = env.GetStringUTFChars (s, nullptr );
529
- jchar value = *singleChar;
538
+ String::Utf8Value utf8 (m_isolate, jsArr->Get (context, i).ToLocalChecked ()->ToString (
539
+ context).ToLocalChecked ());
540
+ JniLocalRef s (env.NewString ((jchar *) *utf8, 1 ));
541
+ const char *singleChar = env.GetStringUTFChars (s, nullptr );
542
+ chars[i] = *singleChar;
530
543
env.ReleaseStringUTFChars (s, singleChar);
531
- env.SetCharArrayRegion ((jcharArray) arr, i, 1 , &value);
532
544
}
545
+ env.SetCharArrayRegion ((jcharArray) arr, 0 , arrLength, chars);
533
546
break ;
534
- case ' S' :
547
+ }
548
+ case ' S' : {
535
549
arr = env.NewShortArray (arrLength);
550
+ jshort shorts[arrLength];
536
551
for (jsize i = 0 ; i < arrLength; i++) {
537
- jshort value = jsArr->Get (context, i).ToLocalChecked ()->Int32Value (context).ToChecked ();
538
- env.SetShortArrayRegion ((jshortArray) arr, i, 1 , &value);
552
+ shorts[i] = jsArr
553
+ ->Get (context, i)
554
+ .ToLocalChecked ()
555
+ ->Int32Value (context)
556
+ .ToChecked ();
539
557
}
558
+ env.SetShortArrayRegion ((jshortArray) arr, 0 , arrLength, shorts);
540
559
break ;
541
- case ' I' :
560
+ }
561
+ case ' I' : {
542
562
arr = env.NewIntArray (arrLength);
563
+ jint ints[arrLength];
543
564
for (jsize i = 0 ; i < arrLength; i++) {
544
- jint value = jsArr->Get (context, i).ToLocalChecked ()->Int32Value (context).ToChecked ();
545
- env.SetIntArrayRegion ((jintArray) arr, i, 1 , &value);
565
+ ints[i] = jsArr
566
+ ->Get (context, i)
567
+ .ToLocalChecked ()
568
+ ->Int32Value (context)
569
+ .ToChecked ();
546
570
}
571
+ env.SetIntArrayRegion ((jintArray) arr, 0 , arrLength, ints);
547
572
break ;
548
- case ' J' :
573
+ }
574
+ case ' J' : {
549
575
arr = env.NewLongArray (arrLength);
576
+ jlong longs[arrLength];
550
577
for (jsize i = 0 ; i < arrLength; i++) {
551
- jlong value = jsArr->Get (context, i).ToLocalChecked ()->NumberValue (context).ToChecked ();
552
- env.SetLongArrayRegion ((jlongArray) arr, i, 1 , &value);
578
+ longs[i] = jsArr
579
+ ->Get (context, i)
580
+ .ToLocalChecked ()
581
+ ->NumberValue (context)
582
+ .ToChecked ();
553
583
}
584
+ env.SetLongArrayRegion ((jlongArray) arr, 0 , arrLength, longs);
554
585
break ;
555
- case ' F' :
586
+ }
587
+ case ' F' : {
556
588
arr = env.NewFloatArray (arrLength);
589
+ jfloat floats[arrLength];
557
590
for (jsize i = 0 ; i < arrLength; i++) {
558
- jfloat value = jsArr->Get (context, i).ToLocalChecked ()->NumberValue (context).ToChecked ();
559
- env.SetFloatArrayRegion ((jfloatArray) arr, i, 1 , &value);
591
+ floats[i] = jsArr
592
+ ->Get (context, i)
593
+ .ToLocalChecked ()
594
+ ->NumberValue (context)
595
+ .ToChecked ();
560
596
}
597
+ env.SetFloatArrayRegion ((jfloatArray) arr, 0 , arrLength, floats);
561
598
break ;
562
- case ' D' :
599
+ }
600
+ case ' D' : {
563
601
arr = env.NewDoubleArray (arrLength);
602
+ jdouble doubles[arrLength];
564
603
for (jsize i = 0 ; i < arrLength; i++) {
565
- jdouble value = jsArr->Get (context, i).ToLocalChecked ()->NumberValue (context).ToChecked ();
566
- env.SetDoubleArrayRegion ((jdoubleArray) arr, i, 1 , &value);
604
+ doubles[i] = jsArr
605
+ ->Get (context, i)
606
+ .ToLocalChecked ()
607
+ ->NumberValue (context)
608
+ .ToChecked ();
567
609
}
610
+ env.SetDoubleArrayRegion ((jdoubleArray) arr, 0 , arrLength, doubles);
568
611
break ;
612
+ }
569
613
case ' L' :
570
614
strippedClassName = elementType.substr (1 , elementType.length () - 2 );
571
615
elementClass = env.FindClass (strippedClassName);
0 commit comments