次の方法で共有


JavaScript 拡張機能のネイティブ デバッガー オブジェクト - デバッガー オブジェクトの詳細

このトピックでは、JavaScript 拡張機能でのネイティブ デバッガー オブジェクトの使用に関する追加の詳細について説明します。

ネイティブ デバッガー オブジェクトは、デバッガー環境のさまざまなコンストラクトと動作を表します。 オブジェクトを JavaScript 拡張機能に渡したり、取得したりして、デバッガーの状態を操作できます。

デバッガー オブジェクトの JavaScript 拡張機能の詳細については、「 JavaScript 拡張機能のネイティブ デバッガー オブジェクト」を参照してください。

JavaScript の操作に関する一般的な情報については、「 JavaScript デバッガー スクリプト」を参照してください。

たとえば、JavaScript スクリプトや拡張機能など、デバッガー チームは https://github.com/Microsoft/WinDbg-Samples で GitHub リポジトリをホストします。

JavaScript 拡張機能のデバッガー オブジェクト

ネイティブ オブジェクトの渡し

デバッガー オブジェクトは、さまざまな方法で JavaScript 拡張機能に渡したり、取得したりできます。

  • これらは JavaScript 関数またはメソッドに渡すことができます
  • JavaScript プロトタイプのインスタンス オブジェクトを指定できます (ビジュアライザーなど)。
  • これらは、ネイティブ デバッガー オブジェクトを作成するように設計されたホスト メソッドから返すことができます
  • これらは、デバッガーのネイティブ オブジェクトを作成するように設計されたホスト メソッドから返すことができます

JavaScript 拡張機能に渡されるデバッガー オブジェクトには、このセクションで説明する一連の機能があります。

  • プロパティー・アクセス
  • 予定名
  • ネイティブ デバッガー オブジェクトに関連する特殊な型
  • 追加の属性

プロパティ アクセス

JavaScript プロバイダー自体によって配置されるオブジェクトにはいくつかのプロパティがありますが、JavaScript に入るネイティブ オブジェクトのプロパティの大部分はデータ モデルによって提供されます。 つまり、object.propertyName または object[propertyName] ---プロパティ アクセスの場合、次の処理が行われます。

  • propertyName が JavaScript プロバイダー自体によってオブジェクトに投影されるプロパティの名前である場合は、最初にこのプロパティに解決されます。然も無くば
  • propertyName がデータモデル(別のビジュアライザー)によってオブジェクトに投影されるキーの名前である場合、優先してこの名前が解決されます。そうでない場合は、他の手段で解決されます。
  • propertyName がネイティブオブジェクトのフィールド名である場合、この名前は3番目に解決されます。それ以外の場合は
  • オブジェクトがポインターの場合、ポインターは逆参照され、上記のサイクルは続行されます (逆参照されたオブジェクトの投影プロパティの後にキーが続き、ネイティブ フィールドが続きます)

JavaScript でのプロパティ アクセスの通常の手段 -- object.propertyName と object[propertyName] -- は、デバッガー内の 'dx' コマンドと同様に、オブジェクトの基になるネイティブ フィールドにアクセスします。

予測された名前

次のプロパティ (およびメソッド) は、JavaScript を入力するネイティブ オブジェクトに投影されます。

