V8のソースコードに何か混乱しています。
objects.hには、インスタンスのタイプを説明する列挙型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);
では、TYPEはInstanceTypeでどのように順序付けられますか?JS_OBJECT_TYPEの前にJS_DATE_TYPEがあり、その後にJS_ARRAY_TYPEがあるのはなぜですか?
任意に並べ替えた場合、V8がJS_OBJECT_TYPEの番号をチェックするのはなぜですか?