@@ -1416,6 +1416,8 @@ bool CanConvertV8ToGValue(GValue *gvalue, Local<Value> value) {
14161416 } else if (G_VALUE_HOLDS_OBJECT (gvalue)) {
14171417 return ValueIsInstanceOfGType (value, G_VALUE_TYPE (gvalue));
14181418 } else if (G_VALUE_HOLDS_BOXED (gvalue)) {
1419+ if (G_VALUE_TYPE (gvalue) == G_TYPE_BYTE_ARRAY)
1420+ return value->IsUint8Array ();
14191421 return ValueIsInstanceOfGType (value, G_VALUE_TYPE (gvalue));
14201422 } else if (G_VALUE_HOLDS_PARAM (gvalue)) {
14211423 return value->IsObject ();
@@ -1488,6 +1490,19 @@ bool V8ToGValue(GValue *gvalue, Local<Value> value, bool mustCopy) {
14881490 }
14891491 g_value_set_object (gvalue, GObjectFromWrapper (value));
14901492 } else if (G_VALUE_HOLDS_BOXED (gvalue)) {
1493+ if (G_VALUE_TYPE (gvalue) == G_TYPE_BYTE_ARRAY) {
1494+ if (!value->IsUint8Array ()) {
1495+ Throw::CannotConvertGType (" GByteArray" , G_VALUE_TYPE (gvalue));
1496+ return false ;
1497+ }
1498+ auto array = value.As <v8::Uint8Array>();
1499+ auto garray = g_byte_array_sized_new (array->ByteLength ());
1500+ g_byte_array_set_size (garray, array->ByteLength ());
1501+ array->CopyContents (garray->data , garray->len );
1502+ g_value_take_boxed (gvalue, garray);
1503+ return true ;
1504+ }
1505+
14911506 if (!ValueIsInstanceOfGType (value, G_VALUE_TYPE (gvalue))) {
14921507 Throw::CannotConvertGType (" boxed" , G_VALUE_TYPE (gvalue));
14931508 return false ;
@@ -1555,6 +1570,11 @@ Local<Value> GValueToV8(const GValue *gvalue, bool mustCopy) {
15551570 return WrapperFromGObject (G_OBJECT (g_value_get_object (gvalue)));
15561571 } else if (G_VALUE_HOLDS_BOXED (gvalue)) {
15571572 GType gtype = G_VALUE_TYPE (gvalue);
1573+ if (gtype == G_TYPE_BYTE_ARRAY) {
1574+ auto garray = (GByteArray*) g_value_get_boxed (gvalue);
1575+ return Nan::CopyBuffer ((char *)garray->data , garray->len ).ToLocalChecked ();
1576+ }
1577+
15581578 GIBaseInfo *info = g_irepository_find_by_gtype (NULL , gtype);
15591579 if (info == NULL ) {
15601580 Throw::InvalidGType (gtype);
0 commit comments