2020using v8::Array;
2121using v8::TypedArray;
2222using v8::Integer;
23+ using v8::BigInt;
2324using v8::Local;
2425using v8::Number;
2526using v8::Object;
@@ -35,6 +36,22 @@ static void HashPointerToGIArgument (GIArgument *arg, GITypeInfo *type_info);
3536
3637static bool IsUint8Array (GITypeInfo *type_info);
3738
39+ static int64_t V8ToInt64 (Local<Value> value) {
40+ if (value->IsBigInt ())
41+ return value.As <v8::BigInt>()->Int64Value ();
42+ return Nan::To<int64_t >(value).ToChecked ();
43+ }
44+
45+ static int64_t V8ToUint64Strict (Local<Value> value) {
46+ return Local<BigInt>::Cast (value)->Uint64Value ();
47+ }
48+
49+ static int64_t V8ToInt32 (Local<Value> value) {
50+ if (value->IsBigInt ())
51+ return value.As <v8::BigInt>()->Int64Value ();
52+ return Nan::To<int32_t >(value).ToChecked ();
53+ }
54+
3855
3956Local<Value> GIArgumentToV8 (GITypeInfo *type_info, GIArgument *arg, long length, bool mustCopy) {
4057 GITypeTag type_tag = g_type_info_get_tag (type_info);
@@ -688,28 +705,28 @@ bool V8ToGIArgument(GITypeInfo *type_info, GIArgument *arg, Local<Value> value,
688705 arg->v_boolean = Nan::To<bool > (value).ToChecked ();
689706 break ;
690707 case GI_TYPE_TAG_INT8:
691- arg->v_int8 = Nan::To< int32_t > (value). ToChecked ( );
708+ arg->v_int8 = V8ToInt32 (value);
692709 break ;
693710 case GI_TYPE_TAG_INT16:
694- arg->v_int16 = Nan::To< int32_t > (value). ToChecked ( );
711+ arg->v_int16 = V8ToInt32 (value);
695712 break ;
696713 case GI_TYPE_TAG_INT32:
697- arg->v_int = Nan::To< int32_t > (value). ToChecked ( );
714+ arg->v_int = V8ToInt32 (value);
698715 break ;
699716 case GI_TYPE_TAG_INT64:
700- arg->v_int64 = value-> ToBigInt ( Nan::GetCurrentContext ()). ToLocalChecked ()-> Int64Value ( );
717+ arg->v_int64 = V8ToInt64 (value );
701718 break ;
702719 case GI_TYPE_TAG_UINT8:
703- arg->v_uint8 = Nan::To< uint32_t > (value). ToChecked ( );
720+ arg->v_uint8 = V8ToInt32 (value);
704721 break ;
705722 case GI_TYPE_TAG_UINT16:
706- arg->v_uint16 = Nan::To< uint32_t > (value). ToChecked ( );
723+ arg->v_uint16 = V8ToInt32 (value);
707724 break ;
708725 case GI_TYPE_TAG_UINT32:
709- arg->v_uint = Nan::To< uint32_t > (value). ToChecked ( );
726+ arg->v_uint = V8ToInt32 (value);
710727 break ;
711728 case GI_TYPE_TAG_UINT64:
712- arg->v_uint64 = value-> ToBigInt ( Nan::GetCurrentContext ()). ToLocalChecked ()-> Uint64Value ( );
729+ arg->v_uint64 = V8ToInt64 (value );
713730 break ;
714731 case GI_TYPE_TAG_FLOAT:
715732 arg->v_float = Nan::To<double > (value).ToChecked ();
@@ -718,7 +735,7 @@ bool V8ToGIArgument(GITypeInfo *type_info, GIArgument *arg, Local<Value> value,
718735 arg->v_double = Nan::To<double > (value).ToChecked ();
719736 break ;
720737 case GI_TYPE_TAG_GTYPE:
721- arg->v_ulong = value-> ToBigInt ( Nan::GetCurrentContext ()). ToLocalChecked ()-> Uint64Value ( );
738+ arg->v_ulong = V8ToUint64Strict (value );
722739 break ;
723740
724741 case GI_TYPE_TAG_UTF8:
@@ -823,28 +840,28 @@ bool V8ToOutGIArgument(GITypeInfo *type_info, GIArgument *arg, Local<Value> valu
823840 *(gboolean*)arg->v_pointer = Nan::To<bool > (value).ToChecked ();
824841 break ;
825842 case GI_TYPE_TAG_INT8:
826- *(gint8*)arg->v_pointer = Nan::To< int32_t > (value). ToChecked ( );
843+ *(gint8*)arg->v_pointer = V8ToInt32 (value);
827844 break ;
828845 case GI_TYPE_TAG_INT16:
829- *(gint16*)arg->v_pointer = Nan::To< int32_t > (value). ToChecked ( );
846+ *(gint16*)arg->v_pointer = V8ToInt32 (value);
830847 break ;
831848 case GI_TYPE_TAG_INT32:
832- *(gint*)arg->v_pointer = Nan::To< int32_t > (value). ToChecked ( );
849+ *(gint*)arg->v_pointer = V8ToInt32 (value);
833850 break ;
834851 case GI_TYPE_TAG_INT64:
835- *(gint64*)arg->v_pointer = value-> ToBigInt ( Nan::GetCurrentContext ()). ToLocalChecked ()-> Int64Value ( );
852+ *(gint64*)arg->v_pointer = V8ToInt64 (value );
836853 break ;
837854 case GI_TYPE_TAG_UINT8:
838- *(guint8*)arg->v_pointer = Nan::To< uint32_t > (value). ToChecked ( );
855+ *(guint8*)arg->v_pointer = V8ToInt32 (value);
839856 break ;
840857 case GI_TYPE_TAG_UINT16:
841- *(guint16*)arg->v_pointer = Nan::To< uint32_t > (value). ToChecked ( );
858+ *(guint16*)arg->v_pointer = V8ToInt32 (value);
842859 break ;
843860 case GI_TYPE_TAG_UINT32:
844- *(guint*)arg->v_pointer = Nan::To< uint32_t > (value). ToChecked ( );
861+ *(guint*)arg->v_pointer = V8ToInt32 (value);
845862 break ;
846863 case GI_TYPE_TAG_UINT64:
847- *(guint64*)arg->v_pointer = value-> ToBigInt ( Nan::GetCurrentContext ()). ToLocalChecked ()-> Uint64Value ( );
864+ *(guint64*)arg->v_pointer = V8ToInt64 (value );
848865 break ;
849866 case GI_TYPE_TAG_FLOAT:
850867 *(gfloat*)arg->v_pointer = Nan::To<double > (value).ToChecked ();
@@ -853,7 +870,7 @@ bool V8ToOutGIArgument(GITypeInfo *type_info, GIArgument *arg, Local<Value> valu
853870 *(gdouble*)arg->v_pointer = Nan::To<double > (value).ToChecked ();
854871 break ;
855872 case GI_TYPE_TAG_GTYPE:
856- *(gulong*)arg->v_pointer = value-> ToBigInt ( Nan::GetCurrentContext ()). ToLocalChecked ()-> Uint64Value ( );
873+ *(gulong*)arg->v_pointer = V8ToUint64Strict (value );
857874 break ;
858875
859876 case GI_TYPE_TAG_UTF8:
@@ -1360,27 +1377,27 @@ bool V8ToGValue(GValue *gvalue, Local<Value> value, bool mustCopy) {
13601377 if (G_VALUE_HOLDS_BOOLEAN (gvalue)) {
13611378 g_value_set_boolean (gvalue, Nan::To<bool > (value).ToChecked ());
13621379 } else if (G_VALUE_HOLDS_CHAR (gvalue)) {
1363- g_value_set_schar (gvalue, Nan::To< int32_t > (value). ToChecked ( ));
1380+ g_value_set_schar (gvalue, V8ToInt32 (value));
13641381 } else if (G_VALUE_HOLDS_UCHAR (gvalue)) {
1365- g_value_set_uchar (gvalue, Nan::To< uint32_t > (value). ToChecked ( ));
1382+ g_value_set_uchar (gvalue, V8ToInt32 (value));
13661383 } else if (G_VALUE_HOLDS_INT (gvalue)) {
1367- g_value_set_int (gvalue, Nan::To< int32_t > (value). ToChecked ( ));
1384+ g_value_set_int (gvalue, V8ToInt32 (value));
13681385 } else if (G_VALUE_HOLDS_UINT (gvalue)) {
1369- g_value_set_uint (gvalue, Nan::To< uint32_t > (value). ToChecked ( ));
1386+ g_value_set_uint (gvalue, V8ToInt32 (value));
13701387 } else if (G_VALUE_HOLDS_LONG (gvalue)) {
1371- g_value_set_long (gvalue, value-> ToBigInt ( Nan::GetCurrentContext ()). ToLocalChecked ()-> Int64Value ( ));
1388+ g_value_set_long (gvalue, V8ToInt64 (value ));
13721389 } else if (G_VALUE_HOLDS_ULONG (gvalue)) {
1373- g_value_set_ulong (gvalue, value-> ToBigInt ( Nan::GetCurrentContext ()). ToLocalChecked ()-> Uint64Value ( ));
1390+ g_value_set_ulong (gvalue, V8ToInt64 (value ));
13741391 } else if (G_VALUE_HOLDS_INT64 (gvalue)) {
1375- g_value_set_int64 (gvalue, value-> ToBigInt ( Nan::GetCurrentContext ()). ToLocalChecked ()-> Int64Value ( ));
1392+ g_value_set_int64 (gvalue, V8ToInt64 (value ));
13761393 } else if (G_VALUE_HOLDS_UINT64 (gvalue)) {
1377- g_value_set_uint64 (gvalue, value-> ToBigInt ( Nan::GetCurrentContext ()). ToLocalChecked ()-> Uint64Value ( ));
1394+ g_value_set_uint64 (gvalue, V8ToInt64 (value ));
13781395 } else if (G_VALUE_HOLDS_FLOAT (gvalue)) {
13791396 g_value_set_float (gvalue, Nan::To<double > (value).ToChecked ());
13801397 } else if (G_VALUE_HOLDS_DOUBLE (gvalue)) {
13811398 g_value_set_double (gvalue, Nan::To<double > (value).ToChecked ());
13821399 } else if (G_VALUE_HOLDS_GTYPE (gvalue)) {
1383- g_value_set_gtype (gvalue, (GType) value-> ToBigInt ( Nan::GetCurrentContext ()). ToLocalChecked ()-> Uint64Value ( ));
1400+ g_value_set_gtype (gvalue, (GType) V8ToUint64Strict (value ));
13841401 } else if (G_VALUE_HOLDS_ENUM (gvalue)) {
13851402 g_value_set_enum (gvalue, Nan::To<int32_t > (value).ToChecked ());
13861403 } else if (G_VALUE_HOLDS_FLAGS (gvalue)) {
0 commit comments