Skip to content
Closed
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
fixup
Signed-off-by: Paolo Insogna <paolo@cowtech.it>
  • Loading branch information
ShogunPanda committed Apr 11, 2026
commit 06c1d1a766639fd6090336e4e75bdeab2ecb6bfa
40 changes: 23 additions & 17 deletions src/ffi/data.cc
Original file line number Diff line number Diff line change
Expand Up @@ -36,14 +36,15 @@ bool GetValidatedSize(Environment* env,
const char* label,
size_t* out) {
if (!value->IsNumber()) {
env->ThrowTypeError(
(std::string("The ") + label + " must be a number").c_str());
THROW_ERR_INVALID_ARG_VALUE(
env, (std::string("The ") + label + " must be a number").c_str());
return false;
}

double length = value.As<Number>()->Value();
if (!std::isfinite(length) || length < 0 || std::floor(length) != length) {
env->ThrowTypeError(
THROW_ERR_INVALID_ARG_VALUE(
env,
(std::string("The ") + label + " must be a non-negative integer")
.c_str());
return false;
Expand All @@ -64,15 +65,16 @@ bool GetValidatedPointerAddress(Environment* env,
const char* label,
uintptr_t* out) {
if (!value->IsBigInt()) {
env->ThrowTypeError(
(std::string("The ") + label + " must be a bigint").c_str());
THROW_ERR_INVALID_ARG_VALUE(
env, (std::string("The ") + label + " must be a bigint").c_str());
return false;
}

bool lossless;
uint64_t address = value.As<BigInt>()->Uint64Value(&lossless);
if (!lossless) {
env->ThrowTypeError(
THROW_ERR_INVALID_ARG_VALUE(
env,
(std::string("The ") + label + " must be a non-negative bigint")
.c_str());
return false;
Expand All @@ -97,14 +99,16 @@ bool GetValidatedSignedInt(Environment* env,
const char* type_name,
int64_t* out) {
if (!value->IsNumber()) {
env->ThrowTypeError((std::string("Value must be an ") + type_name).c_str());
THROW_ERR_INVALID_ARG_VALUE(
env, (std::string("Value must be an ") + type_name).c_str());
return false;
}

double number = value.As<Number>()->Value();
if (!std::isfinite(number) || std::floor(number) != number || number < min ||
number > max) {
env->ThrowTypeError((std::string("Value must be an ") + type_name).c_str());
THROW_ERR_INVALID_ARG_VALUE(
env, (std::string("Value must be an ") + type_name).c_str());
return false;
}

Expand All @@ -118,14 +122,16 @@ bool GetValidatedUnsignedInt(Environment* env,
const char* type_name,
uint64_t* out) {
if (!value->IsNumber()) {
env->ThrowTypeError((std::string("Value must be a ") + type_name).c_str());
THROW_ERR_INVALID_ARG_VALUE(
env, (std::string("Value must be a ") + type_name).c_str());
return false;
}

double number = value.As<Number>()->Value();
if (!std::isfinite(number) || std::floor(number) != number || number < 0 ||
number > static_cast<double>(max)) {
env->ThrowTypeError((std::string("Value must be a ") + type_name).c_str());
THROW_ERR_INVALID_ARG_VALUE(
env, (std::string("Value must be a ") + type_name).c_str());
return false;
}

Expand Down Expand Up @@ -223,7 +229,7 @@ bool GetValidatedPointerValueAndOffset(Environment* env,
}

if (args.Length() < 2 || args[1]->IsUndefined()) {
env->ThrowTypeError("Expected an offset argument");
THROW_ERR_INVALID_ARG_VALUE(env, "Expected an offset argument");
return false;
}

Expand All @@ -241,7 +247,7 @@ bool GetValidatedPointerValueAndOffset(Environment* env,
}

if (args.Length() < 3 || args[2]->IsUndefined()) {
env->ThrowTypeError("Expected a value argument");
THROW_ERR_INVALID_ARG_VALUE(env, "Expected a value argument");
return false;
}

Expand Down Expand Up @@ -362,7 +368,7 @@ void SetValue(const FunctionCallbackInfo<Value>& args) {
bool lossless;
converted = static_cast<T>(value.As<BigInt>()->Int64Value(&lossless));
if (!lossless) {
env->ThrowTypeError("Value must be an int64");
THROW_ERR_INVALID_ARG_VALUE(env, "Value must be an int64");
return;
}
} else if (value->IsNumber()) {
Expand All @@ -377,15 +383,15 @@ void SetValue(const FunctionCallbackInfo<Value>& args) {
}
converted = static_cast<T>(validated);
} else {
env->ThrowTypeError("Value must be a bigint or a number");
THROW_ERR_INVALID_ARG_VALUE(env, "Value must be a bigint or a number");
return;
}
} else if constexpr (std::is_same_v<T, uint64_t>) {
if (value->IsBigInt()) {
bool lossless;
converted = static_cast<T>(value.As<BigInt>()->Uint64Value(&lossless));
if (!lossless) {
env->ThrowTypeError("Value must be a uint64");
THROW_ERR_INVALID_ARG_VALUE(env, "Value must be a uint64");
return;
}
} else if (value->IsNumber()) {
Expand All @@ -399,15 +405,15 @@ void SetValue(const FunctionCallbackInfo<Value>& args) {
}
converted = static_cast<T>(validated);
} else {
env->ThrowTypeError("Value must be a bigint or a number");
THROW_ERR_INVALID_ARG_VALUE(env, "Value must be a bigint or a number");
return;
}
} else if constexpr (std::is_same_v<T, float> || std::is_same_v<T, double>) {
MaybeLocal<Number> number = value->ToNumber(context);
Local<Number> number_local;

if (!number.ToLocal(&number_local)) {
env->ThrowTypeError("Value must be a number");
THROW_ERR_INVALID_ARG_VALUE(env, "Value must be a number");
return;
}

Expand Down