0

我对 V8 源代码中的某些内容感到困惑。

objects.h中,有 enum InstanceType 描述了实例的类型。并且一部分是为JS类型定义的,比如日期和数组。

enum InstanceType {
  ...

  // All the following types are subtypes of JSReceiver, which corresponds to
  // objects in the JS sense. The first and the last type in this range are
  // the two forms of function. This organization enables using the same
  // compares for checking the JS_RECEIVER/SPEC_OBJECT range and the
  // NONCALLABLE_JS_OBJECT range.
  JS_FUNCTION_PROXY_TYPE,  // FIRST_JS_RECEIVER_TYPE, FIRST_JS_PROXY_TYPE
  JS_PROXY_TYPE,  // LAST_JS_PROXY_TYPE

  JS_VALUE_TYPE,  // FIRST_JS_OBJECT_TYPE
  JS_DATE_TYPE,
  JS_OBJECT_TYPE,
  JS_CONTEXT_EXTENSION_OBJECT_TYPE,
  JS_MODULE_TYPE,
  JS_GLOBAL_OBJECT_TYPE,
  JS_BUILTINS_OBJECT_TYPE,
  JS_GLOBAL_PROXY_TYPE,
  JS_ARRAY_TYPE,
  JS_SET_TYPE,
  JS_MAP_TYPE,
  JS_WEAK_MAP_TYPE,

  JS_REGEXP_TYPE,

  JS_FUNCTION_TYPE,  // LAST_JS_OBJECT_TYPE, LAST_JS_RECEIVER_TYPE

  ...
};

然后我看到了 JS_OBJECT_TYPE 的静态检查。这里 Internals::kJSObjectType 在 v8.h 中定义为 0xaa。

STATIC_CHECK(JS_OBJECT_TYPE == Internals::kJSObjectType);

那么,InstanceType 中的 TYPE 是如何排序的呢?为什么 JS_DATE_TYPE 在 JS_OBJECT_TYPE 之前, JS_ARRAY_TYPE 在之后?

如果是任意排序,V8为什么要检查JS_OBJECT_TYPE的个数呢?

4

1 回答 1

1

主要原因是当您在JS_VALUE_TYPEor上使用索引运算符时正确落入运行时JS_OBJECT_TYPE,生成的代码无法正确处理它。见GenerateKeyedLoadReceiverCheck

签入v8.h验证从 V8 手动导出并通过此公共 API 文件中的内联函数使用的常量与内部常量匹配。v8.h不能依赖于内部,objects.h因此它具有重复的这些常量。如果没有检查,如果有人更改objects.h但忘记更新,这些内联函数将开始以奇怪的方式中断v8.h

于 2013-02-27T17:14:42.747 回答