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 是一种不应该被过度使用的技术。但是很难决定在哪里画线。正如你所看到的,它使得对代码的推理变得更加困难。另一方面,手动代码重复可能更容易出错和冗长。)