node-gtk 0.8.1 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -3
- package/binding.gyp +36 -17
- package/lib/binding/node-v93-linux-x64/node_gtk.node +0 -0
- package/lib/bootstrap.js +0 -21
- package/package.json +9 -9
- package/scripts/ci.sh +0 -0
- package/src/boxed.cc +3 -3
- package/src/callback.cc +8 -9
- package/src/closure.cc +5 -5
- package/src/closure.h +2 -2
- package/src/debug.cc +2 -2
- package/src/function.cc +225 -333
- package/src/function.h +1 -2
- package/src/gi.cc +17 -35
- package/src/gobject.cc +9 -5
- package/src/loop.cc +9 -0
- package/src/modules/cairo/context.cc +102 -106
- package/src/modules/cairo/generator.js +1 -5
- package/src/type.cc +5 -5
- package/src/value.cc +114 -35
- package/src/value.h +1 -1
- package/CHANGELOG.md +0 -25
package/src/value.cc
CHANGED
|
@@ -68,8 +68,8 @@ Local<Value> GIArgumentToV8(GITypeInfo *type_info, GIArgument *arg, long length,
|
|
|
68
68
|
case GI_TYPE_TAG_UINT64:
|
|
69
69
|
return New<Number> (arg->v_uint64);
|
|
70
70
|
|
|
71
|
-
case GI_TYPE_TAG_GTYPE: /* c++:
|
|
72
|
-
return v8::BigInt::NewFromUnsigned(Isolate::GetCurrent(), arg->
|
|
71
|
+
case GI_TYPE_TAG_GTYPE: /* c++: gsize */
|
|
72
|
+
return v8::BigInt::NewFromUnsigned(Isolate::GetCurrent(), arg->v_size);
|
|
73
73
|
|
|
74
74
|
case GI_TYPE_TAG_UNICHAR:
|
|
75
75
|
{
|
|
@@ -238,6 +238,55 @@ Local<Value> GErrorToV8 (GITypeInfo *type_info, GError *err) {
|
|
|
238
238
|
return obj;
|
|
239
239
|
}
|
|
240
240
|
|
|
241
|
+
template<typename T>
|
|
242
|
+
static bool isZero(void* value) {
|
|
243
|
+
return *(reinterpret_cast<T*>(value)) == 0;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
static bool isZero(GIArgument &value, GITypeInfo *type_info) {
|
|
247
|
+
GITypeTag type_tag = g_type_info_get_tag (type_info);
|
|
248
|
+
|
|
249
|
+
switch (type_tag) {
|
|
250
|
+
case GI_TYPE_TAG_BOOLEAN:
|
|
251
|
+
ERROR("Boolean zero-terminated array not supported");
|
|
252
|
+
return false;
|
|
253
|
+
case GI_TYPE_TAG_INT8:
|
|
254
|
+
return isZero<gint8>(&value);
|
|
255
|
+
case GI_TYPE_TAG_UINT8:
|
|
256
|
+
return isZero<guint8>(&value);
|
|
257
|
+
case GI_TYPE_TAG_INT16:
|
|
258
|
+
return isZero<gint16>(&value);
|
|
259
|
+
case GI_TYPE_TAG_UINT16:
|
|
260
|
+
return isZero<guint16>(&value);
|
|
261
|
+
case GI_TYPE_TAG_INT32:
|
|
262
|
+
return isZero<gint32>(&value);
|
|
263
|
+
case GI_TYPE_TAG_UINT32:
|
|
264
|
+
return isZero<guint32>(&value);
|
|
265
|
+
case GI_TYPE_TAG_INT64:
|
|
266
|
+
return isZero<gint64>(&value);
|
|
267
|
+
case GI_TYPE_TAG_UINT64:
|
|
268
|
+
return isZero<guint64>(&value);
|
|
269
|
+
case GI_TYPE_TAG_FLOAT:
|
|
270
|
+
return isZero<float>(&value);
|
|
271
|
+
case GI_TYPE_TAG_DOUBLE:
|
|
272
|
+
return isZero<double>(&value);
|
|
273
|
+
case GI_TYPE_TAG_UNICHAR:
|
|
274
|
+
return isZero<gunichar>(&value);
|
|
275
|
+
|
|
276
|
+
case GI_TYPE_TAG_GTYPE:
|
|
277
|
+
case GI_TYPE_TAG_INTERFACE:
|
|
278
|
+
case GI_TYPE_TAG_ARRAY:
|
|
279
|
+
case GI_TYPE_TAG_VOID:
|
|
280
|
+
case GI_TYPE_TAG_UTF8:
|
|
281
|
+
case GI_TYPE_TAG_FILENAME:
|
|
282
|
+
case GI_TYPE_TAG_GLIST:
|
|
283
|
+
case GI_TYPE_TAG_GSLIST:
|
|
284
|
+
case GI_TYPE_TAG_GHASH:
|
|
285
|
+
case GI_TYPE_TAG_ERROR:
|
|
286
|
+
return isZero<gpointer>(&value);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
|
|
241
290
|
Local<Value> ArrayToV8 (GITypeInfo *type_info, void* data, long length) {
|
|
242
291
|
|
|
243
292
|
auto array = New<Array>();
|
|
@@ -253,20 +302,15 @@ Local<Value> ArrayToV8 (GITypeInfo *type_info, void* data, long length) {
|
|
|
253
302
|
switch (array_type) {
|
|
254
303
|
case GI_ARRAY_TYPE_C:
|
|
255
304
|
{
|
|
256
|
-
if (length == -1) {
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
if (G_UNLIKELY (length == -1)) {
|
|
263
|
-
g_critical ("Unable to determine array length for %p", data);
|
|
264
|
-
length = 0;
|
|
265
|
-
break;
|
|
266
|
-
}
|
|
305
|
+
if (length == -1 && !g_type_info_is_zero_terminated (type_info)) {
|
|
306
|
+
length = g_type_info_get_array_fixed_size (type_info);
|
|
307
|
+
if (G_UNLIKELY (length == -1)) {
|
|
308
|
+
g_critical ("Unable to determine array length for %p", data);
|
|
309
|
+
length = 0;
|
|
310
|
+
break;
|
|
267
311
|
}
|
|
268
312
|
}
|
|
269
|
-
|
|
313
|
+
// length remains -1 for zero-terminated array.
|
|
270
314
|
break;
|
|
271
315
|
}
|
|
272
316
|
case GI_ARRAY_TYPE_ARRAY:
|
|
@@ -301,9 +345,16 @@ Local<Value> ArrayToV8 (GITypeInfo *type_info, void* data, long length) {
|
|
|
301
345
|
|
|
302
346
|
GIArgument value;
|
|
303
347
|
|
|
304
|
-
for (int i = 0;
|
|
305
|
-
|
|
348
|
+
for (int i = 0; ; i++) {
|
|
349
|
+
if (length != -1 && i >= length)
|
|
350
|
+
break;
|
|
351
|
+
|
|
352
|
+
void** pointer = (void**)((size_t)data + i * item_size);
|
|
306
353
|
memcpy(&value, pointer, item_size);
|
|
354
|
+
|
|
355
|
+
if (length == -1 && isZero(value, item_type_info))
|
|
356
|
+
break;
|
|
357
|
+
|
|
307
358
|
Nan::Set(array, i, GIArgumentToV8(item_type_info, &value));
|
|
308
359
|
}
|
|
309
360
|
|
|
@@ -407,7 +458,7 @@ static void *V8ArrayToCArray(GITypeInfo *type_info, Local<Value> value) {
|
|
|
407
458
|
GITypeInfo* element_info = g_type_info_get_param_type (type_info, 0);
|
|
408
459
|
gsize element_size = GetTypeSize(element_info);
|
|
409
460
|
|
|
410
|
-
void *result =
|
|
461
|
+
void *result = g_malloc0(element_size * (length + (isZeroTerminated ? 1 : 0)));
|
|
411
462
|
|
|
412
463
|
for (int i = 0; i < length; i++) {
|
|
413
464
|
auto value = Nan::Get(array, i).ToLocalChecked();
|
|
@@ -415,7 +466,7 @@ static void *V8ArrayToCArray(GITypeInfo *type_info, Local<Value> value) {
|
|
|
415
466
|
GIArgument arg;
|
|
416
467
|
|
|
417
468
|
if (V8ToGIArgument(element_info, &arg, value, true)) {
|
|
418
|
-
void* pointer = (void*)((
|
|
469
|
+
void* pointer = (void*)((size_t)result + i * element_size);
|
|
419
470
|
memcpy(pointer, &arg, element_size);
|
|
420
471
|
} else {
|
|
421
472
|
WARN("couldnt convert value: %s", *Nan::Utf8String(TO_STRING (value)));
|
|
@@ -423,7 +474,10 @@ static void *V8ArrayToCArray(GITypeInfo *type_info, Local<Value> value) {
|
|
|
423
474
|
}
|
|
424
475
|
|
|
425
476
|
if (isZeroTerminated) {
|
|
426
|
-
|
|
477
|
+
// TODO:
|
|
478
|
+
// Since g_malloc0 above already zeros the memory
|
|
479
|
+
// it's better to assert the last element is zero
|
|
480
|
+
void* pointer = (void*)((size_t)result + length * element_size);
|
|
427
481
|
memset(pointer, 0, element_size);
|
|
428
482
|
}
|
|
429
483
|
|
|
@@ -439,12 +493,15 @@ static void *V8TypedArrayToCArray(GITypeInfo *type_info, Local<Value> value) {
|
|
|
439
493
|
GITypeInfo* element_info = g_type_info_get_param_type (type_info, 0);
|
|
440
494
|
gsize element_size = GetTypeSize(element_info);
|
|
441
495
|
|
|
442
|
-
void *result =
|
|
496
|
+
void *result = g_malloc0(element_size * (length + (isZeroTerminated ? 1 : 0)));
|
|
443
497
|
|
|
444
498
|
array->CopyContents(result, length);
|
|
445
499
|
|
|
446
500
|
if (isZeroTerminated) {
|
|
447
|
-
|
|
501
|
+
// TODO:
|
|
502
|
+
// Since g_malloc0 above already zeros the memory
|
|
503
|
+
// it's better to assert the last element is zero
|
|
504
|
+
void* pointer = (void*)((size_t)result + length * element_size);
|
|
448
505
|
memset(pointer, 0, element_size);
|
|
449
506
|
}
|
|
450
507
|
|
|
@@ -597,14 +654,14 @@ gpointer V8ToGHash (GITypeInfo *type_info, Local<Value> value) {
|
|
|
597
654
|
if (!V8ToGIArgument(key_type_info, &key_arg, key, false)) {
|
|
598
655
|
char* message = g_strdup_printf("Couldn't convert key '%s'", *Nan::Utf8String(key));
|
|
599
656
|
Nan::ThrowError(message);
|
|
600
|
-
|
|
657
|
+
g_free(message);
|
|
601
658
|
goto item_error;
|
|
602
659
|
}
|
|
603
660
|
|
|
604
661
|
if (!V8ToGIArgument(value_type_info, &value_arg, value, false)) {
|
|
605
662
|
char* message = g_strdup_printf("Couldn't convert value for key '%s'", *Nan::Utf8String(key));
|
|
606
663
|
Nan::ThrowError(message);
|
|
607
|
-
|
|
664
|
+
g_free(message);
|
|
608
665
|
goto item_error;
|
|
609
666
|
}
|
|
610
667
|
|
|
@@ -628,6 +685,8 @@ item_error:
|
|
|
628
685
|
bool V8ToGIArgument(GIBaseInfo *gi_info, GIArgument *arg, Local<Value> value) {
|
|
629
686
|
GIInfoType type = g_base_info_get_type (gi_info);
|
|
630
687
|
|
|
688
|
+
memset(arg, 0, sizeof(GIArgument));
|
|
689
|
+
|
|
631
690
|
switch (type) {
|
|
632
691
|
case GI_INFO_TYPE_BOXED:
|
|
633
692
|
case GI_INFO_TYPE_STRUCT:
|
|
@@ -665,6 +724,8 @@ bool V8ToGIArgument(GIBaseInfo *gi_info, GIArgument *arg, Local<Value> value) {
|
|
|
665
724
|
bool V8ToGIArgument(GITypeInfo *type_info, GIArgument *arg, Local<Value> value, bool may_be_null) {
|
|
666
725
|
GITypeTag type_tag = g_type_info_get_tag (type_info);
|
|
667
726
|
|
|
727
|
+
memset(arg, 0, sizeof(GIArgument));
|
|
728
|
+
|
|
668
729
|
if (value->IsUndefined () || value->IsNull ()) {
|
|
669
730
|
arg->v_pointer = NULL;
|
|
670
731
|
|
|
@@ -697,7 +758,10 @@ bool V8ToGIArgument(GITypeInfo *type_info, GIArgument *arg, Local<Value> value,
|
|
|
697
758
|
arg->v_int = Nan::To<int32_t> (value).ToChecked();
|
|
698
759
|
break;
|
|
699
760
|
case GI_TYPE_TAG_INT64:
|
|
700
|
-
|
|
761
|
+
if (value->IsBigInt())
|
|
762
|
+
arg->v_int64 = value.As<v8::BigInt>()->Int64Value();
|
|
763
|
+
else
|
|
764
|
+
arg->v_int64 = Nan::To<int64_t> (value).ToChecked();
|
|
701
765
|
break;
|
|
702
766
|
case GI_TYPE_TAG_UINT8:
|
|
703
767
|
arg->v_uint8 = Nan::To<uint32_t> (value).ToChecked();
|
|
@@ -709,7 +773,10 @@ bool V8ToGIArgument(GITypeInfo *type_info, GIArgument *arg, Local<Value> value,
|
|
|
709
773
|
arg->v_uint = Nan::To<uint32_t> (value).ToChecked();
|
|
710
774
|
break;
|
|
711
775
|
case GI_TYPE_TAG_UINT64:
|
|
712
|
-
|
|
776
|
+
if (value->IsBigInt())
|
|
777
|
+
arg->v_uint64 = value.As<v8::BigInt>()->Uint64Value();
|
|
778
|
+
else
|
|
779
|
+
arg->v_uint64 = Nan::To<int64_t> (value).ToChecked();
|
|
713
780
|
break;
|
|
714
781
|
case GI_TYPE_TAG_FLOAT:
|
|
715
782
|
arg->v_float = Nan::To<double> (value).ToChecked();
|
|
@@ -719,9 +786,9 @@ bool V8ToGIArgument(GITypeInfo *type_info, GIArgument *arg, Local<Value> value,
|
|
|
719
786
|
break;
|
|
720
787
|
case GI_TYPE_TAG_GTYPE:
|
|
721
788
|
if (value->IsBigInt())
|
|
722
|
-
arg->
|
|
789
|
+
arg->v_size = value.As<v8::BigInt>()->Uint64Value();
|
|
723
790
|
else
|
|
724
|
-
arg->
|
|
791
|
+
arg->v_size = Nan::To<int64_t> (value).ToChecked();
|
|
725
792
|
break;
|
|
726
793
|
|
|
727
794
|
case GI_TYPE_TAG_UTF8:
|
|
@@ -810,6 +877,8 @@ bool V8ToOutGIArgument(GITypeInfo *type_info, GIArgument *arg, Local<Value> valu
|
|
|
810
877
|
*/
|
|
811
878
|
GITypeTag type_tag = g_type_info_get_tag (type_info);
|
|
812
879
|
|
|
880
|
+
memset(arg, 0, sizeof(GIArgument));
|
|
881
|
+
|
|
813
882
|
if (value->IsUndefined () || value->IsNull ()) {
|
|
814
883
|
arg->v_pointer = NULL;
|
|
815
884
|
|
|
@@ -835,7 +904,10 @@ bool V8ToOutGIArgument(GITypeInfo *type_info, GIArgument *arg, Local<Value> valu
|
|
|
835
904
|
*(gint*)arg->v_pointer = Nan::To<int32_t> (value).ToChecked();
|
|
836
905
|
break;
|
|
837
906
|
case GI_TYPE_TAG_INT64:
|
|
838
|
-
|
|
907
|
+
if (value->IsBigInt())
|
|
908
|
+
*(gint64*)arg->v_pointer = value.As<v8::BigInt>()->Int64Value();
|
|
909
|
+
else
|
|
910
|
+
*(gint64*)arg->v_pointer = Nan::To<int64_t> (value).ToChecked();
|
|
839
911
|
break;
|
|
840
912
|
case GI_TYPE_TAG_UINT8:
|
|
841
913
|
*(guint8*)arg->v_pointer = Nan::To<uint32_t> (value).ToChecked();
|
|
@@ -847,7 +919,10 @@ bool V8ToOutGIArgument(GITypeInfo *type_info, GIArgument *arg, Local<Value> valu
|
|
|
847
919
|
*(guint*)arg->v_pointer = Nan::To<uint32_t> (value).ToChecked();
|
|
848
920
|
break;
|
|
849
921
|
case GI_TYPE_TAG_UINT64:
|
|
850
|
-
|
|
922
|
+
if (value->IsBigInt())
|
|
923
|
+
*(guint64*)arg->v_pointer = value.As<v8::BigInt>()->Uint64Value();
|
|
924
|
+
else
|
|
925
|
+
*(guint64*)arg->v_pointer = Nan::To<int64_t> (value).ToChecked();
|
|
851
926
|
break;
|
|
852
927
|
case GI_TYPE_TAG_FLOAT:
|
|
853
928
|
*(gfloat*)arg->v_pointer = Nan::To<double> (value).ToChecked();
|
|
@@ -857,9 +932,9 @@ bool V8ToOutGIArgument(GITypeInfo *type_info, GIArgument *arg, Local<Value> valu
|
|
|
857
932
|
break;
|
|
858
933
|
case GI_TYPE_TAG_GTYPE:
|
|
859
934
|
if (value->IsBigInt())
|
|
860
|
-
*(
|
|
935
|
+
*(gsize*)arg->v_pointer = value.As<v8::BigInt>()->Uint64Value();
|
|
861
936
|
else
|
|
862
|
-
*(
|
|
937
|
+
*(gsize*)arg->v_pointer = Nan::To<int64_t> (value).ToChecked();
|
|
863
938
|
break;
|
|
864
939
|
|
|
865
940
|
case GI_TYPE_TAG_UTF8:
|
|
@@ -913,15 +988,15 @@ bool CanConvertV8ToGIArgument(GITypeInfo *type_info, Local<Value> value, bool ma
|
|
|
913
988
|
case GI_TYPE_TAG_INT8:
|
|
914
989
|
case GI_TYPE_TAG_INT16:
|
|
915
990
|
case GI_TYPE_TAG_INT32:
|
|
916
|
-
case GI_TYPE_TAG_INT64:
|
|
917
991
|
case GI_TYPE_TAG_UINT8:
|
|
918
992
|
case GI_TYPE_TAG_UINT16:
|
|
919
993
|
case GI_TYPE_TAG_UINT32:
|
|
920
|
-
case GI_TYPE_TAG_UINT64:
|
|
921
994
|
case GI_TYPE_TAG_FLOAT:
|
|
922
995
|
case GI_TYPE_TAG_DOUBLE:
|
|
923
996
|
return value->IsNumber ();
|
|
924
997
|
|
|
998
|
+
case GI_TYPE_TAG_INT64:
|
|
999
|
+
case GI_TYPE_TAG_UINT64:
|
|
925
1000
|
case GI_TYPE_TAG_GTYPE:
|
|
926
1001
|
return value->IsNumber () || value->IsBigInt ();
|
|
927
1002
|
|
|
@@ -1251,7 +1326,7 @@ void FreeGIArgumentArray(GITypeInfo *type_info, GIArgument *arg, GITransfer tran
|
|
|
1251
1326
|
|
|
1252
1327
|
for (int i = 0; i < length; i++) {
|
|
1253
1328
|
GIArgument item;
|
|
1254
|
-
memcpy (&item, (void*)((
|
|
1329
|
+
memcpy (&item, (void*)((size_t)data + element_size * i), sizeof (GIArgument));
|
|
1255
1330
|
FreeGIArgument (element_info, &item, item_transfer, direction);
|
|
1256
1331
|
}
|
|
1257
1332
|
|
|
@@ -1270,7 +1345,7 @@ void FreeGIArgumentArray(GITypeInfo *type_info, GIArgument *arg, GITransfer tran
|
|
|
1270
1345
|
switch (array_type) {
|
|
1271
1346
|
case GI_ARRAY_TYPE_C:
|
|
1272
1347
|
{
|
|
1273
|
-
|
|
1348
|
+
g_free (data);
|
|
1274
1349
|
break;
|
|
1275
1350
|
}
|
|
1276
1351
|
case GI_ARRAY_TYPE_ARRAY:
|
|
@@ -1311,6 +1386,10 @@ bool CanConvertV8ToGValue(GValue *gvalue, Local<Value> value) {
|
|
|
1311
1386
|
return value->IsNumber();
|
|
1312
1387
|
} else if (G_VALUE_HOLDS_ULONG (gvalue)) {
|
|
1313
1388
|
return value->IsNumber();
|
|
1389
|
+
} else if (G_VALUE_HOLDS_INT64 (gvalue)) {
|
|
1390
|
+
return value->IsNumber();
|
|
1391
|
+
} else if (G_VALUE_HOLDS_UINT64 (gvalue)) {
|
|
1392
|
+
return value->IsNumber();
|
|
1314
1393
|
} else if (G_VALUE_HOLDS_FLOAT (gvalue)) {
|
|
1315
1394
|
return value->IsNumber();
|
|
1316
1395
|
} else if (G_VALUE_HOLDS_DOUBLE (gvalue)) {
|
package/src/value.h
CHANGED
|
@@ -26,7 +26,7 @@ void FreeGIArgument (GITypeInfo *type_info, GIArgument *argument, GITran
|
|
|
26
26
|
void FreeGIArgumentArray (GITypeInfo *type_info, GIArgument *arg, GITransfer transfer = GI_TRANSFER_EVERYTHING, GIDirection direction = GI_DIRECTION_OUT, long length = -1);
|
|
27
27
|
bool CanConvertV8ToGIArgument (GITypeInfo *type_info, Local<Value> value, bool may_be_null);
|
|
28
28
|
|
|
29
|
-
bool V8ToGValue(GValue *gvalue, Local<Value> value, bool mustCopy = false)
|
|
29
|
+
bool V8ToGValue(GValue *gvalue, Local<Value> value, bool mustCopy = false);
|
|
30
30
|
Local<Value> GValueToV8(const GValue *gvalue, bool mustCopy = false);
|
|
31
31
|
bool CanConvertV8ToGValue(GValue *gvalue, Local<Value> value);
|
|
32
32
|
|
package/CHANGELOG.md
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
# Changelog
|
|
2
|
-
|
|
3
|
-
Changes to be released are kept in the unreleased section.
|
|
4
|
-
|
|
5
|
-
## Unreleased
|
|
6
|
-
|
|
7
|
-
## v0.5.0
|
|
8
|
-
|
|
9
|
-
- Added support for GError
|
|
10
|
-
- Added `getProperty` and `setProperty` to GObject
|
|
11
|
-
- Improve handling of non-introspected objects
|
|
12
|
-
|
|
13
|
-
## v0.4.0
|
|
14
|
-
|
|
15
|
-
- Added `cairo` bindings
|
|
16
|
-
- Improved memory management
|
|
17
|
-
- Added support for node 13.x
|
|
18
|
-
- Added override for `Gtk.Builder#getObject`
|
|
19
|
-
|
|
20
|
-
## v0.3.0
|
|
21
|
-
|
|
22
|
-
- Added export `System` for low-level inspection
|
|
23
|
-
- Added overrides to module `Pango`
|
|
24
|
-
- Added support for complex out-arguments in function calls
|
|
25
|
-
- Added support for node 12.x
|