v8中builtins的初始化

本文详细介绍了V8引擎中builtins的初始化过程,包括如何通过`Builtins::SetUp`函数设置builtins数组,枚举`Name`定义的索引,以及`BuiltinDesc`结构的使用。初始化涉及C++实现的Code、由assemble实现的Code和debugger使用的Code。通过对`BuiltinDesc`数组的赋值,生成并跳转到外部引用的C函数地址,完成内置函数的初始化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

builtins定义于builtins.h,它的实例存在于isolate中,在isolate的init函数中,调用builtins.SetUp函数初始化builtins,builtins内部有一个Object* builtins_[builtin_count],所有的初始化操作,主要就是为了初始化这个对象指针数组,这个数组的每个指针指向的都是一个Code对象,也就是它是一段被编译过的代码。
一.builtins数组的索引
enum Name {
#define DEF_ENUM_C(name, ignore) k##name,
#define DEF_ENUM_A(name, kind, state, extra) k##name,
    BUILTIN_LIST_C(DEF_ENUM_C)
    BUILTIN_LIST_A(DEF_ENUM_A)
    BUILTIN_LIST_DEBUG_A(DEF_ENUM_A)
#undef DEF_ENUM_C
#undef DEF_ENUM_A
    builtin_count
  };
类似以前我们看到的索引定义方式,builtins数组的索引被分成了三组,分别使用BUILTIN_LIST_C,BUILTIN_LIST_A,BUILTIN_LIST_DEBUG_A定义。它们依次表示由C++实现的Code,由assemble实现的Code,由assemble实现的供debugger使用的Code。
二.Builtins::SetUp
void Builtins::SetUp(bool create_heap_objects) {
  ASSERT(!initialized_);
  Isolate* isolate = Isolate::Current();
  Heap* heap = isolate->heap();

  // Create a scope for the handles in the builtins.
  HandleScope scope(isolate);

  1)
  const BuiltinDesc* functions = builtin_function_table.functions();

  // For now we generate builtin adaptor code into a stack-allocated
  // buffer, before copying it into individual code objects. Be careful
  // with alignment, some platforms don't like unaligned code.
  union { int force_alignment; byte buffer[8*KB]; } u;

  // Traverse the list of builtins and generate an adaptor in a
  // separate code object for each one.
  for (int i = 0; i < builtin_count; i++) {
    if (create_heap_objects) {
      MacroAssembler masm(isolate, u.buffer, sizeof u.buffer);
      // Generate the code/adaptor.
      2)
      typedef void (*Generator)(MacroAssembler*, int, BuiltinExtraArguments);
      Generator g = FUNCTION_CAST<Generator>(functions[i].generator);
      // We pass all arguments to the generator, but it may not use all of
      // them.  This works because the first arguments are on top of the
      // stack.
      ASSERT(!masm.has_frame());
      g(&masm, functions[i].name
5: 0x100331ea0 v8::internal::(anonymous namespace)::CaptureStackTrace(v8::internal::Isolate*, v8::internal::Handle<v8::internal::Object>, v8::internal::(anonymous namespace)::CaptureStackTraceOptions) [/Users/lyy_mac/.nvm/versions/node/v12.22.12/bin/node] 16: 0x100332001 v8::internal::Isolate::CaptureAndSetSimpleStackTrace(v8::internal::Handle<v8::internal::JSReceiver>, v8::internal::FrameSkipMode, v8::internal::Handle<v8::internal::Object>) [/Users/lyy_mac/.nvm/versions/node/v12.22.12/bin/node] 17: 0x100344207 v8::internal::ErrorUtils::Construct(v8::internal::Isolate*, v8::internal::Handle<v8::internal::JSFunction>, v8::internal::Handle<v8::internal::Object>, v8::internal::Handle<v8::internal::Object>, v8::internal::FrameSkipMode, v8::internal::Handle<v8::internal::Object>, v8::internal::ErrorUtils::StackTraceCollection) [/Users/lyy_mac/.nvm/versions/node/v12.22.12/bin/node] 18: 0x10034449c v8::internal::ErrorUtils::MakeGenericError(v8::internal::Isolate*, v8::internal::Handle<v8::internal::JSFunction>, v8::internal::MessageTemplate, v8::internal::Handle<v8::internal::Object>, v8::internal::Handle<v8::internal::Object>, v8::internal::Handle<v8::internal::Object>, v8::internal::FrameSkipMode) [/Users/lyy_mac/.nvm/versions/node/v12.22.12/bin/node] 19: 0x1003670fd v8::internal::Factory::NewError(v8::internal::Handle<v8::internal::JSFunction>, v8::internal::MessageTemplate, v8::internal::Handle<v8::internal::Object>, v8::internal::Handle<v8::internal::Object>, v8::internal::Handle<v8::internal::Object>) [/Users/lyy_mac/.nvm/versions/node/v12.22.12/bin/node] 20: 0x1006ae227 v8::internal::Runtime_ThrowCalledNonCallable(int, unsigned long*, v8::internal::Isolate*) [/Users/lyy_mac/.nvm/versions/node/v12.22.12/bin/node] 21: 0x100a050d9 Builtins_CEntry_Return1_DontSaveFPRegs_ArgvOnStack_NoBuiltinExit [/Users/lyy_mac/.nvm/versions/node/v12.22.12/bin/node]
03-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值