0

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の番号をチェックするのはなぜですか?

4

1 に答える 1

1

JS_VALUE_TYPE主な理由は、またはでインデックス演算子を使用すると、ランタイムに正しく落ちるためですJS_OBJECT_TYPE。生成されたコードはそれを正しく処理しません。を参照してくださいGenerateKeyedLoadReceiverCheck

チェックインでv8.hは、V8 から手動でエクスポートされ、このパブリック API ファイルのインライン関数で使用される定数が内部定数と一致することを確認しています。v8.h内部に依存できないため、objects.hこれらの定数が複製されています。チェックを行わないと、インライン化された関数は、誰かが変更objects.hしても update を忘れると、おかしな方法で機能しなくなりますv8.h

于 2013-02-27T17:14:42.747 に答える