Skip to content

Commit 84e7ddb

Browse files
committed
perf: refactor arrays marshaling
1 parent f23c1bb commit 84e7ddb

File tree

1 file changed

+67
-30
lines changed

1 file changed

+67
-30
lines changed

test-app/runtime/src/main/cpp/conversions/arrays/JSToJavaArraysConverter.cpp

+67-30
Original file line numberDiff line numberDiff line change
@@ -43,73 +43,110 @@ bool tns::ConvertJavaScriptArray(
4343

4444
JEnv env;
4545
switch (elementTypePrefix) {
46-
case 'Z':
46+
case 'Z': {
4747
arr = env.NewBooleanArray(arrLength);
48+
jboolean bools[arrLength];
4849
for (jsize i = 0; i < arrLength; i++) {
49-
jboolean value = jsArr->Get(context, i).ToLocalChecked()->BooleanValue(isolate);
50-
env.SetBooleanArrayRegion((jbooleanArray) arr, i, 1, &value);
50+
bools[i] = jsArr
51+
->Get(context, i)
52+
.ToLocalChecked()
53+
->BooleanValue(isolate);
5154
}
55+
env.SetBooleanArrayRegion((jbooleanArray) arr, 0, arrLength, bools);
5256
break;
53-
case 'B':
57+
}
58+
case 'B': {
5459
arr = env.NewByteArray(arrLength);
60+
jbyte bytes[arrLength];
5561
for (jsize i = 0; i < arrLength; i++) {
56-
jbyte value = jsArr->Get(context, i).ToLocalChecked()->Int32Value(
57-
context).ToChecked();
58-
env.SetByteArrayRegion((jbyteArray) arr, i, 1, &value);
62+
bytes[i] = jsArr
63+
->Get(context, i)
64+
.ToLocalChecked()
65+
->Int32Value(context)
66+
.ToChecked();
5967
}
68+
env.SetByteArrayRegion((jbyteArray) arr, 0, arrLength, bytes);
6069
break;
61-
case 'C':
70+
}
71+
case 'C': {
6272
arr = env.NewCharArray(arrLength);
73+
jchar chars[arrLength];
6374
for (jsize i = 0; i < arrLength; i++) {
6475
String::Utf8Value utf8(isolate, jsArr->Get(context, i).ToLocalChecked()->ToString(
6576
context).ToLocalChecked());
6677
JniLocalRef s(env.NewString((jchar *) *utf8, 1));
6778
const char *singleChar = env.GetStringUTFChars(s, nullptr);
68-
jchar value = *singleChar;
79+
chars[i] = *singleChar;
6980
env.ReleaseStringUTFChars(s, singleChar);
70-
env.SetCharArrayRegion((jcharArray) arr, i, 1, &value);
7181
}
82+
env.SetCharArrayRegion((jcharArray) arr, 0, arrLength, chars);
7283
break;
73-
case 'S':
84+
}
85+
case 'S': {
7486
arr = env.NewShortArray(arrLength);
87+
jshort shorts[arrLength];
7588
for (jsize i = 0; i < arrLength; i++) {
76-
jshort value = jsArr->Get(context, i).ToLocalChecked()->Int32Value(
77-
context).ToChecked();
78-
env.SetShortArrayRegion((jshortArray) arr, i, 1, &value);
89+
shorts[i] = jsArr
90+
->Get(context, i)
91+
.ToLocalChecked()
92+
->Int32Value(context)
93+
.ToChecked();
7994
}
95+
env.SetShortArrayRegion((jshortArray) arr, 0, arrLength, shorts);
8096
break;
81-
case 'I':
97+
}
98+
case 'I': {
8299
arr = env.NewIntArray(arrLength);
100+
jint ints[arrLength];
83101
for (jsize i = 0; i < arrLength; i++) {
84-
jint value = jsArr->Get(context, i).ToLocalChecked()->Int32Value(
85-
context).ToChecked();
86-
env.SetIntArrayRegion((jintArray) arr, i, 1, &value);
102+
ints[i] = jsArr
103+
->Get(context, i)
104+
.ToLocalChecked()
105+
->Int32Value(context)
106+
.ToChecked();
87107
}
108+
env.SetIntArrayRegion((jintArray) arr, 0, arrLength, ints);
88109
break;
89-
case 'J':
110+
}
111+
case 'J': {
90112
arr = env.NewLongArray(arrLength);
113+
jlong longs[arrLength];
91114
for (jsize i = 0; i < arrLength; i++) {
92-
jlong value = jsArr->Get(context, i).ToLocalChecked()->NumberValue(
93-
context).ToChecked();
94-
env.SetLongArrayRegion((jlongArray) arr, i, 1, &value);
115+
longs[i] = jsArr
116+
->Get(context, i)
117+
.ToLocalChecked()
118+
->NumberValue(context)
119+
.ToChecked();
95120
}
121+
env.SetLongArrayRegion((jlongArray) arr, 0, arrLength, longs);
96122
break;
97-
case 'F':
123+
}
124+
case 'F': {
98125
arr = env.NewFloatArray(arrLength);
126+
jfloat floats[arrLength];
99127
for (jsize i = 0; i < arrLength; i++) {
100-
jfloat value = jsArr->Get(context, i).ToLocalChecked()->NumberValue(
101-
context).ToChecked();
102-
env.SetFloatArrayRegion((jfloatArray) arr, i, 1, &value);
128+
floats[i] = jsArr
129+
->Get(context, i)
130+
.ToLocalChecked()
131+
->NumberValue(context)
132+
.ToChecked();
103133
}
134+
env.SetFloatArrayRegion((jfloatArray) arr, 0, arrLength, floats);
104135
break;
105-
case 'D':
136+
}
137+
case 'D': {
106138
arr = env.NewDoubleArray(arrLength);
139+
jdouble doubles[arrLength];
107140
for (jsize i = 0; i < arrLength; i++) {
108-
jdouble value = jsArr->Get(context, i).ToLocalChecked()->NumberValue(
109-
context).ToChecked();
110-
env.SetDoubleArrayRegion((jdoubleArray) arr, i, 1, &value);
141+
doubles[i] = jsArr
142+
->Get(context, i)
143+
.ToLocalChecked()
144+
->NumberValue(context)
145+
.ToChecked();
111146
}
147+
env.SetDoubleArrayRegion((jdoubleArray) arr, 0, arrLength, doubles);
112148
break;
149+
}
113150
case 'L':
114151
strippedClassName = elementType.substr(1, elementType.length() - 2);
115152
elementClass = env.FindClass(strippedClassName);

0 commit comments

Comments
 (0)