メソッド 署名 説明
hostContext プロパティ オブジェクトが含まれているコンテキスト (アドレス空間、デバッグ ターゲットなど) を表すオブジェクトを返します。
ターゲットロケーション プロパティ オブジェクトがアドレス空間内のどこにあるかを抽象化したオブジェクト (仮想アドレス、レジスタ、サブレジスタなど) を返します。
ターゲットサイズ プロパティ オブジェクトのサイズを返します (実質的には sizeof(<TYPE OF OBJECT>)
親モデルを追加 .addParentModel(object) 新しい親モデル (JavaScript プロトタイプと同じデータ モデル側) をオブジェクトに追加します
親モデル削除 .removeParentModel(object) オブジェクトから特定の親モデルを削除します。
runtimeTypedObject プロパティ オブジェクトに対して分析を実行し、ランタイム (最も派生した) 型に変換しようとします
ターゲットタイプ プロパティ JavaScript 拡張機能は、基になる言語の型システムに直接アクセスできます。 このアクセスは、型オブジェクトの概念によって表されます。 詳細については、「JavaScript 拡張機能のネイティブ デバッガー オブジェクト - 型オブジェクト」を参照してください。

オブジェクトがポインターの場合、次のプロパティ (およびメソッド) が JavaScript に入るポインターに投影されます。

プロパティ名 署名 説明
追加する .add(value) ポインターと指定した値の間でポインターの算術加算を実行します。
住所 プロパティ ポインターのアドレスを 64 ビットの序数オブジェクト (ライブラリ型) として返します。
逆参照する .dereference() ポインターを逆参照し、基になるオブジェクトを返します。
isNull プロパティ ポインター値が nullptr (0) かどうかを返します。

ネイティブ デバッガー オブジェクトに関連する特殊な型

ロケーションオブジェクト

ネイティブ オブジェクトの targetLocation プロパティから返される location オブジェクトには、次のプロパティ (およびメソッド) が含まれています。

プロパティ名 署名 説明
追加する .add(value) 位置に絶対バイト オフセットを追加します。
減算 .subtract(value) 位置から絶対バイト オフセットを減算します。

その他の属性

Iterability

データ モデルで反復可能と認識されるオブジェクト (ネイティブ配列であるか、ビジュアライザー (NatVis など) を持ち、それを反復可能にする)、反復子関数 (ES6 標準 Symbol.iterator を使用してインデックス付け) が配置されます。 つまり、次のように JavaScript でネイティブ オブジェクトを反復処理できます。

function iterateNative(nativeObject)
{
    for (var val of nativeObject)
    {
        // 
        // val will contain each element iterated from the native object.  This would be each element of an array,
        // each element of an STL structure which is made iterable through NatVis, each element of a data structure
        // which has a JavaScript iterator accessible via [Symbol.iterator], or each element of something
        // which is made iterable via support of IIterableConcept in C/C++.
        //
    }
}

インデクサービリティ

序数 (ネイティブ配列など) を介して 1 つの次元でインデックス可能と認識されるオブジェクトは、標準のプロパティ アクセス演算子 -- object[index] を使用して JavaScript でインデックスを作成できます。 オブジェクトが名前でインデックス可能であるか、複数のディメンションでインデックスを作成できる場合、javaScript コードがインデクサーを利用できるように、getValueAt メソッドと setValueAt メソッドがオブジェクトに投影されます。

function indexNative(nativeArray)
{
    var first = nativeArray[0];
}

文字列変換

IStringDisplayableConcept または NatVis DisplayString 要素のサポートによる表示文字列変換を持つネイティブ オブジェクトは、標準の JavaScript toString メソッドを使用してその文字列変換にアクセスできます。

function stringifyNative(nativeObject)
{
    var myString = nativeObject.toString();
}

ネイティブ デバッガー オブジェクトの作成

前述のように、JavaScript スクリプトは、いくつかの方法のいずれかで JavaScript に渡すことでネイティブ オブジェクトにアクセスできます。また、ホスト ライブラリの呼び出しを通じて作成することもできます。 ネイティブ デバッガー オブジェクトを作成するには、次の関数を使用します。

メソッド 署名 説明

host.getModuleSymbol

getModuleSymbol(moduleName, symbolName, [contextInheritor])

getModuleSymbol(moduleName, symbolName, [typeName], [contextInheritor]) - モジュール名とシンボル名を指定してモジュールシンボルを取得します。

特定のモジュール内のグローバル シンボルのオブジェクトを返します。 モジュール名とシンボル名は文字列です。

省略可能な contextInheritor 引数が指定されている場合、モジュールとシンボルは、渡されたオブジェクトと同じコンテキスト (アドレス空間、デバッグ ターゲット) 内で検索されます。 引数が指定されていない場合、モジュールとシンボルはデバッガーの現在のコンテキストで検索されます。 1 回限りのテスト スクリプトではない JavaScript 拡張機能は、常に明示的なコンテキストを提供する必要があります。

省略可能な typeName 引数が指定されている場合、シンボルは渡された型であると見なされ、シンボルで示される型は無視されます。 モジュールのパブリック シンボルで動作することを想定している呼び出し元は、常に明示的な型名を指定する必要があることに注意してください。

ホスト.シンボルを含むモジュールを取得する

getModuleContainingSymbol(location, [contextInheritor])

指定されたアドレスを含むシンボル (関数やデータなど) を返します。 これは、指定されたアドレスを含むモジュールの プライベート シンボルがある場合にのみ機能することに注意してください。

省略可能な contextInheritor 引数が指定されている場合、モジュールとシンボルは、渡されたオブジェクトと同じコンテキスト (アドレス空間、デバッグ ターゲット) 内で検索されます。 引数が指定されていない場合、モジュールとシンボルはデバッガーの現在のコンテキストで検索されます。 1 回限りのテスト スクリプトではない JavaScript 拡張機能は、常に明示的なコンテキストを提供する必要があります。

host.createPointerObject

createPointerObject(address, moduleName, typeName, [contextInheritor]) ポインターオブジェクトを作成する関数です。

指定したアドレスまたは場所にポインター オブジェクトを作成します。 モジュール名と型名は文字列です。

省略可能な contextInheritor 引数が指定されている場合、モジュールとシンボルは、渡されたオブジェクトと同じコンテキスト (アドレス空間、デバッグ ターゲット) 内で検索されます。 引数が指定されていない場合、モジュールとシンボルはデバッガーの現在のコンテキストで検索されます。 1 回限りのテスト スクリプトではない JavaScript 拡張機能は、常に明示的なコンテキストを提供する必要があります。

host.createTypedObject (型付きオブジェクトを作成)

createTypedObject(location, moduleName, typeName, [contextInheritor])

指定した場所にあるデバッグ ターゲットのアドレス空間内にネイティブ型指定されたオブジェクトを表すオブジェクトを作成します。 モジュール名と型名は文字列です。

省略可能な contextInheritor 引数が指定されている場合、モジュールとシンボルは、渡されたオブジェクトと同じコンテキスト (アドレス空間、デバッグ ターゲット) 内で検索されます。 引数が指定されていない場合、モジュールとシンボルはデバッガーの現在のコンテキストで検索されます。 1 回限りのテスト スクリプトではない JavaScript 拡張機能は、常に明示的なコンテキストを提供する必要があります。

JavaScript 拡張機能のホスト API

JavaScript プロバイダーは、ホストと呼ばれるオブジェクトを、読み込むすべてのスクリプトのグローバル名前空間に挿入します。 このオブジェクトは、スクリプトの重要な機能へのアクセスと、デバッガーの名前空間へのアクセスを提供します。 これは 2 つのフェーズで設定されます。

  • フェーズ 1: スクリプトを実行する前に、ホスト オブジェクトには、スクリプト自体を初期化してその拡張ポイント (プロデューサーとコンシューマーの両方) を登録するために必要な最小限の機能セットのみが含まれます。 ルートコードと初期化コードは、デバッグ ターゲットの状態を操作したり、複雑な操作を実行したりするためのものではありません。そのため、initializeScript メソッドが戻るまで、ホストは完全には設定されません。

  • フェーズ 2: initializeScript が返されると、デバッグ ターゲットの状態を操作するために必要なすべてのものがホスト オブジェクトに設定されます。

ホスト オブジェクト レベル

いくつかの重要な機能は、ホスト オブジェクトのすぐ下にあります。 残りはサブ名前空間です。 名前空間には、次のものが含まれます。

Namespace 説明
診断 スクリプト コードの診断とデバッグを支援する機能
メモリ デバッグ ターゲット内でメモリの読み取りと書き込みを有効にする機能

ルート レベル

ホスト オブジェクト内で直接、次のプロパティ、メソッド、およびコンストラクターを見つけることができます。

名前 署名 現在のフェーズ 説明
createPointerObject

createPointerObject(address, moduleName, typeName, [contextInheritor])

2 指定したアドレスまたは場所にポインター オブジェクトを作成します。 モジュール名と型名は文字列です。 省略可能な contextInheritor 引数は、getModuleSymbol と同様に動作します。
createTypedObject

createTypedObject(location, moduleName, typeName, [contextInheritor])

2 指定した場所にあるデバッグ ターゲットのアドレス空間内にネイティブ型指定されたオブジェクトを表すオブジェクトを作成します。 モジュール名と型名は文字列です。 省略可能な contextInheritor 引数は、getModuleSymbol と同様に動作します。
現在のプロセス

プロパティ

2 デバッガーの現在のプロセスを表すオブジェクトを返します。
現在のセッション

プロパティ

2 デバッグ中のデバッガーの現在のセッション (ターゲット、ダンプなど) を表すオブジェクトを返します。
currentThread(カレントスレッド)

プロパティ

2 デバッガーの現在のスレッドを表すオブジェクトを返します。
evaluateExpression

evaluateExpression(expression, [contextInheritor])

2 これにより、デバッグ ホストが呼び出され、デバッグ ターゲットの言語のみを使用して式が評価されます。 省略可能な contextInheritor 引数が指定されている場合、式は引数のコンテキスト (アドレス空間やデバッグ ターゲットなど) で評価されます。それ以外の場合は、デバッガーの現在のコンテキストで評価されます
コンテキスト内で式を評価する

コンテキストで式を評価する(context, expression)

2 これにより、デバッグ ホストが呼び出され、デバッグ ターゲットの言語のみを使用して式が評価されます。 コンテキスト引数は、評価に使用する暗黙的なこのポインターを示します。 式は、 コンテキスト引数によって 示されるコンテキスト (アドレス空間やデバッグ ターゲットなど) で評価されます。
getModuleSymbol

getModuleSymbol(moduleName, symbolName, [contextInheritor])

2 特定のモジュール内のグローバル シンボルのオブジェクトを返します。 モジュール名とシンボル名は文字列です。 省略可能な contextInheritor 引数が指定されている場合、モジュールとシンボルは、渡されたオブジェクトと同じコンテキスト (アドレス空間、デバッグ ターゲット) 内で検索されます。 引数が指定されていない場合、モジュールとシンボルはデバッガーの現在のコンテキストで検索されます。 1 回限りのスクリプトではない JavaScript 拡張機能は、常に明示的なコンテキストを提供する必要があります
getNamedModel

getNamedModel(modelName)

2 指定された名前に対して登録されたデータ モデルを返します。 まだ登録されていない名前に対してこれを呼び出すのは完全に有効であることに注意してください。 これにより、その名前のスタブが作成され、登録時にスタブの操作が実際のオブジェクトに対して行われます
インデックス値

new indexedValue(value, indicies)

2 JavaScript イテレータから返されるオブジェクトのコンストラクターで、反復された値に既定のインデックスのセットを割り当てるためのものです。 インデックスのセットは、JavaScript 配列として表現する必要があります。
Int64

new Int64(value, [highValue])

1 これにより、ライブラリ Int64 型が構築されます。 単一引数のバージョンは、Int64 (変換なし) にパックできる任意の値を受け取り、そのような値に配置します。 省略可能な 2 番目の引数を指定すると、最初の引数の変換が下位 32 ビットにパックされ、2 番目の引数の変換が上位 32 ビットにパックされます。
namedModelParent

new namedModelParent(object, name)

1 initializeScript から返される配列に配置することを目的としたオブジェクトのコンストラクター。これは、指定された名前を持つデータ モデルのデータ モデルの親拡張として JavaScript プロトタイプまたは ES6 クラスを使用することを表します
名前付きモデル登録

new namedModelRegistration(object, name)(オブジェクトと名前を使用するモデルの登録)

1 initializeScript から返される配列に配置することを目的としたオブジェクトのコンストラクター。これは、JavaScript プロトタイプまたは ES6 クラスを既知の名前を介してデータ モデルとして登録されることを表し、他の拡張機能が検索および拡張できるようにします。
名前空間

プロパティ

2 デバッガーのルート名前空間に直接アクセスできるようにします。 たとえば、host.namespace.Debugger.Sessions.First() を使用して、最初のデバッグ ターゲットのプロセス リストにアクセスできます。このプロパティを使用するプロセス
registerNamedModel

registerNamedModel(object, modelName)

2 これにより、JavaScript プロトタイプまたは ES6 クラスが、指定された名前のデータ モデルとして登録されます。 このような登録により、プロトタイプまたはクラスを他のスクリプトや他のデバッガー拡張機能によって配置および拡張できます。 スクリプトでは、これを命令的に行うのではなく、initializeScript メソッドから namedModelRegistration オブジェクトを返す方が好ましいことに注意してください。 変更を強制的に行うスクリプトは、クリーンアップするために initializeScript メソッドを持っている必要があります。
registerExtensionForTypeSignature

registerExtensionForTypeSignature(オブジェクト, タイプシグネチャ)

2 これにより、指定された型シグネチャによって指定されたネイティブ型の拡張データ モデルとして JavaScript プロトタイプまたは ES6 クラスが登録されます。 スクリプトは、これを命令的に行うのではなく、initializeScript メソッドから typeSignatureExtension オブジェクトを返す必要があることに注意してください。 変更を強制的に行うスクリプトは、クリーンアップするために initializeScript メソッドを持っている必要があります。
registerPrototypeForTypeSignature

registerPrototypeForTypeSignature(object, typeSignature)関数 (型シグネチャのプロトタイプを登録する関数)

2 これにより、指定された型シグネチャによって指定されたネイティブ型の正規データ モデル (ビジュアライザーなど) として JavaScript プロトタイプまたは ES6 クラスが登録されます。 スクリプトは、これを命令的に行うのではなく、initializeScript メソッドから typeSignatureRegistration オブジェクトを返す必要があることに注意してください。 変更を強制的に行うスクリプトは、クリーンアップするために uninitializeScriptメソッドを使用する必要があります。
parseInt64

parseInt64(string, [radix])

1 このメソッドは、代わりにライブラリ Int64 型を返す点を除き、標準の JavaScript parseInt メソッドと同様に動作します。 基数が指定されている場合、解析は、示されているように 2進数、8進数、10進数、または16進数で行われます。
タイプシグネチャエクステンション

new typeSignatureExtension(object, typeSignature, [moduleName], [minVersion], [maxVersion])

1 initializeScript から返される配列に配置することを目的としたオブジェクトのコンストラクター。これは、 JavaScript プロトタイプまたは ES6 クラスによって型シグネチャによって記述されたネイティブ型の拡張を表します。 このような登録は、シグネチャを完全に引き継ぐのではなく、シグネチャに一致する任意の型のデバッガーの視覚化に "フィールドを追加" します。 オプションのモジュール名とバージョンにより、登録を制限できます。 バージョンは、"1.2.3.4" スタイル文字列として指定されます。
タイプシグネチャ登録

new typeSignatureRegistration(object, typeSignature, [moduleName], [minVersion], [maxVersion])

1 initializeScript から返される配列に配置することを目的としたオブジェクトのコンストラクター。これは、ネイティブ型シグネチャに対する JavaScript プロトタイプまたは ES6 クラスの正規の登録を表します。 このような登録は、シグネチャに一致する任意の型に対するデバッガーの視覚化を単に拡張するだけでなく「取り込む」。 オプションのモジュール名とバージョンにより、登録を制限できます。 バージョンは、"1.2.3.4" スタイル文字列として指定されます。
名前付きモデルの登録解除

名前付きモデルを登録解除する (unregisterNamedModel(modelName))

2 これにより、指定された名前による参照からデータ モデルの登録が解除され、registerNamedModel によって実行されたすべての操作が元に戻されます。
unregisterExtensionForTypeSignature

unregisterExtensionForTypeSignature(object, typeSignature, [moduleName], [minVersion], [maxVersion])

2 これにより、JavaScript プロトタイプまたは ES6 クラスが、指定された型シグネチャによって指定されたネイティブ型の拡張データ モデルから登録解除されます。 registerExtensionForTypeSignature の論理的な処理を元に戻します。 スクリプトは、これを命令的に行うのではなく、initializeScript メソッドから typeSignatureExtension オブジェクトを返す必要があることに注意してください。 変更を強制的に行うスクリプトは、クリーンアップするために initializeScript メソッドを持っている必要があります。 オプションのモジュール名とバージョンにより、登録を制限できます。 バージョンは、"1.2.3.4" スタイル文字列として指定されます。
unregisterPrototypeForTypeSignature

型署名に対するプロトタイプの登録解除(object, typeSignature, [moduleName], [minVersion], [maxVersion])

2 これにより、JavaScript プロトタイプまたは ES6 クラスが、指定された型シグネチャによって指定されたネイティブ型の正規データ モデル (ビジュアライザーなど) に登録解除されます。 registerPrototypeForTypeSignature の論理的な取り消し操作です。 スクリプトは、これを命令的に行うのではなく、initializeScript メソッドから typeSignatureRegistration オブジェクトを返す必要があることに注意してください。 変更を強制的に行うスクリプトは、クリーンアップするために uninitializeScript メソッドを使用する必要があります。 オプションのモジュール名とバージョンにより、登録を制限できます。 バージョンは、"1.2.3.4" スタイル文字列として指定されます。

診断機能

ホスト オブジェクトの診断サブ名前空間には、次のものが含まれます。

名前 署名 現在のフェーズ 説明
debugLog debugLog(object...) 1 これにより、スクリプト拡張機能に対する printf スタイルのデバッグが提供されます。 現時点では、debugLog からの出力はデバッガーの出力コンソールにルーティングされます。 後の時点で、この出力のルーティングに柔軟性を提供する計画があります。 注: これは、ユーザー出力をコンソールに出力する手段として使用しないでください。 将来、そこにルーティングされない可能性があります。

メモリ機能

ホスト オブジェクトのメモリ サブ名前空間には、次のものが含まれています。

名前 署名 現在のフェーズ 説明
readMemoryValues (メモリ値を読み取る)

readMemoryValues(location, numElements, [elementSize], [isSigned], [contextInheritor])(位置、要素数、[要素サイズ]、[符号付きか]、[コンテキスト継承者])

2 これにより、デバッグ ターゲットのアドレス空間から値の生の配列が読み取られ、このメモリのビューの上に型指定された配列が配置されます。 指定される場所には、アドレス (64 ビット値)、場所オブジェクト、またはネイティブ ポインターを指定できます。 配列のサイズは numElements 引数で示されます。 配列の各要素のサイズ (および型) は、省略可能な elementSize 引数と isSigned 引数によって指定されます。 このような引数が指定されていない場合、既定値は byte (unsigned / 1 byte) です。 省略可能な contextInheritor 引数を指定すると、引数によって示されるコンテキスト (アドレス空間やデバッグ ターゲットなど) でメモリが読み取られます。それ以外の場合は、デバッガーの現在のコンテキストから読み取られます。 このメソッドを 8 ビット、16 ビット、32 ビットの値で使用すると、読み取りメモリ上に高速型指定ビューが配置されることに注意してください。 64 ビット値に対してこのメソッドを使用すると、64 ビット ライブラリ型の配列が構築され、大幅にコストが高くなります。
文字列を読み込む関数「readString」

readString(位置, [コンテキストインヘリター])

readString(location, [length], [contextInheritor])

2 これにより、デバッグ ターゲットのアドレス空間から狭い (現在のコード ページ) 文字列が読み取られ、UTF-16 に変換され、結果が JavaScript 文字列として返されます。 メモリを読み取ることができなかった場合は、例外がスローされる可能性があります。 指定する場所には、アドレス (64 ビット値)、場所オブジェクト、またはネイティブ文字を指定できます。 省略可能な contextInheritor 引数を指定すると、引数によって示されるコンテキスト (アドレス空間やデバッグ ターゲットなど) でメモリが読み取られます。それ以外の場合は、デバッガーの現在のコンテキストから読み取られます。 省略可能な 長さの 引数を指定すると、読み取り文字列は指定した長さになります。
readWideString

readWideString(location, [contextInheritor]) ワイド文字列を読み込む関数「readWideString(location, [contextInheritor])」

readWideString(location, [length], [contextInheritor])

2 これにより、デバッグ ターゲットのアドレス空間からワイド (UTF-16) 文字列が読み取られ、結果が JavaScript 文字列として返されます。 メモリを読み取ることができなかった場合は、例外がスローされる可能性があります。 指定された場所には、アドレス (64 ビット値)、場所オブジェクト、またはネイティブ wchar_tを指定できます。 省略可能な contextInheritor 引数を指定すると、引数によって示されるコンテキスト (アドレス空間やデバッグ ターゲットなど) でメモリが読み取られます。それ以外の場合は、デバッガーの現在のコンテキストから読み取られます。 省略可能な 長さの 引数を指定すると、読み取り文字列は指定した長さになります。

JavaScript のデータ モデルの概念

データ モデル マッピング

次のデータ モデルの概念は JavaScript にマップされます。

概念 ネイティブ インターフェイス JavaScript 同等
文字列変換 IStringDisplayableConcept(文字列表示可能な概念) standard: toString(...){...}
反復可能性 IIterableConcept standard: [Symbol.iterator](){...}
インデクサービリティ IIndexableConcept protocol: getDimensionality(...) / getValueAt(...) / setValueAt(...)
ランタイム型変換 望ましいランタイムタイプ概念 protocol: getPreferredRuntimeTypedObject(...)

文字列変換

文字列変換の概念 (IStringDisplayableConcept) は、標準の JavaScript toString メソッドに 直接変換されます。 すべての JavaScript オブジェクトには文字列変換が含まれるので (他の場所に指定されていない場合は Object.prototype によって提供されます)、データ モデルに返されるすべての JavaScript オブジェクトを表示文字列に変換できます。 文字列変換をオーバーライドするには、独自の toString を実装する必要があります。

class myObject
{
    //
    // This method will be called whenever any native code calls IStringDisplayableConcept::ToDisplayString(...)
    //
    toString()
    { 
        return "This is my own string conversion!";
    }
}

Iterability

データモデルにおけるオブジェクトのiterable判定の概念は、ES6プロトコルにおけるオブジェクトのiterable判定と直接対応しています。 [Symbol.iterator] メソッドを持つオブジェクトは、反復可能と見なされます。 このような実装により、オブジェクトが iterable になります。

iterable だけのオブジェクトは、次のような実装を持つことができます。

class myObject
{
    //
    // This method will be called whenever any native code calls IIterableConcept::GetIterator
    //
    *[Symbol.iterator]()
    {
        yield "First Value";
        yield "Second Value";
        yield "Third Value";
    }
}

反復子から返されるオブジェクトには、インデックスと特殊な戻り値の型を使用する値を含める必要があるため、反復可能なオブジェクトとインデックス可能なオブジェクトの両方に対して特別な考慮事項を指定する必要があります。

反復可能 と インデックス可能

反復可能でインデックス付け可能なオブジェクトには、反復子からの特別な戻り値が必要です。 反復子は、値を生成する代わりに、indexedValue のインスタンスを生成します。 indicies は、2 番目の引数の配列として indexedValue コンストラクターに渡されます。 これらは多次元でもかまいませんが、インデクサー プロトコルで返される次元と一致する必要があります。

このコードは、実装の例を示しています。

class myObject
{
    //
    // This method will be called whenever any native code calls IIterableConcept::GetIterator
    //
    *[Symbol.iterator]()
    {
        //
        // Consider this a map which mapped 42->"First Value", 99->"Second Value", and 107->"Third Value"
        //
        yield new host.indexedValue("First Value", [42]);
        yield new host.indexedValue("Second Value", [99]);
        yield new host.indexedValue("Third Value", [107]);
    }
}

インデクサービリティ

JavaScript とは異なり、データ モデルはプロパティ アクセスとインデックス作成を非常に明示的に区別します。 データ モデルでインデックス可能として自身を提示する JavaScript オブジェクトは、インデクサーの次元を返す getDimensionality メソッドと、指定されたメッセージでオブジェクトの読み取りと書き込みを実行する getValueAt メソッドと setValueAt メソッドのオプションのペアで構成されるプロトコルを実装する必要があります。 オブジェクトが読み取り専用または書き込み専用の場合は、getValueAt メソッドまたは setValueAt メソッドを省略できます。

class myObject
{
    //
    // This method will be called whenever any native code calls IIndexableConcept::GetDimensionality or IIterableConcept::GetDefaultIndexDimensionality
    //
    getDimensionality()
    {
        //
        // Pretend we are a two dimensional array.
        //
        return 2;
    } 

    //
    // This method will be called whenever any native code calls IIndexableConcept::GetAt
    //
    getValueAt(row, column)
    {
        return this.__values[row * this.__columnCount + column];
    }

    //
    // This method will be called whenever any native code calls IIndexableConcept::SetAt
    //
    setValueAt(value, row, column)
    {
        this.__values[row * this.__columnCount + column] = value;
    }
}

ランタイム型変換

これは、型システム (ネイティブ) 型に対して登録される JavaScript プロトタイプ/クラスにのみ関連します。 デバッガーは、多くの場合、分析 (Run-Time 型情報 (RTTI) や v テーブル分析など) を実行して、コードで表される静的な型からオブジェクトの真のランタイム型を決定できます。 ネイティブ型に対して登録されたデータ モデルは、IPreferredRuntimeTypeConcept の実装によってこの動作をオーバーライドできます。 同様に、ネイティブ オブジェクトに対して登録された JavaScript クラスまたはプロトタイプは、getPreferredRuntimeTypedObject メソッドで構成されるプロトコルの実装を介して独自の実装を提供できます。

このメソッドは技術的には何かを返すことができますが、実際にはランタイム型または派生型ではないものを返すのは不適切な形式と見なされることに注意してください。 これにより、デバッガーのユーザーが大きな混乱を招く可能性があります。 ただし、このメソッドをオーバーライドすることは、C スタイルのヘッダーと実装のオブジェクト スタイルなどにとって価値があります。

class myNativeModel
{
    //
    // This method will be called whenever the data model calls IPreferredRuntimeTypeConcept::CastToPreferredRuntimeType
    //
    getPreferredRuntimeTypedObject()
    {
        var loc = this.targetLocation;

        //
        // Perform analysis...
        //
        var runtimeLoc = loc.Add(runtimeObjectOffset);
  
        return host.createTypedObject(runtimeLoc, runtimeModule, runtimeTypeName);
    }
}

関連項目

JavaScript 拡張機能 でのネイティブ デバッガー オブジェクトの

JavaScript 拡張機能のネイティブ デバッガー オブジェクト - 設計とテストに関する考慮事項

JavaScript デバッガースクリプト

JavaScript デバッガーのスクリプトの例