NodeJS 源代码找不到 set_immediate_callback_function 定义
NodeJS source code cannot find set_immediate_callback_function definition
我想了解 Node 的内部工作原理。我对检查阶段非常感兴趣,但无法理解该阶段队列是如何处理的。现在我无法理解 set_immediate_callback_function 的定义位置。这种方法是环境的一部分 class 但我看不到它。
此方法在设置阶段调用:
void SetupTimers(const FunctionCallbackInfo<Value>& args) {
CHECK(args[0]->IsFunction());
CHECK(args[1]->IsFunction());
auto env = Environment::GetCurrent(args);
env->set_immediate_callback_function(args[0].As<Function>());
env->set_timers_callback_function(args[1].As<Function>());
}
set_immediate_callback_function
是由预处理器通过一种称为 X-Macros 的技术生成的。
让我们分解一下。您指的是 this code:
void SetupTimers(const FunctionCallbackInfo<Value>& args) {
CHECK(args[0]->IsFunction());
CHECK(args[1]->IsFunction());
auto env = Environment::GetCurrent(args);
env->set_immediate_callback_function(args[0].As<Function>());
env->set_timers_callback_function(args[1].As<Function>());
}
Grepping set_immediate_callback_function
没有显示任何内容。但是如果你 grep for immediate_callback_function
(没有 set_
),你会发现 this here:
#define ENVIRONMENT_STRONG_PERSISTENT_VALUES(V) \
...
V(immediate_callback_function, v8::Function) \
这种模式通常被称为X-Macros。按照跟踪,您可以在此处找到 ENVIRONMENT_STRONG_PERSISTENT_VALUES
:
#define V(PropertyName, TypeName) \
inline v8::Local<TypeName> PropertyName() const; \
inline void set_ ## PropertyName(v8::Local<TypeName> value);
ENVIRONMENT_STRONG_PERSISTENT_VALUES(V)
ENVIRONMENT_STRONG_PERSISTENT_TEMPLATES(V)
#undef V
注意这一行:
inline void set_ ## PropertyName(v8::Local<TypeName> value);
PropertyName 是 immediate_callback_function
并且 ##
是字符串连接。所以,最后这就是 set_immediate_callback_function
.
的由来
对于精确的扩展,您需要 运行 预处理器。在这一点之后,我发现很难跟上我头脑中的扩展。它应该以这样的结尾:
inline v8::Local<v8::Function> immediate_callback_function() const;
inline void set_immediate_callback_function(v8::Local<v8::Function> value);
看起来 NodeJs 代码库使用 C 预处理器来生成类似 属性 的机制。在 C 和 C++ 中,不直接支持属性,我假设他们想避免重复代码。这就是他们通过预处理器使用代码生成的原因。
(X-Macros 是一种不应该被过度使用的技术。但是很难决定在哪里画线。正如你所看到的,它使得对代码的推理变得更加困难。另一方面,手动代码重复可能更容易出错和冗长。)
我想了解 Node 的内部工作原理。我对检查阶段非常感兴趣,但无法理解该阶段队列是如何处理的。现在我无法理解 set_immediate_callback_function 的定义位置。这种方法是环境的一部分 class 但我看不到它。
此方法在设置阶段调用:
void SetupTimers(const FunctionCallbackInfo<Value>& args) {
CHECK(args[0]->IsFunction());
CHECK(args[1]->IsFunction());
auto env = Environment::GetCurrent(args);
env->set_immediate_callback_function(args[0].As<Function>());
env->set_timers_callback_function(args[1].As<Function>());
}
set_immediate_callback_function
是由预处理器通过一种称为 X-Macros 的技术生成的。
让我们分解一下。您指的是 this code:
void SetupTimers(const FunctionCallbackInfo<Value>& args) {
CHECK(args[0]->IsFunction());
CHECK(args[1]->IsFunction());
auto env = Environment::GetCurrent(args);
env->set_immediate_callback_function(args[0].As<Function>());
env->set_timers_callback_function(args[1].As<Function>());
}
Grepping set_immediate_callback_function
没有显示任何内容。但是如果你 grep for immediate_callback_function
(没有 set_
),你会发现 this here:
#define ENVIRONMENT_STRONG_PERSISTENT_VALUES(V) \
...
V(immediate_callback_function, v8::Function) \
这种模式通常被称为X-Macros。按照跟踪,您可以在此处找到 ENVIRONMENT_STRONG_PERSISTENT_VALUES
:
#define V(PropertyName, TypeName) \
inline v8::Local<TypeName> PropertyName() const; \
inline void set_ ## PropertyName(v8::Local<TypeName> value);
ENVIRONMENT_STRONG_PERSISTENT_VALUES(V)
ENVIRONMENT_STRONG_PERSISTENT_TEMPLATES(V)
#undef V
注意这一行:
inline void set_ ## PropertyName(v8::Local<TypeName> value);
PropertyName 是 immediate_callback_function
并且 ##
是字符串连接。所以,最后这就是 set_immediate_callback_function
.
对于精确的扩展,您需要 运行 预处理器。在这一点之后,我发现很难跟上我头脑中的扩展。它应该以这样的结尾:
inline v8::Local<v8::Function> immediate_callback_function() const;
inline void set_immediate_callback_function(v8::Local<v8::Function> value);
看起来 NodeJs 代码库使用 C 预处理器来生成类似 属性 的机制。在 C 和 C++ 中,不直接支持属性,我假设他们想避免重复代码。这就是他们通过预处理器使用代码生成的原因。
(X-Macros 是一种不应该被过度使用的技术。但是很难决定在哪里画线。正如你所看到的,它使得对代码的推理变得更加困难。另一方面,手动代码重复可能更容易出错和冗长。)