Skip to content

Commit b5218c9

Browse files
committed
perf: update old args converter with array marshaling optimizations and use this converter again tempporarily
1 parent 84e7ddb commit b5218c9

File tree

2 files changed

+87
-36
lines changed

2 files changed

+87
-36
lines changed

test-app/runtime/src/main/cpp/CallbackHandlers.cpp

+16-9
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
#include "Util.h"
44
#include "V8GlobalHelpers.h"
55
#include "V8StringConstants.h"
6-
#include "./conversions/JSToJavaConverter.h"
6+
//#include "./conversions/JSToJavaConverter.h"
7+
#include "JsArgConverter.h"
78
#include "JsArgToArrayConverter.h"
89
#include "ArgConverter.h"
910
#include "v8-profiler.h"
@@ -102,7 +103,8 @@ bool CallbackHandlers::RegisterInstance(Isolate *isolate, const Local<Object> &j
102103
instance = env.NewObject(generatedJavaClass, mi.mid);
103104
} else {
104105
// resolve arguments before passing them on to the constructor
105-
JSToJavaConverter argConverter(isolate, argWrapper.args, mi.signature);
106+
// JSToJavaConverter argConverter(isolate, argWrapper.args, mi.signature);
107+
JsArgConverter argConverter(argWrapper.args, mi.signature);
106108
auto ctorArgs = argConverter.ToArgs();
107109

108110
instance = env.NewObjectA(generatedJavaClass, mi.mid, ctorArgs);
@@ -322,14 +324,19 @@ void CallbackHandlers::CallJavaMethod(const Local<Object> &caller, const string
322324
methodName.c_str());
323325
}
324326

325-
JSToJavaConverter argConverter = (entry != nullptr && entry->isExtensionFunction)
326-
? JSToJavaConverter(isolate, args, *sig, entry, caller)
327-
: JSToJavaConverter(isolate, args, *sig, entry);
327+
// JSToJavaConverter argConverter = (entry != nullptr && entry->isExtensionFunction)
328+
// ? JSToJavaConverter(isolate, args, *sig, entry, caller)
329+
// : JSToJavaConverter(isolate, args, *sig, entry);
328330

329-
// if (!argConverter->IsValid()) {
330-
// JSToJavaConverter::Error err = argConverter->GetError();
331-
// throw NativeScriptException(err.msg);
332-
// }
331+
JsArgConverter argConverter = (entry != nullptr && entry->isExtensionFunction)
332+
? JsArgConverter(caller, args, *sig, entry)
333+
: JsArgConverter(args, false, *sig, entry);
334+
335+
336+
if (!argConverter.IsValid()) {
337+
JsArgConverter::Error err = argConverter.GetError();
338+
throw NativeScriptException(err.msg);
339+
}
333340

334341
JniLocalRef callerJavaObject;
335342

test-app/runtime/src/main/cpp/JsArgConverter.cpp

+71-27
Original file line numberDiff line numberDiff line change
@@ -506,66 +506,110 @@ bool JsArgConverter::ConvertJavaScriptArray(const Local<Array>& jsArr, int index
506506

507507
JEnv env;
508508
switch (elementTypePrefix) {
509-
case 'Z':
509+
case 'Z': {
510510
arr = env.NewBooleanArray(arrLength);
511+
jboolean bools[arrLength];
511512
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);
514517
}
518+
env.SetBooleanArrayRegion((jbooleanArray) arr, 0, arrLength, bools);
515519
break;
516-
case 'B':
520+
}
521+
case 'B': {
517522
arr = env.NewByteArray(arrLength);
523+
jbyte bytes[arrLength];
518524
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();
521530
}
531+
env.SetByteArrayRegion((jbyteArray) arr, 0, arrLength, bytes);
522532
break;
523-
case 'C':
533+
}
534+
case 'C': {
524535
arr = env.NewCharArray(arrLength);
536+
jchar chars[arrLength];
525537
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;
530543
env.ReleaseStringUTFChars(s, singleChar);
531-
env.SetCharArrayRegion((jcharArray) arr, i, 1, &value);
532544
}
545+
env.SetCharArrayRegion((jcharArray) arr, 0, arrLength, chars);
533546
break;
534-
case 'S':
547+
}
548+
case 'S': {
535549
arr = env.NewShortArray(arrLength);
550+
jshort shorts[arrLength];
536551
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();
539557
}
558+
env.SetShortArrayRegion((jshortArray) arr, 0, arrLength, shorts);
540559
break;
541-
case 'I':
560+
}
561+
case 'I': {
542562
arr = env.NewIntArray(arrLength);
563+
jint ints[arrLength];
543564
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();
546570
}
571+
env.SetIntArrayRegion((jintArray) arr, 0, arrLength, ints);
547572
break;
548-
case 'J':
573+
}
574+
case 'J': {
549575
arr = env.NewLongArray(arrLength);
576+
jlong longs[arrLength];
550577
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();
553583
}
584+
env.SetLongArrayRegion((jlongArray) arr, 0, arrLength, longs);
554585
break;
555-
case 'F':
586+
}
587+
case 'F': {
556588
arr = env.NewFloatArray(arrLength);
589+
jfloat floats[arrLength];
557590
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();
560596
}
597+
env.SetFloatArrayRegion((jfloatArray) arr, 0, arrLength, floats);
561598
break;
562-
case 'D':
599+
}
600+
case 'D': {
563601
arr = env.NewDoubleArray(arrLength);
602+
jdouble doubles[arrLength];
564603
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();
567609
}
610+
env.SetDoubleArrayRegion((jdoubleArray) arr, 0, arrLength, doubles);
568611
break;
612+
}
569613
case 'L':
570614
strippedClassName = elementType.substr(1, elementType.length() - 2);
571615
elementClass = env.FindClass(strippedClassName);

0 commit comments

Comments
 (0)