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 usage of V8 deprecated APIs in node_url.cc #11066

Closed
wants to merge 1 commit into from
Closed
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
61 changes: 33 additions & 28 deletions src/node_url.cc
Original file line number Diff line number Diff line change
Expand Up @@ -512,36 +512,38 @@ namespace url {
return true;
}

static inline void Copy(Isolate* isolate,
static inline void Copy(Environment* env,
Local<Array> ary,
std::vector<std::string>* vec) {
const int32_t len = ary->Length();
if (len == 0)
return; // nothing to copy
vec->reserve(len);
for (int32_t n = 0; n < len; n++) {
Local<Value> val = ary->Get(n);
Local<Value> val = ary->Get(env->context(), n).ToLocalChecked();
if (val->IsString()) {
Utf8Value value(isolate, val.As<String>());
Utf8Value value(env->isolate(), val.As<String>());
vec->push_back(std::string(*value, value.length()));
}
}
}

static inline Local<Array> Copy(Isolate* isolate,
static inline Local<Array> Copy(Environment* env,
std::vector<std::string> vec) {
Isolate* isolate = env->isolate();
Local<Array> ary = Array::New(isolate, vec.size());
for (size_t n = 0; n < vec.size(); n++)
ary->Set(n, UTF8STRING(isolate, vec[n]));
ary->Set(env->context(), n, UTF8STRING(isolate, vec[n])).FromJust();
return ary;
}

static inline void HarvestBase(Environment* env,
struct url_data* base,
Local<Object> base_obj) {
Local<Context> context = env->context();
Local<Value> flags = GET(env, base_obj, "flags");
if (flags->IsInt32())
base->flags = flags->Int32Value();
base->flags = flags->Int32Value(context).FromJust();

GET_AND_SET(env, base_obj, scheme, base, URL_FLAGS_HAS_SCHEME);
GET_AND_SET(env, base_obj, username, base, URL_FLAGS_HAS_USERNAME);
Expand All @@ -551,11 +553,11 @@ namespace url {
GET_AND_SET(env, base_obj, fragment, base, URL_FLAGS_HAS_FRAGMENT);
Local<Value> port = GET(env, base_obj, "port");
if (port->IsInt32())
base->port = port->Int32Value();
base->port = port->Int32Value(context).FromJust();
Local<Value> path = GET(env, base_obj, "path");
if (path->IsArray()) {
base->flags |= URL_FLAGS_HAS_PATH;
Copy(env->isolate(), path.As<Array>(), &(base->path));
Copy(env, path.As<Array>(), &(base->path));
}
}

Expand All @@ -564,7 +566,7 @@ namespace url {
Local<Object> context_obj) {
Local<Value> flags = GET(env, context_obj, "flags");
if (flags->IsInt32()) {
int32_t _flags = flags->Int32Value();
int32_t _flags = flags->Int32Value(env->context()).FromJust();
if (_flags & URL_FLAGS_SPECIAL)
context->flags |= URL_FLAGS_SPECIAL;
if (_flags & URL_FLAGS_CANNOT_BE_BASE)
Expand All @@ -577,7 +579,7 @@ namespace url {
}
Local<Value> port = GET(env, context_obj, "port");
if (port->IsInt32())
context->port = port->Int32Value();
context->port = port->Int32Value(env->context()).FromJust();
}

// Single dot segment can be ".", "%2e", or "%2E"
Expand Down Expand Up @@ -635,7 +637,7 @@ namespace url {
Local<Value> recv,
const char* input,
const size_t len,
enum url_parse_state override,
enum url_parse_state state_override,
Local<Value> base_obj,
Local<Value> context_obj,
Local<Function> cb) {
Expand Down Expand Up @@ -669,8 +671,9 @@ namespace url {
buffer.reserve(len);

// Set the initial parse state.
const bool state_override = override != kUnknownState;
enum url_parse_state state = state_override ? override : kSchemeStart;
const bool has_state_override = state_override != kUnknownState;
enum url_parse_state state = has_state_override ? state_override :
kSchemeStart;

const char* p = input;
const char* end = input + len;
Expand Down Expand Up @@ -702,7 +705,7 @@ namespace url {
if (ASCII_ALPHA(ch)) {
buffer += TO_LOWER(ch);
state = kScheme;
} else if (!state_override) {
} else if (!has_state_override) {
state = kNoScheme;
continue;
} else {
Expand All @@ -714,7 +717,7 @@ namespace url {
buffer += TO_LOWER(ch);
p++;
continue;
} else if (ch == ':' || (state_override && ch == kEOL)) {
} else if (ch == ':' || (has_state_override && ch == kEOL)) {
buffer += ':';
if (buffer.size() > 0) {
SET_HAVE_SCHEME()
Expand All @@ -725,7 +728,7 @@ namespace url {
} else {
url.flags &= ~URL_FLAGS_SPECIAL;
}
if (state_override)
if (has_state_override)
goto done;
buffer.clear();
if (url.scheme == "file:") {
Expand All @@ -746,7 +749,7 @@ namespace url {
url.path.push_back("");
state = kCannotBeBase;
}
} else if (!state_override) {
} else if (!has_state_override) {
buffer.clear();
state = kNoScheme;
p = input;
Expand Down Expand Up @@ -1000,7 +1003,7 @@ namespace url {
URL_FAILED()
buffer.clear();
state = kPort;
if (override == kHostname)
if (state_override == kHostname)
TERMINATE()
} else if (ch == kEOL ||
ch == '/' ||
Expand All @@ -1015,7 +1018,7 @@ namespace url {
URL_FAILED()
buffer.clear();
state = kPathStart;
if (state_override)
if (has_state_override)
TERMINATE()
} else {
if (ch == '[')
Expand All @@ -1028,7 +1031,7 @@ namespace url {
case kPort:
if (ASCII_DIGIT(ch)) {
buffer += ch;
} else if (state_override ||
} else if (has_state_override ||
ch == kEOL ||
ch == '/' ||
ch == '?' ||
Expand All @@ -1040,7 +1043,7 @@ namespace url {
port = port * 10 + buffer[i] - '0';
if (port >= 0 && port <= 0xffff) {
url.port = NormalizePort(url.scheme, port);
} else if (!state_override) {
} else if (!has_state_override) {
URL_FAILED()
}
buffer.clear();
Expand Down Expand Up @@ -1181,7 +1184,7 @@ namespace url {
if (ch == kEOL ||
ch == '/' ||
special_back_slash ||
(!state_override && (ch == '?' || ch == '#'))) {
(!has_state_override && (ch == '?' || ch == '#'))) {
if (IsDoubleDotSegment(buffer)) {
ShortenUrlPath(&url);
if (ch != '/' && !special_back_slash) {
Expand Down Expand Up @@ -1233,7 +1236,7 @@ namespace url {
}
break;
case kQuery:
if (ch == kEOL || (!state_override && ch == '#')) {
if (ch == kEOL || (!has_state_override && ch == '#')) {
SET_HAVE_QUERY()
url.query = buffer;
buffer.clear();
Expand Down Expand Up @@ -1296,7 +1299,7 @@ namespace url {
if (url.port > -1)
argv[ARG_PORT] = Integer::New(isolate, url.port);
if (DOES_HAVE_PATH(url))
argv[ARG_PATH] = Copy(isolate, url.path);
argv[ARG_PATH] = Copy(env, url.path);
}

(void)cb->Call(context, recv, 9, argv);
Expand All @@ -1314,13 +1317,15 @@ namespace url {
args[3]->IsObject());
CHECK(args[4]->IsFunction());
Utf8Value input(env->isolate(), args[0]);
enum url_parse_state override = kUnknownState;
if (args[1]->IsNumber())
override = (enum url_parse_state)(args[1]->Uint32Value());
enum url_parse_state state_override = kUnknownState;
if (args[1]->IsNumber()) {
state_override = static_cast<enum url_parse_state>(
args[1]->Uint32Value(env->context()).FromJust());
}

Parse(env, args.This(),
*input, input.length(),
override,
state_override,
args[2],
args[3],
args[4].As<Function>());
Expand Down