src: improve error handling in permission.cc · nodejs/node@be8e2b4

@@ -17,9 +17,9 @@ namespace node {

17171818

using v8::Context;

1919

using v8::FunctionCallbackInfo;

20+

using v8::IntegrityLevel;

2021

using v8::Local;

2122

using v8::MaybeLocal;

22-

using v8::NewStringType;

2323

using v8::Object;

2424

using v8::String;

2525

using v8::Value;

@@ -32,10 +32,9 @@ namespace {

3232

// permission.has('fs.in')

3333

static void Has(const FunctionCallbackInfo<Value>& args) {

3434

Environment* env = Environment::GetCurrent(args);

35-

v8::Isolate* isolate = env->isolate();

3635

CHECK(args[0]->IsString());

373638-

String::Utf8Value utf8_deny_scope(isolate, args[0]);

37+

String::Utf8Value utf8_deny_scope(env->isolate(), args[0]);

3938

if (*utf8_deny_scope == nullptr) {

4039

return;

4140

}

@@ -47,7 +46,7 @@ static void Has(const FunctionCallbackInfo<Value>& args) {

4746

}

48474948

if (args.Length() > 1 && !args[1]->IsUndefined()) {

50-

String::Utf8Value utf8_arg(isolate, args[1]);

49+

String::Utf8Value utf8_arg(env->isolate(), args[1]);

5150

if (*utf8_arg == nullptr) {

5251

return;

5352

}

@@ -111,14 +110,12 @@ MaybeLocal<Value> CreateAccessDeniedError(Environment* env,

111110

PermissionScope perm,

112111

const std::string_view& res) {

113112

Local<Object> err = ERR_ACCESS_DENIED(env->isolate());

114-

Local<String> perm_string;

115-

Local<String> resource_string;

116-

if (!String::NewFromUtf8(env->isolate(),

117-

Permission::PermissionToString(perm),

118-

NewStringType::kNormal)

113+

Local<Value> perm_string;

114+

Local<Value> resource_string;

115+

std::string_view perm_str = Permission::PermissionToString(perm);

116+

if (!ToV8Value(env->context(), perm_str, env->isolate())

119117

.ToLocal(&perm_string) ||

120-

!String::NewFromUtf8(

121-

env->isolate(), std::string(res).c_str(), NewStringType::kNormal)

118+

!ToV8Value(env->context(), res, env->isolate())

122119

.ToLocal(&resource_string) ||

123120

err->Set(env->context(), env->permission_string(), perm_string)

124121

.IsNothing() ||

@@ -132,18 +129,24 @@ MaybeLocal<Value> CreateAccessDeniedError(Environment* env,

132129

void Permission::ThrowAccessDenied(Environment* env,

133130

PermissionScope perm,

134131

const std::string_view& res) {

135-

MaybeLocal<Value> err = CreateAccessDeniedError(env, perm, res);

136-

if (err.IsEmpty()) return;

137-

env->isolate()->ThrowException(err.ToLocalChecked());

132+

Local<Value> err;

133+

if (CreateAccessDeniedError(env, perm, res).ToLocal(&err)) {

134+

env->isolate()->ThrowException(err);

135+

}

136+

// If ToLocal returned false, then v8 will have scheduled a

137+

// superseding error to be thrown.

138138

}

139139140140

void Permission::AsyncThrowAccessDenied(Environment* env,

141141

fs::FSReqBase* req_wrap,

142142

PermissionScope perm,

143143

const std::string_view& res) {

144-

MaybeLocal<Value> err = CreateAccessDeniedError(env, perm, res);

145-

if (err.IsEmpty()) return;

146-

return req_wrap->Reject(err.ToLocalChecked());

144+

Local<Value> err;

145+

if (CreateAccessDeniedError(env, perm, res).ToLocal(&err)) {

146+

return req_wrap->Reject(err);

147+

}

148+

// If ToLocal returned false, then v8 will have scheduled a

149+

// superseding error to be thrown.

147150

}

148151149152

void Permission::EnablePermissions() {

@@ -167,7 +170,7 @@ void Initialize(Local<Object> target,

167170

void* priv) {

168171

SetMethodNoSideEffect(context, target, "has", Has);

169172170-

target->SetIntegrityLevel(context, v8::IntegrityLevel::kFrozen).FromJust();

173+

target->SetIntegrityLevel(context, IntegrityLevel::kFrozen).FromJust();

171174

}

172175173176

void RegisterExternalReferences(ExternalReferenceRegistry* registry) {