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/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++: gulong */
72
- return v8::BigInt::NewFromUnsigned(Isolate::GetCurrent(), arg->v_ulong);
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
- if (g_type_info_is_zero_terminated (type_info)) {
258
- length = g_strv_length ((gchar **)data);
259
- }
260
- else {
261
- length = g_type_info_get_array_fixed_size (type_info);
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
- g_assert (length >= 0);
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; i < length; i++) {
305
- void** pointer = (void**)((ulong)data + i * item_size);
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 = malloc(element_size * (length + (isZeroTerminated ? 1 : 0)));
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*)((ulong)result + i * element_size);
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
- void* pointer = (void*)((ulong)result + length * element_size);
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 = malloc(element_size * (length + (isZeroTerminated ? 1 : 0)));
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
- void* pointer = (void*)((ulong)result + length * element_size);
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
- free(message);
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
- free(message);
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
- arg->v_int64 = Nan::To<int64_t> (value).ToChecked();
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
- arg->v_uint64 = Nan::To<int64_t> (value).ToChecked();
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->v_ulong = value.As<v8::BigInt>()->Uint64Value();
789
+ arg->v_size = value.As<v8::BigInt>()->Uint64Value();
723
790
  else
724
- arg->v_ulong = Nan::To<int64_t> (value).ToChecked();
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
- *(gint64*)arg->v_pointer = Nan::To<int64_t> (value).ToChecked();
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
- *(guint64*)arg->v_pointer = Nan::To<int64_t> (value).ToChecked();
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
- *(gulong*)arg->v_pointer = value.As<v8::BigInt>()->Uint64Value();
935
+ *(gsize*)arg->v_pointer = value.As<v8::BigInt>()->Uint64Value();
861
936
  else
862
- *(gulong*)arg->v_pointer = Nan::To<int64_t> (value).ToChecked();
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*)((ulong)data + element_size * i), sizeof (GIArgument));
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
- free(data);
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) __attribute__((warn_unused_result));
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