Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

src: remove calls to deprecated v8 functions (Uint32Value) #22143

Closed
wants to merge 9 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
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
2 changes: 1 addition & 1 deletion lib/buffer.js
Original file line number Diff line number Diff line change
Expand Up @@ -772,7 +772,7 @@ function bidirectionalIndexOf(buffer, val, byteOffset, encoding, dir) {
} else if (isUint8Array(val)) {
return indexOfBuffer(buffer, val, byteOffset, encoding, dir);
} else if (typeof val === 'number') {
return indexOfNumber(buffer, val, byteOffset, dir);
return indexOfNumber(buffer, val >>> 0, byteOffset, dir);
}

throw new ERR_INVALID_ARG_TYPE(
Expand Down
3 changes: 2 additions & 1 deletion src/inspector_js_api.cc
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ using v8::MaybeLocal;
using v8::NewStringType;
using v8::Object;
using v8::String;
using v8::Uint32;
using v8::Value;

using v8_inspector::StringBuffer;
Expand Down Expand Up @@ -241,7 +242,7 @@ void Open(const FunctionCallbackInfo<Value>& args) {
bool wait_for_connect = false;

if (args.Length() > 0 && args[0]->IsUint32()) {
uint32_t port = args[0]->Uint32Value();
uint32_t port = args[0].As<Uint32>()->Value();
agent->options()->host_port.port = port;
}

Expand Down
16 changes: 11 additions & 5 deletions src/node_buffer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ using v8::Maybe;
using v8::MaybeLocal;
using v8::Object;
using v8::String;
using v8::Uint32;
using v8::Uint32Array;
using v8::Uint8Array;
using v8::Value;
Expand Down Expand Up @@ -563,12 +564,15 @@ void Copy(const FunctionCallbackInfo<Value> &args) {

void Fill(const FunctionCallbackInfo<Value>& args) {
Environment* env = Environment::GetCurrent(args);
Local<Context> ctx = env->context();

THROW_AND_RETURN_UNLESS_BUFFER(env, args[0]);
SPREAD_BUFFER_ARG(args[0], ts_obj);

size_t start = args[2]->Uint32Value();
size_t end = args[3]->Uint32Value();
uint32_t start;
if (!args[2]->Uint32Value(ctx).To(&start)) return;
uint32_t end;
if (!args[3]->Uint32Value(ctx).To(&end)) return;
Copy link
Member

@lundibundi lundibundi Sep 2, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure but perhaps FromMaybe version is clearer?

  uint32_t start = args[2]->Uint32Value(ctx).FromMaybe(0);
  uint32_t end = args[3]->Uint32Value(ctx).FromMaybe(0);

Though this will result in function actually continuing execution if provided with invalid value (but wasn't this how it was before - Uint32Value() returns 0 on invalid values AFAIK? )?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Though this will result in function actually continuing execution if provided with invalid value

That is the previous behaviour, which is buggy in that it will swallow exceptions if both calls fail.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤔 shouldn't this then be semver-major to avoid possible breakage?

Also, perhaps we can

  if (!args[2]->IsUint32() || !args[3]->IsUint32())
    return args.GetReturnValue().Set(-2);

  uint32_t start = args[2].As<Uint32>()->Value();
  uint32_t end = args[3].As<Uint32>()->Value();

in this case (tests seem to pass)?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The only place where we pass in invalid arguments is from a process.binding() test. We could/should probably remove that test in a follow-up PR, and revert 05aa50f (which is pretty close to your suggestion)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, I thought that this was expected somewhere else, therefore the test. The suggested commit is even better, with the above I wanted to somehow mitigate that test.

size_t fill_length = end - start;
Local<String> str_obj;
size_t str_length;
Expand All @@ -588,7 +592,9 @@ void Fill(const FunctionCallbackInfo<Value>& args) {

// Then coerce everything that's not a string.
if (!args[1]->IsString()) {
int value = args[1]->Uint32Value() & 255;
uint32_t val;
if (!args[1]->Uint32Value(ctx).To(&val)) return;
int value = val & 255;
memset(ts_obj_data + start, value, fill_length);
return;
}
Expand Down Expand Up @@ -997,14 +1003,14 @@ void IndexOfBuffer(const FunctionCallbackInfo<Value>& args) {
}

void IndexOfNumber(const FunctionCallbackInfo<Value>& args) {
CHECK(args[1]->IsNumber());
CHECK(args[1]->IsUint32());
CHECK(args[2]->IsNumber());
CHECK(args[3]->IsBoolean());

THROW_AND_RETURN_UNLESS_BUFFER(Environment::GetCurrent(args), args[0]);
SPREAD_BUFFER_ARG(args[0], ts_obj);

uint32_t needle = args[1]->Uint32Value();
uint32_t needle = args[1].As<Uint32>()->Value();
int64_t offset_i64 = args[2]->IntegerValue();
bool is_forward = args[3]->IsTrue();

Expand Down
16 changes: 10 additions & 6 deletions src/node_crypto.cc
Original file line number Diff line number Diff line change
Expand Up @@ -3871,7 +3871,8 @@ void PublicKeyCipher::Cipher(const FunctionCallbackInfo<Value>& args) {
char* buf = Buffer::Data(args[1]);
ssize_t len = Buffer::Length(args[1]);

int padding = args[2]->Uint32Value();
uint32_t padding;
if (!args[2]->Uint32Value(env->context()).To(&padding)) return;

String::Utf8Value passphrase(args.GetIsolate(), args[3]);

Expand Down Expand Up @@ -4436,8 +4437,9 @@ void ECDH::GetPublicKey(const FunctionCallbackInfo<Value>& args) {
return env->ThrowError("Failed to get ECDH public key");

int size;
point_conversion_form_t form =
static_cast<point_conversion_form_t>(args[0]->Uint32Value());
CHECK(args[0]->IsUint32());
uint32_t val = args[0].As<Uint32>()->Value();
point_conversion_form_t form = static_cast<point_conversion_form_t>(val);

size = EC_POINT_point2oct(ecdh->group_, pub, form, nullptr, 0, nullptr);
if (size == 0)
Expand Down Expand Up @@ -5052,8 +5054,9 @@ void ConvertKey(const FunctionCallbackInfo<Value>& args) {
if (pub == nullptr)
return env->ThrowError("Failed to convert Buffer to EC_POINT");

point_conversion_form_t form =
static_cast<point_conversion_form_t>(args[2]->Uint32Value());
CHECK(args[2]->IsUint32());
uint32_t val = args[2].As<Uint32>()->Value();
point_conversion_form_t form = static_cast<point_conversion_form_t>(val);

int size = EC_POINT_point2oct(
group.get(), pub.get(), form, nullptr, 0, nullptr);
Expand Down Expand Up @@ -5152,7 +5155,8 @@ void InitCryptoOnce() {
void SetEngine(const FunctionCallbackInfo<Value>& args) {
Environment* env = Environment::GetCurrent(args);
CHECK(args.Length() >= 2 && args[0]->IsString());
unsigned int flags = args[1]->Uint32Value();
uint32_t flags;
if (!args[1]->Uint32Value(env->context()).To(&flags)) return;

ClearErrorOnReturn clear_error_on_return;

Expand Down
6 changes: 3 additions & 3 deletions src/node_i18n.cc
Original file line number Diff line number Diff line change
Expand Up @@ -819,9 +819,9 @@ static void GetStringWidth(const FunctionCallbackInfo<Value>& args) {
bool expand_emoji_sequence = args[2]->IsTrue();

if (args[0]->IsNumber()) {
args.GetReturnValue().Set(
GetColumnWidth(args[0]->Uint32Value(),
ambiguous_as_full_width));
uint32_t val;
if (!args[0]->Uint32Value(env->context()).To(&val)) return;
args.GetReturnValue().Set(GetColumnWidth(val, ambiguous_as_full_width));
return;
}

Expand Down
6 changes: 3 additions & 3 deletions src/node_process.cc
Original file line number Diff line number Diff line change
Expand Up @@ -335,7 +335,7 @@ static const char* name_by_gid(gid_t gid) {

static uid_t uid_by_name(Isolate* isolate, Local<Value> value) {
if (value->IsUint32()) {
return static_cast<uid_t>(value->Uint32Value());
return static_cast<uid_t>(value.As<Uint32>()->Value());
} else {
Utf8Value name(isolate, value);
return uid_by_name(*name);
Expand All @@ -345,7 +345,7 @@ static uid_t uid_by_name(Isolate* isolate, Local<Value> value) {

static gid_t gid_by_name(Isolate* isolate, Local<Value> value) {
if (value->IsUint32()) {
return static_cast<gid_t>(value->Uint32Value());
return static_cast<gid_t>(value.As<Uint32>()->Value());
} else {
Utf8Value name(isolate, value);
return gid_by_name(*name);
Expand Down Expand Up @@ -538,7 +538,7 @@ void InitGroups(const FunctionCallbackInfo<Value>& args) {
char* user;

if (args[0]->IsUint32()) {
user = name_by_uid(args[0]->Uint32Value());
user = name_by_uid(args[0].As<Uint32>()->Value());
must_free = true;
} else {
user = *arg0;
Expand Down
52 changes: 31 additions & 21 deletions src/node_zlib.cc
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ using v8::Local;
using v8::Number;
using v8::Object;
using v8::String;
using v8::Uint32;
using v8::Uint32Array;
using v8::Value;

Expand Down Expand Up @@ -155,7 +156,11 @@ class ZCtx : public AsyncWrap, public ThreadPoolWork {

CHECK_EQ(false, args[0]->IsUndefined() && "must provide flush value");

unsigned int flush = args[0]->Uint32Value();
Environment* env = ctx->env();
Local<Context> context = env->context();

unsigned int flush;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess CI is going to tell us whether it’s a real problem, but at least in theory this would be uint32_t, too

if (!args[0]->Uint32Value(context).To(&flush)) return;

if (flush != Z_NO_FLUSH &&
flush != Z_PARTIAL_FLUSH &&
Expand All @@ -170,8 +175,7 @@ class ZCtx : public AsyncWrap, public ThreadPoolWork {

Bytef* in;
Bytef* out;
size_t in_off, in_len, out_off, out_len;
Environment* env = ctx->env();
uint32_t in_off, in_len, out_off, out_len;

if (args[1]->IsNull()) {
// just a flush
Expand All @@ -181,18 +185,18 @@ class ZCtx : public AsyncWrap, public ThreadPoolWork {
} else {
CHECK(Buffer::HasInstance(args[1]));
Local<Object> in_buf;
in_buf = args[1]->ToObject(env->context()).ToLocalChecked();
in_off = args[2]->Uint32Value();
in_len = args[3]->Uint32Value();
in_buf = args[1]->ToObject(context).ToLocalChecked();
if (!args[2]->Uint32Value(context).To(&in_off)) return;
if (!args[3]->Uint32Value(context).To(&in_len)) return;

CHECK(Buffer::IsWithinBounds(in_off, in_len, Buffer::Length(in_buf)));
in = reinterpret_cast<Bytef *>(Buffer::Data(in_buf) + in_off);
}

CHECK(Buffer::HasInstance(args[4]));
Local<Object> out_buf = args[4]->ToObject(env->context()).ToLocalChecked();
out_off = args[5]->Uint32Value();
out_len = args[6]->Uint32Value();
Local<Object> out_buf = args[4]->ToObject(context).ToLocalChecked();
if (!args[5]->Uint32Value(context).To(&out_off)) return;
if (!args[6]->Uint32Value(context).To(&out_len)) return;
CHECK(Buffer::IsWithinBounds(out_off, out_len, Buffer::Length(out_buf)));
out = reinterpret_cast<Bytef *>(Buffer::Data(out_buf) + out_off);

Expand Down Expand Up @@ -438,32 +442,38 @@ class ZCtx : public AsyncWrap, public ThreadPoolWork {
ZCtx* ctx;
ASSIGN_OR_RETURN_UNWRAP(&ctx, args.Holder());

Local<Context> context = args.GetIsolate()->GetCurrentContext();

// windowBits is special. On the compression side, 0 is an invalid value.
// But on the decompression side, a value of 0 for windowBits tells zlib
// to use the window size in the zlib header of the compressed stream.
int windowBits = args[0]->Uint32Value();
uint32_t windowBits;
if (!args[0]->Uint32Value(context).To(&windowBits)) return;

if (!((windowBits == 0) &&
(ctx->mode_ == INFLATE ||
ctx->mode_ == GUNZIP ||
ctx->mode_ == UNZIP))) {
CHECK((windowBits >= Z_MIN_WINDOWBITS &&
windowBits <= Z_MAX_WINDOWBITS) && "invalid windowBits");
CHECK(
(windowBits >= Z_MIN_WINDOWBITS && windowBits <= Z_MAX_WINDOWBITS) &&
"invalid windowBits");
}

int level = args[1]->Int32Value();
CHECK((level >= Z_MIN_LEVEL && level <= Z_MAX_LEVEL) &&
"invalid compression level");

int memLevel = args[2]->Uint32Value();
uint32_t memLevel;
if (!args[2]->Uint32Value(context).To(&memLevel)) return;
CHECK((memLevel >= Z_MIN_MEMLEVEL && memLevel <= Z_MAX_MEMLEVEL) &&
"invalid memlevel");

int strategy = args[3]->Uint32Value();
CHECK((strategy == Z_FILTERED ||
strategy == Z_HUFFMAN_ONLY ||
strategy == Z_RLE ||
strategy == Z_FIXED ||
strategy == Z_DEFAULT_STRATEGY) && "invalid strategy");
"invalid memlevel");

uint32_t strategy;
if (!args[3]->Uint32Value(context).To(&strategy)) return;
CHECK((strategy == Z_FILTERED || strategy == Z_HUFFMAN_ONLY ||
strategy == Z_RLE || strategy == Z_FIXED ||
strategy == Z_DEFAULT_STRATEGY) &&
"invalid strategy");

CHECK(args[4]->IsUint32Array());
Local<Uint32Array> array = args[4].As<Uint32Array>();
Expand Down
5 changes: 3 additions & 2 deletions src/tcp_wrap.cc
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ using v8::Integer;
using v8::Local;
using v8::Object;
using v8::String;
using v8::Uint32;
using v8::Value;

using AsyncHooks = Environment::AsyncHooks;
Expand Down Expand Up @@ -180,7 +181,7 @@ void TCPWrap::SetKeepAlive(const FunctionCallbackInfo<Value>& args) {
args.Holder(),
args.GetReturnValue().Set(UV_EBADF));
int enable = args[0]->Int32Value();
unsigned int delay = args[1]->Uint32Value();
unsigned int delay = args[1].As<Uint32>()->Value();
int err = uv_tcp_keepalive(&wrap->handle_, enable, delay);
args.GetReturnValue().Set(err);
}
Expand Down Expand Up @@ -277,7 +278,7 @@ void TCPWrap::Connect(const FunctionCallbackInfo<Value>& args) {

Local<Object> req_wrap_obj = args[0].As<Object>();
node::Utf8Value ip_address(env->isolate(), args[1]);
int port = args[2]->Uint32Value();
int port = args[2].As<Uint32>()->Value();

sockaddr_in addr;
int err = uv_ip4_addr(*ip_address, port, &addr);
Expand Down
11 changes: 7 additions & 4 deletions src/udp_wrap.cc
Original file line number Diff line number Diff line change
Expand Up @@ -180,8 +180,11 @@ void UDPWrap::DoBind(const FunctionCallbackInfo<Value>& args, int family) {
CHECK_EQ(args.Length(), 3);

node::Utf8Value address(args.GetIsolate(), args[0]);
const int port = args[1]->Uint32Value();
const int flags = args[2]->Uint32Value();
Local<Context> ctx = args.GetIsolate()->GetCurrentContext();
uint32_t port, flags;
if (!args[1]->Uint32Value(ctx).To(&port) ||
!args[2]->Uint32Value(ctx).To(&flags))
return;
char addr[sizeof(sockaddr_in6)];
int err;

Expand Down Expand Up @@ -353,8 +356,8 @@ void UDPWrap::DoSend(const FunctionCallbackInfo<Value>& args, int family) {
Local<Array> chunks = args[1].As<Array>();
// it is faster to fetch the length of the
// array in js-land
size_t count = args[2]->Uint32Value();
const unsigned short port = args[3]->Uint32Value();
size_t count = args[2].As<Uint32>()->Value();
const unsigned short port = args[3].As<Uint32>()->Value();
node::Utf8Value address(env->isolate(), args[4]);
const bool have_callback = args[5]->IsTrue();

Expand Down