Skip to content

Commit 355ca92

Browse files
committed
fix conversions
turns out ToBigInt() and ToNumber() doesn't perform conversion but only 'implicit' conversion which is not useful. create helpers to extract the numbers from V8 and use them everywhere (except in enum, flags, unichar)
1 parent 2927d8a commit 355ca92

File tree

1 file changed

+44
-27
lines changed

1 file changed

+44
-27
lines changed

src/value.cc

Lines changed: 44 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
using v8::Array;
2121
using v8::TypedArray;
2222
using v8::Integer;
23+
using v8::BigInt;
2324
using v8::Local;
2425
using v8::Number;
2526
using v8::Object;
@@ -35,6 +36,22 @@ static void HashPointerToGIArgument (GIArgument *arg, GITypeInfo *type_info);
3536

3637
static 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

3956
Local<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

Comments
 (0)