JavaScript 拡張機能のネイティブ デバッガー オブジェクト - デバッガー オブジェクトの詳細
このトピックでは、JavaScript 拡張機能でのネイティブ デバッガー オブジェクトの使用についてさらに詳しく説明します。
ネイティブ デバッガー オブジェクトは、デバッガー環境のさまざまなコンストラクトと動作を表します。 オブジェクトを JavaScript 拡張機能に渡したり、取得したりして、デバッガーの状態を操作できます。
デバッガー オブジェクトの JavaScript 拡張機能の詳細については JavaScript 拡張機能のネイティブ デバッガー オブジェクト」を参照してください。
JavaScript の使用に関する一般情報については JavaScript デバッガー スクリプトを参照してください.
たとえば、JavaScript スクリプトや拡張機能など、デバッガー チームは GitHub リポジトリをホストします https://github.com/Microsoft/WinDbg-Samples。
JavaScript 拡張機能のネイティブ デバッガー オブジェクト
ネイティブ オブジェクトの渡し
デバッガー オブジェクトは、さまざまな方法で JavaScript 拡張機能に渡したり、取得したりできます。
- これらは JavaScript 関数またはメソッドに渡すことができます
- JavaScript プロトタイプのインスタンス オブジェクトを指定できます (ビジュアライザーなど)。
- これらは、ネイティブ デバッガー オブジェクトを作成するように設計されたホスト メソッドから返すことができます
- これらは、デバッガーのネイティブ オブジェクトを作成するように設計されたホスト メソッドから返される可能性があります。
JavaScript 拡張機能に渡されるデバッガー オブジェクトには、このセクションで説明する一連の機能があります。
- プロパティへのアクセス
- 投影名
- ネイティブ デバッガー オブジェクトに関連する特殊な型
- 追加の属性
プロパティへのアクセス
JavaScript プロバイダー自体によって配置されるオブジェクトにはいくつかのプロパティがありますが、JavaScript に入るネイティブ オブジェクトのプロパティの大部分はデータ モデルによって提供されます。 つまり、object.propertyName または object[propertyName] ---プロパティ アクセスの場合、次の処理が行われます。
- propertyName が JavaScript プロバイダー自体によってオブジェクトに投影されるプロパティの名前である場合は、最初にこのプロパティに解決されます。それ以外の場合は解決されます。
- propertyName がデータ モデル (別のビジュアライザー) によってオブジェクトに投影されるキーの名前である場合、この名前は 2 番目に解決されます。それ以外の場合は解決されます。
- propertyName がネイティブ オブジェクトのフィールドの名前である場合、この名前は 3 番目に解決されます。それ以外の場合は解決されます。
- オブジェクトがポインターの場合、ポインターは逆参照され、上記のサイクルは続行されます (逆参照されたオブジェクトの投影プロパティの後にキーが続き、ネイティブ フィールドが続きます)
JavaScript でのプロパティ アクセスの通常の手段 -- object.propertyName と object[propertyName] -- は、デバッガー内の 'dx' コマンドと同様に、オブジェクトの基になるネイティブ フィールドにアクセスします。
投影名
次のプロパティ (およびメソッド) は、JavaScript を入力するネイティブ オブジェクトに投影されます。
メソッド | 署名 | 説明 |
---|---|---|
hostContext | プロパティ | オブジェクトが含まれているコンテキスト (アドレス空間、デバッグ ターゲットなど) を表すオブジェクトを返します。 |
targetLocation | プロパティ | オブジェクトがアドレス空間内のどこにあるかを抽象化したオブジェクト (仮想アドレス、レジスタ、サブレジスタなど) を返します。 |
targetSize | プロパティ | オブジェクトのサイズを返します (実質的には sizeof(<TYPE OF OBJECT>) |
addParentModel | .addParentModel(object) | 新しい親モデル (JavaScript プロトタイプと同じデータ モデル側) をオブジェクトに追加します |
removeParentModel | .removeParentModel(object) | オブジェクトから特定の親モデルを削除します。 |
runtimeTypedObject | プロパティ | オブジェクトに対して分析を実行し、ランタイム (最も派生した) 型に変換しようとします |
targetType | プロパティ | JavaScript 拡張機能は、基になる言語の型システムに直接アクセスできます。 このアクセスは、型オブジェクトの概念によって表されます。 詳細については JavaScript 拡張機能のネイティブ デバッガー オブジェクト - 型オブジェクト」を参照してください。 |
オブジェクトがポインターの場合、次のプロパティ (およびメソッド) が JavaScript に入るポインターに投影されます。
プロパティ名 | 署名 | 説明 |
---|---|---|
add | .add(value) | ポインターと指定した値の間でポインターの算術加算を実行します。 |
address | プロパティ | ポインターのアドレスを 64 ビットの序数オブジェクト (ライブラリ型) として返します。 |
逆参照 | .逆参照() | ポインターを逆参照し、基になるオブジェクトを返します。 |
isNull | プロパティ | ポインター値が nullptr (0) かどうかを返します。 |
ネイティブ デバッガー オブジェクトに関連する特殊な型
位置オブジェクト
ネイティブ オブジェクトの targetLocation プロパティから返される location オブジェクトには、次のプロパティ (およびメソッド) が含まれています。
プロパティ名 | 署名 | 説明 |
---|---|---|
add | .add(value) | 位置に絶対バイト オフセットを追加します。 |
subtract | .subtract(value) | 位置から絶対バイト オフセットを減算します。 |
追加の属性
反復可能性
データ モデルで反復可能と認識されるオブジェクト (ネイティブ配列であるか、ビジュアライザー (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 引数が指定されている場合、シンボルは渡された型であると見なされ、シンボルで示される型は無視されます。 モジュールのパブリック シンボルで動作することを想定している呼び出し元は、常に明示的な型名を指定する必要があることに注意してください。 |
host.getModuleContainingSymbol |
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 が返されると、デバッグ ターゲットの状態を操作するために必要なすべてのものがホスト オブジェクトに設定されます。
ホスト オブジェクト レベル
いくつかの重要な機能は、ホスト オブジェクトのすぐ下にあります。 reメインder はサブ名前空間です。 名前空間には次のものが含まれます。
名前空間 | 説明 |
---|---|
diagnostics | スクリプト コードの診断とデバッグを支援する機能 |
memory | デバッグ ターゲット内でメモリの読み取りと書き込みを有効にする機能 |
ルートレベル
ホスト オブジェクト内で直接、次のプロパティ、メソッド、およびコンストラクターを見つけることができます。
名前 | 署名 | 現在のフェーズ | 説明 |
---|---|---|---|
createPointerObject | createPointerObject(address, moduleName, typeName, [contextInheritor]) |
2 | 指定したアドレスまたは場所にポインター オブジェクトを作成します。 モジュール名と型名は文字列です。 省略可能な contextInheritor 引数は、getModuleSymbol と同様に動作します。 |
createTypedObject | createTypedObject(location, moduleName, typeName, [contextInheritor]) |
2 | 指定した場所にあるデバッグ ターゲットのアドレス空間内にネイティブ型指定されたオブジェクトを表すオブジェクトを作成します。 モジュール名と型名は文字列です。 省略可能な contextInheritor 引数は、getModuleSymbol と同様に動作します。 |
currentProcess | プロパティ |
2 | デバッガーの現在のプロセスを表すオブジェクトを返します。 |
currentSession | プロパティ |
2 | デバッグ中のデバッガーの現在のセッション (ターゲット、ダンプなど) を表すオブジェクトを返します。 |
currentThread | プロパティ |
2 | デバッガーの現在のスレッドを表すオブジェクトを返します。 |
evaluateExpression | evaluateExpression(expression, [contextInheritor]) |
2 | これにより、デバッグ ホストが呼び出され、デバッグ ターゲットの言語のみを使用して式が評価されます。 省略可能な contextInheritor 引数が指定されている場合、式は引数のコンテキスト (アドレス空間とデバッグ ターゲットなど) で評価されます。それ以外の場合は、デバッガーの現在のコンテキストで評価されます。 |
evaluateExpressionInContext | evaluateExpressionInContext(context, expression) |
2 | これにより、デバッグ ホストが呼び出され、デバッグ ターゲットの言語のみを使用して式が評価されます。 コンテキスト引数は、評価に使用する暗黙的なこのポインターを示します。 式は、コンテキスト引数によって示されるコンテキスト (アドレス空間やデバッグ ターゲットなど) で 評価されます。 |
getModuleSymbol | getModuleSymbol(moduleName, symbolName, [contextInheritor]) |
2 | 特定のモジュール内のグローバル シンボルのオブジェクトを返します。 モジュール名とシンボル名は文字列です。 省略可能な contextInheritor 引数が指定されている場合、モジュールとシンボルは、渡されたオブジェクトと同じコンテキスト (アドレス空間、デバッグ ターゲット) 内で検索されます。 引数が指定されていない場合、モジュールとシンボルはデバッガーの現在のコンテキストで検索されます。 1 回限りのスクリプトではない JavaScript 拡張機能は、常に明示的なコンテキストを提供する必要があります。 |
getNamedModel | getNamedModel(modelName) |
2 | 指定された名前に対して登録されたデータ モデルを返します。 まだ登録されていない名前に対してこれを呼び出すのは完全に有効であることに注意してください。 これにより、その名前のスタブが作成され、登録時にスタブの操作が実際のオブジェクトに対して行われます |
indexedValue | 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 クラスを使用することを表します |
namedModelRegistration | new namedModelRegistration(object, name) |
1 | initializeScript から返される配列に配置することを目的としたオブジェクトのコンストラクター。これは、JavaScript プロトタイプまたは ES6 クラスを既知の名前を介してデータ モデルとして登録されることを表し、他の拡張機能が検索および拡張できるようにします。 |
namespace | プロパティ |
2 | デバッガーのルート名前空間に直接アクセスできるようにします。 たとえば、host.namespace.Debugger.Sessions.First() を使用して、最初のデバッグ ターゲットのプロセス リストにアクセスできます。このプロパティを使用するプロセス |
registerNamedModel | registerNamedModel(object, modelName) |
2 | これにより、JavaScript プロトタイプまたは ES6 クラスが、指定された名前のデータ モデルとして登録されます。 このような登録により、プロトタイプまたはクラスを他のスクリプトや他のデバッガー拡張機能によって配置および拡張できます。 スクリプトは namedModelRegistration オブジェクトから initializeScript メソッドを使う。 変更を強制的に行うスクリプトは、クリーンするために initializeScript メソッドが必要です。 |
registerExtensionForTypeSignature | registerExtensionForTypeSignature(object, typeSignature) |
2 | これにより、指定された型シグネチャによって指定されたネイティブ型の拡張データ モデルとして JavaScript プロトタイプまたは ES6 クラスが登録されます。 なお、スクリプトは、以下のように typeSignatureExtension オブジェクトから initializeScript メソッドを使う。 変更を強制的に行うスクリプトは、クリーンするために initializeScript メソッドが必要です。 |
registerPrototypeForTypeSignature | registerPrototypeForTypeSignature(object, typeSignature) |
2 | これにより、指定された型シグネチャによって指定されたネイティブ型の正規データ モデル (ビジュアライザーなど) として JavaScript プロトタイプまたは ES6 クラスが登録されます。 なお、スクリプトは、以下のように typeSignatureRegistration オブジェクトから initializeScript メソッドを使う。 変更を強制的に行うスクリプトは、クリーンするために uninitializeScriptメソッドが必要です。 |
parseInt64 | parseInt64(string, [radix]) |
1 | このメソッドは、代わりにライブラリ Int64 型を返す点を除き、標準の JavaScript parseInt メソッドと同様に動作します。 基数が指定されている場合、解析は、示されているように 2、8、10、または 16 の底で行われます。 |
typeSignatureExtension | new typeSignatureExtension(object, typeSignature, [moduleName], [minVersion], [maxVersion]) |
1 | initializeScript から 返される配列に配置することを目的としたオブジェクトのコンストラクター。これは、JavaScript プロトタイプまたは ES6 クラスによって型シグネチャによって記述されたネイティブ型の拡張を表します。 このような登録は、シグネチャを完全に引き継ぐのではなく、シグネチャに一致する任意の型のデバッガーの視覚化に "フィールドを追加" します。 オプションのモジュール名とバージョンにより、登録を制限できます。 バージョンは、"1.2.3.4" スタイル文字列として指定されます。 |
typeSignatureRegistration | new typeSignatureRegistration(object, typeSignature, [moduleName], [minVersion], [maxVersion]) |
1 | initializeScript から返された配列に配置されるオブジェクトのコンストラクター。これは、ネイティブ型署名に対する JavaScript プロトタイプまたは ES6 クラスの正規登録を表します。 このような登録は、単に拡張するのではなく、シグネチャに一致する任意の型のデバッガーの視覚化を "引き継ぎます" 。 オプションのモジュール名とバージョンにより、登録を制限できます。 バージョンは、"1.2.3.4" スタイル文字列として指定されます。 |
unregisterNamedModel | unregisterNamedModel(modelName) |
2 | これにより、指定された名前による参照からデータ モデルの登録が解除され registerNamedModelによって実行されたすべての操作が元に 戻されます。 |
unregisterExtensionForTypeSignature | unregisterExtensionForTypeSignature(object, typeSignature, [moduleName], [minVersion], [maxVersion]) |
2 | これにより、JavaScript プロトタイプまたは ES6 クラスが、提供された型シグネチャによって指定されたネイティブ型の拡張データ モデルとして登録解除されます。 registerExtensionForTypeSignature の論理的な元に戻します。 なお、スクリプトは、以下のように typeSignatureExtension オブジェクトから initializeScript メソッドを使う。 変更を強制的に行うスクリプトは、クリーンするために initializeScript メソッドが必要です。 オプションのモジュール名とバージョンにより、登録を制限できます。 バージョンは、"1.2.3.4" スタイル文字列として指定されます。 |
unregisterPrototypeForTypeSignature | unregisterPrototypeForTypeSignature(object, typeSignature, [moduleName], [minVersion], [maxVersion]) |
2 | これにより、JavaScript プロトタイプまたは ES6 クラスが、提供された型シグネチャによって指定されたネイティブ型の正規データ モデル (例: ビジュアライザー) として登録解除されます。 registerPrototypeForTypeSignature. の論理的な元に戻します。 なお、スクリプトは、以下のように typeSignatureRegistration オブジェクトから initializeScript メソッドを使う。 変更を強制的に行うスクリプトは、クリーンするために 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(location, [contextInheritor]) readString(location, [length], [contextInheritor]) |
2 | これにより、デバッグ ターゲットのアドレス空間から狭い (現在のコード ページ) 文字列が読み取られ、UTF-16 に変換され、結果が JavaScript 文字列として返されます。 メモリを読み取ることができなかった場合は、例外がスローされる可能性があります。 指定される場所は、アドレス (64 ビット値)、場所オブジェクト、またはネイティブ charです。 省略可能な contextInheritor 引数を指定すると、引数によって示されるコンテキスト (アドレス空間やデバッグ ターゲットなど) でメモリが読み取られます。それ以外の場合は、デバッガーの現在のコンテキストから読み取られます。 省略可能な 長さの 引数を指定すると、読み取り文字列は指定した長さになります。 |
readWideString | 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(...) |
ランタイム型変換 | IPreferredRuntimeTypeConcept | 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!";
}
}
反復可能性
オブジェクトが iterable かどうかを示すデータ モデルの概念は、オブジェクトが iterable かどうかを示す ES6 プロトコルに直接マップされます。 [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";
}
}
反復子から返されるオブジェクトには、インデックスと特殊な戻り値の型を使用する値を含める必要があるため、反復可能なオブジェクトとインデックス可能なオブジェクトの両方に対して特別な考慮事項を指定する必要があります。
Iterable と Indexable
反復可能でインデックス付け可能なオブジェクトには、反復子からの特別な戻り値が必要です。 反復子は、値を生成する代わりに、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 プロトタイプ/クラスにのみ関連します。 デバッガーは、多くの場合、分析 (ランタイム型情報 (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 拡張機能のネイティブ デバッガー オブジェクト