我对 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的个数呢?