Skip to content

Commit 8980483

Browse files
committed
src: add C++ ProcessEmitWarningSync()
1 parent c4e2ad1 commit 8980483

File tree

5 files changed

+34
-1
lines changed

5 files changed

+34
-1
lines changed

lib/internal/bootstrap/node.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -297,8 +297,9 @@ ObjectDefineProperty(process, 'features', {
297297
hasUncaughtExceptionCaptureCallback;
298298
}
299299

300-
const { emitWarning } = require('internal/process/warning');
300+
const { emitWarning, emitWarningSync } = require('internal/process/warning');
301301
process.emitWarning = emitWarning;
302+
internalBinding('process_methods').setEmitWarningSync(emitWarningSync);
302303

303304
// We initialize the tick callbacks and the timer callbacks last during
304305
// bootstrap to make sure that any operation done before this are synchronous.

src/env_properties.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -434,6 +434,7 @@
434434
V(performance_entry_callback, v8::Function) \
435435
V(prepare_stack_trace_callback, v8::Function) \
436436
V(process_object, v8::Object) \
437+
V(process_emit_warning_sync, v8::Function) \
437438
V(primordials, v8::Object) \
438439
V(primordials_safe_map_prototype_object, v8::Object) \
439440
V(primordials_safe_set_prototype_object, v8::Object) \

src/node_process.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ template <typename... Args>
3636
inline v8::Maybe<bool> ProcessEmitWarning(Environment* env,
3737
const char* fmt,
3838
Args&&... args);
39+
40+
v8::Maybe<bool> ProcessEmitWarningSync(Environment* env, const char* message);
3941
v8::Maybe<bool> ProcessEmitExperimentalWarning(Environment* env,
4042
const char* warning);
4143
v8::Maybe<bool> ProcessEmitDeprecationWarning(Environment* env,

src/node_process_events.cc

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,24 @@ using v8::Object;
1818
using v8::String;
1919
using v8::Value;
2020

21+
Maybe<bool> ProcessEmitWarningSync(Environment* env, const char* message) {
22+
Isolate* isolate = env->isolate();
23+
Local<Context> context = env->context();
24+
Local<String> message_string = OneByteString(isolate, message);
25+
26+
Local<Value> argv[] = {message_string};
27+
Local<Function> emit_function = env->process_emit_warning_sync();
28+
// If this fails, this is called too early - before the bootstrap is even
29+
// finished.
30+
CHECK(!emit_function.IsEmpty());
31+
if (emit_function.As<Function>()
32+
->Call(context, v8::Undefined(isolate), arraysize(argv), argv)
33+
.IsEmpty()) {
34+
return Nothing<bool>();
35+
}
36+
return Just(true);
37+
}
38+
2139
MaybeLocal<Value> ProcessEmit(Environment* env,
2240
const char* event,
2341
Local<Value> message) {

src/node_process_methods.cc

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ using v8::ArrayBuffer;
4141
using v8::CFunction;
4242
using v8::Context;
4343
using v8::Float64Array;
44+
using v8::Function;
4445
using v8::FunctionCallbackInfo;
4546
using v8::HeapStatistics;
4647
using v8::Integer;
@@ -619,6 +620,12 @@ void BindingData::Deserialize(Local<Context> context,
619620
CHECK_NOT_NULL(binding);
620621
}
621622

623+
static void SetEmitWarningSync(const FunctionCallbackInfo<Value>& args) {
624+
CHECK(args[0]->IsFunction());
625+
Environment* env = Environment::GetCurrent(args);
626+
env->set_process_emit_warning_sync(args[0].As<Function>());
627+
}
628+
622629
static void CreatePerIsolateProperties(IsolateData* isolate_data,
623630
Local<ObjectTemplate> target) {
624631
Isolate* isolate = isolate_data->isolate();
@@ -651,6 +658,8 @@ static void CreatePerIsolateProperties(IsolateData* isolate_data,
651658
SetMethod(isolate, target, "patchProcessObject", PatchProcessObject);
652659

653660
SetMethod(isolate, target, "loadEnvFile", LoadEnvFile);
661+
662+
SetMethod(isolate, target, "setEmitWarningSync", SetEmitWarningSync);
654663
}
655664

656665
static void CreatePerContextProperties(Local<Object> target,
@@ -690,6 +699,8 @@ void RegisterExternalReferences(ExternalReferenceRegistry* registry) {
690699
registry->Register(PatchProcessObject);
691700

692701
registry->Register(LoadEnvFile);
702+
703+
registry->Register(SetEmitWarningSync);
693704
}
694705

695706
} // namespace process

0 commit comments

Comments
 (0)