src: improve error handling in permission.cc · nodejs/node@be8e2b4
@@ -17,9 +17,9 @@ namespace node {
17171818using v8::Context;
1919using v8::FunctionCallbackInfo;
20+using v8::IntegrityLevel;
2021using v8::Local;
2122using v8::MaybeLocal;
22-using v8::NewStringType;
2323using v8::Object;
2424using v8::String;
2525using v8::Value;
@@ -32,10 +32,9 @@ namespace {
3232// permission.has('fs.in')
3333static void Has(const FunctionCallbackInfo<Value>& args) {
3434 Environment* env = Environment::GetCurrent(args);
35- v8::Isolate* isolate = env->isolate();
3635CHECK(args[0]->IsString());
373638- String::Utf8Value utf8_deny_scope(isolate, args[0]);
37+ String::Utf8Value utf8_deny_scope(env->isolate(), args[0]);
3938if (*utf8_deny_scope == nullptr) {
4039return;
4140 }
@@ -47,7 +46,7 @@ static void Has(const FunctionCallbackInfo<Value>& args) {
4746 }
48474948if (args.Length() > 1 && !args[1]->IsUndefined()) {
50- String::Utf8Value utf8_arg(isolate, args[1]);
49+ String::Utf8Value utf8_arg(env->isolate(), args[1]);
5150if (*utf8_arg == nullptr) {
5251return;
5352 }
@@ -111,14 +110,12 @@ MaybeLocal<Value> CreateAccessDeniedError(Environment* env,
111110 PermissionScope perm,
112111const 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,
132129void Permission::ThrowAccessDenied(Environment* env,
133130 PermissionScope perm,
134131const 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}
139139140140void Permission::AsyncThrowAccessDenied(Environment* env,
141141 fs::FSReqBase* req_wrap,
142142 PermissionScope perm,
143143const 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}
148151149152void Permission::EnablePermissions() {
@@ -167,7 +170,7 @@ void Initialize(Local<Object> target,
167170void* priv) {
168171SetMethodNoSideEffect(context, target, "has", Has);
169172170- target->SetIntegrityLevel(context, v8::IntegrityLevel::kFrozen).FromJust();
173+ target->SetIntegrityLevel(context, IntegrityLevel::kFrozen).FromJust();
171174}
172175173176void RegisterExternalReferences(ExternalReferenceRegistry* registry) {