Skip to content

Commit 5b42353

Browse files
committed
Merge branch 'wsw0108-typed-array'
2 parents 3d28fd0 + 3efa370 commit 5b42353

2 files changed

Lines changed: 64 additions & 1 deletion

File tree

src/utils.cpp

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -477,6 +477,14 @@ jvalueType javaGetArrayComponentType(JNIEnv *env, jobjectArray array) {
477477
return arrayComponentType;
478478
}
479479

480+
#if (NODE_VERSION_AT_LEAST(4, 0, 0))
481+
v8::Local<v8::ArrayBuffer> newArrayBuffer(void* elems, size_t length) {
482+
v8::Local<v8::ArrayBuffer> ab = v8::ArrayBuffer::New(v8::Isolate::GetCurrent(), length);
483+
memcpy(ab->GetContents().Data(), elems, length);
484+
return ab;
485+
}
486+
#endif
487+
480488
v8::Local<v8::String> javaCharToV8String(jchar c) {
481489
#if ((NODE_MAJOR_VERSION == 0) && (NODE_MINOR_VERSION <= 10))
482490
return v8::String::New(&c, 1);
@@ -499,76 +507,126 @@ v8::Local<v8::Value> javaArrayToV8(Java* java, JNIEnv* env, jobjectArray objArra
499507
//printf("array size: %d\n", arraySize);
500508

501509
v8::Local<v8::Array> result = Nan::New<v8::Array>(arraySize);
510+
// http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/types.html
502511
switch(arrayComponentType) {
503512
case TYPE_CHAR:
504513
{
505514
jchar* elems = env->GetCharArrayElements((jcharArray)objArray, 0);
515+
#if (NODE_VERSION_AT_LEAST(4, 0, 0))
516+
size_t byteLength = arraySize * 2;
517+
v8::Local<v8::ArrayBuffer> ab = newArrayBuffer(elems, byteLength);
518+
env->ReleaseCharArrayElements((jcharArray)objArray, elems, 0);
519+
return v8::Uint16Array::New(ab, 0, arraySize);
520+
#else
506521
jchar str;
507522
for(jsize i=0; i<arraySize; i++) {
508523
str = elems[i];
509524
result->Set(i, javaCharToV8String(str));
510525
}
511526
env->ReleaseCharArrayElements((jcharArray)objArray, elems, 0);
527+
#endif
512528
}
513529
break;
514530

515531
case TYPE_INT:
516532
{
517533
jint* elems = env->GetIntArrayElements((jintArray)objArray, 0);
534+
#if (NODE_VERSION_AT_LEAST(4, 0, 0))
535+
size_t byteLength = arraySize * 4;
536+
v8::Local<v8::ArrayBuffer> ab = newArrayBuffer(elems, byteLength);
537+
env->ReleaseIntArrayElements((jintArray)objArray, elems, 0);
538+
return v8::Int32Array::New(ab, 0, arraySize);
539+
#else
518540
for(jsize i=0; i<arraySize; i++) {
519541
result->Set(i, Nan::New<v8::Integer>(elems[i]));
520542
}
521543
env->ReleaseIntArrayElements((jintArray)objArray, elems, 0);
544+
#endif
522545
}
523546
break;
524547

525548
case TYPE_BYTE:
526549
{
527550
jbyte* elems = env->GetByteArrayElements((jbyteArray)objArray, 0);
551+
#if (NODE_VERSION_AT_LEAST(4, 0, 0))
552+
size_t byteLength = arraySize;
553+
v8::Local<v8::ArrayBuffer> ab = newArrayBuffer(elems, byteLength);
554+
env->ReleaseByteArrayElements((jbyteArray)objArray, elems, 0);
555+
return v8::Int8Array::New(ab, 0, arraySize);
556+
#else
528557
for(jsize i=0; i<arraySize; i++) {
529558
result->Set(i, Nan::New<v8::Number>(elems[i]));
530559
}
531560
env->ReleaseByteArrayElements((jbyteArray)objArray, elems, 0);
561+
#endif
532562
}
533563
break;
534564

535565
case TYPE_BOOLEAN:
536566
{
537567
jboolean* elems = env->GetBooleanArrayElements((jbooleanArray)objArray, 0);
568+
#if (NODE_VERSION_AT_LEAST(4, 0, 0))
569+
size_t byteLength = arraySize;
570+
v8::Local<v8::ArrayBuffer> ab = newArrayBuffer(elems, byteLength);
571+
env->ReleaseBooleanArrayElements((jbooleanArray)objArray, elems, 0);
572+
return v8::Uint8Array::New(ab, 0, arraySize);
573+
#else
538574
for(jsize i=0; i<arraySize; i++) {
539575
result->Set(i, Nan::New<v8::Boolean>(elems[i]));
540576
}
541577
env->ReleaseBooleanArrayElements((jbooleanArray)objArray, elems, 0);
578+
#endif
542579
}
543580
break;
544581

545582
case TYPE_SHORT:
546583
{
547584
jshort* elems = env->GetShortArrayElements((jshortArray)objArray, 0);
585+
#if (NODE_VERSION_AT_LEAST(4, 0, 0))
586+
size_t byteLength = arraySize * 2;
587+
v8::Local<v8::ArrayBuffer> ab = newArrayBuffer(elems, byteLength);
588+
env->ReleaseShortArrayElements((jshortArray)objArray, elems, 0);
589+
return v8::Int16Array::New(ab, 0, arraySize);
590+
#else
548591
for(jsize i=0; i<arraySize; i++) {
549592
result->Set(i, Nan::New<v8::Number>(elems[i]));
550593
}
551594
env->ReleaseShortArrayElements((jshortArray)objArray, elems, 0);
595+
#endif
552596
}
553597
break;
554598

555599
case TYPE_DOUBLE:
556600
{
557601
jdouble* elems = env->GetDoubleArrayElements((jdoubleArray)objArray, 0);
602+
#if (NODE_VERSION_AT_LEAST(4, 0, 0))
603+
size_t byteLength = arraySize * 8;
604+
v8::Local<v8::ArrayBuffer> ab = newArrayBuffer(elems, byteLength);
605+
env->ReleaseDoubleArrayElements((jdoubleArray)objArray, elems, 0);
606+
return v8::Float64Array::New(ab, 0, arraySize);
607+
#else
558608
for(jsize i=0; i<arraySize; i++) {
559609
result->Set(i, Nan::New<v8::Number>(elems[i]));
560610
}
561611
env->ReleaseDoubleArrayElements((jdoubleArray)objArray, elems, 0);
612+
#endif
562613
}
563614
break;
564615

565616
case TYPE_FLOAT:
566617
{
567618
jfloat* elems = env->GetFloatArrayElements((jfloatArray)objArray, 0);
619+
#if (NODE_VERSION_AT_LEAST(4, 0, 0))
620+
size_t byteLength = arraySize * 4;
621+
v8::Local<v8::ArrayBuffer> ab = newArrayBuffer(elems, byteLength);
622+
env->ReleaseFloatArrayElements((jfloatArray)objArray, elems, 0);
623+
return v8::Float32Array::New(ab, 0, arraySize);
624+
#else
568625
for(jsize i=0; i<arraySize; i++) {
569626
result->Set(i, Nan::New<v8::Number>(elems[i]));
570627
}
571628
env->ReleaseFloatArrayElements((jfloatArray)objArray, elems, 0);
629+
#endif
572630
}
573631
break;
574632

test/utils-types-test.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,13 @@ exports['Utils - Types'] = nodeunit.testCase({
5757
var arr2 = list.toArraySync();
5858
test.equal(arr2.length, 1);
5959
test.equal(arr2[0].length, 9);
60+
var isTypedArrayReturn = !(typeof arr2[0][0] === 'string');
6061
for(var i=0; i<originalArray.length; i++) {
61-
test.equal(arr2[0][i], originalArray[i]);
62+
if (isTypedArrayReturn) {
63+
test.equal(arr2[0][i], originalArray[i].charCodeAt(0));
64+
} else {
65+
test.equal(arr2[0][i], originalArray[i]);
66+
}
6267
}
6368
test.done();
6469
}

0 commit comments

Comments
 (0)