@@ -1412,6 +1412,8 @@ bool CanConvertV8ToGValue(GValue *gvalue, Local<Value> value) {
14121412 } else if (G_VALUE_HOLDS_OBJECT (gvalue)) {
14131413 return ValueIsInstanceOfGType (value, G_VALUE_TYPE (gvalue));
14141414 } else if (G_VALUE_HOLDS_BOXED (gvalue)) {
1415+ if (G_VALUE_TYPE (gvalue) == G_TYPE_BYTE_ARRAY)
1416+ return value->IsUint8Array ();
14151417 return ValueIsInstanceOfGType (value, G_VALUE_TYPE (gvalue));
14161418 } else if (G_VALUE_HOLDS_PARAM (gvalue)) {
14171419 return value->IsObject ();
@@ -1484,6 +1486,19 @@ bool V8ToGValue(GValue *gvalue, Local<Value> value, bool mustCopy) {
14841486 }
14851487 g_value_set_object (gvalue, GObjectFromWrapper (value));
14861488 } else if (G_VALUE_HOLDS_BOXED (gvalue)) {
1489+ if (G_VALUE_TYPE (gvalue) == G_TYPE_BYTE_ARRAY) {
1490+ if (!value->IsUint8Array ()) {
1491+ Throw::CannotConvertGType (" GByteArray" , G_VALUE_TYPE (gvalue));
1492+ return false ;
1493+ }
1494+ auto array = value.As <v8::Uint8Array>();
1495+ auto garray = g_byte_array_sized_new (array->ByteLength ());
1496+ g_byte_array_set_size (garray, array->ByteLength ());
1497+ array->CopyContents (garray->data , garray->len );
1498+ g_value_take_boxed (gvalue, garray);
1499+ return true ;
1500+ }
1501+
14871502 if (!ValueIsInstanceOfGType (value, G_VALUE_TYPE (gvalue))) {
14881503 Throw::CannotConvertGType (" boxed" , G_VALUE_TYPE (gvalue));
14891504 return false ;
@@ -1551,6 +1566,11 @@ Local<Value> GValueToV8(const GValue *gvalue, bool mustCopy) {
15511566 return WrapperFromGObject (G_OBJECT (g_value_get_object (gvalue)));
15521567 } else if (G_VALUE_HOLDS_BOXED (gvalue)) {
15531568 GType gtype = G_VALUE_TYPE (gvalue);
1569+ if (gtype == G_TYPE_BYTE_ARRAY) {
1570+ auto garray = (GByteArray*) g_value_get_boxed (gvalue);
1571+ return Nan::CopyBuffer ((char *)garray->data , garray->len ).ToLocalChecked ();
1572+ }
1573+
15541574 GIBaseInfo *info = g_irepository_find_by_gtype (NULL , gtype);
15551575 if (info == NULL ) {
15561576 Throw::InvalidGType (gtype);
0 commit comments