@@ -1074,12 +1074,6 @@ static void DLOpen(const FunctionCallbackInfo<Value>& args) { |
1074 | 1074 | // coverity[leaked_storage] |
1075 | 1075 | } |
1076 | 1076 |
|
1077 | | -static void OnMessage(Local<Message> message, Local<Value> error) { |
1078 | | - // The current version of V8 sends messages for errors only |
1079 | | - // (thus `error` is always set). |
1080 | | - FatalException(Isolate::GetCurrent(), error, message); |
1081 | | -} |
1082 | | - |
1083 | 1077 | static Maybe<bool> ProcessEmitWarningGeneric(Environment* env, |
1084 | 1078 | const char* warning, |
1085 | 1079 | const char* type = nullptr, |
@@ -1156,6 +1150,33 @@ Maybe<bool> ProcessEmitDeprecationWarning(Environment* env, |
1156 | 1150 | deprecation_code); |
1157 | 1151 | } |
1158 | 1152 |
|
| 1153 | +static void OnMessage(Local<Message> message, Local<Value> error) { |
| 1154 | + Isolate* isolate = message->GetIsolate(); |
| 1155 | + switch (message->ErrorLevel()) { |
| 1156 | + case Isolate::MessageErrorLevel::kMessageWarning: { |
| 1157 | + Environment* env = Environment::GetCurrent(isolate); |
| 1158 | + if (!env) { |
| 1159 | + break; |
| 1160 | + } |
| 1161 | + Utf8Value filename(isolate, |
| 1162 | + message->GetScriptOrigin().ResourceName()); |
| 1163 | + // (filename):(line) (message) |
| 1164 | + std::stringstream warning; |
| 1165 | + warning << *filename; |
| 1166 | + warning << ":"; |
| 1167 | + warning << message->GetLineNumber(env->context()).FromMaybe(-1); |
| 1168 | + warning << " "; |
| 1169 | + v8::String::Utf8Value msg(isolate, message->Get()); |
| 1170 | + warning << *msg; |
| 1171 | + USE(ProcessEmitWarningGeneric(env, warning.str().c_str(), "V8")); |
| 1172 | + break; |
| 1173 | + } |
| 1174 | + case Isolate::MessageErrorLevel::kMessageError: |
| 1175 | + FatalException(isolate, error, message); |
| 1176 | + break; |
| 1177 | + } |
| 1178 | +} |
| 1179 | + |
1159 | 1180 |
|
1160 | 1181 | static Local<Object> InitModule(Environment* env, |
1161 | 1182 | node_module* mod, |
@@ -2580,7 +2601,9 @@ Isolate* NewIsolate(ArrayBufferAllocator* allocator, uv_loop_t* event_loop) { |
2580 | 2601 | v8_platform.Platform()->RegisterIsolate(isolate, event_loop); |
2581 | 2602 | Isolate::Initialize(isolate, params); |
2582 | 2603 |
|
2583 | | - isolate->AddMessageListener(OnMessage); |
| 2604 | + isolate->AddMessageListenerWithErrorLevel(OnMessage, |
| 2605 | + Isolate::MessageErrorLevel::kMessageError | |
| 2606 | + Isolate::MessageErrorLevel::kMessageWarning); |
2584 | 2607 | isolate->SetAbortOnUncaughtExceptionCallback(ShouldAbortOnUncaughtException); |
2585 | 2608 | isolate->SetMicrotasksPolicy(MicrotasksPolicy::kExplicit); |
2586 | 2609 | isolate->SetFatalErrorHandler(OnFatalError); |
|