Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Topik ini menjelaskan detail tambahan tentang menggunakan objek debugger asli di ekstensi JavaScript.
Objek debugger asli mewakili berbagai konstruksi dan perilaku lingkungan debugger. Objek JavaScript dapat diteruskan ke ekstensi JavaScript (atau diperoleh dalam ekstensi) untuk memanipulasi status debugger.
Untuk informasi tentang ekstensi JavaScript objek Debugger, lihat Objek Debugger Asli di Ekstensi JavaScript.
Untuk informasi umum tentang bekerja dengan JavaScript, lihat Pembuatan Skrip JavaScript Debugger.
Misalnya skrip dan ekstensi JavaScript, tim debugger menghosting repositori GitHub di https://github.com/Microsoft/WinDbg-Samples.
Objek Debugger di Ekstensi JavaScript
Meneruskan Objek Asli
Objek debugger dapat diteruskan atau diperoleh dalam ekstensi JavaScript dengan berbagai cara.
- Mereka dapat diteruskan ke fungsi atau metode JavaScript
- Mereka dapat menjadi objek instans untuk prototipe JavaScript (sebagai visualizer, misalnya)
- Mereka dapat dikembalikan dari metode host yang dirancang untuk membuat objek debugger asli
- Mereka dapat dikembalikan dari metode host yang dirancang untuk membuat objek asli debugger
Objek debugger yang diteruskan ke ekstensi JavaScript memiliki serangkaian fungsionalitas yang dijelaskan di bagian ini.
- Akses Properti
- Nama yang Direncanakan
- Jenis Khusus yang Berkaitan dengan Objek Debugger Asli
- Atribut Tambahan
Akses Properti
Meskipun ada beberapa properti pada objek yang ditempatkan di sana oleh penyedia JavaScript itu sendiri, sebagian besar properti pada objek asli yang memasuki JavaScript disediakan oleh model data. Ini berarti bahwa untuk akses properti --- object.propertyName atau object[propertyName], hal berikut akan terjadi.
- Jika propertyName adalah nama properti yang diproyeksikan ke objek oleh penyedia JavaScript itu sendiri, properti tersebut yang akan diprioritaskan terlebih dahulu; sebaliknya
- Jika propertyName adalah nama kunci yang diproyeksikan ke objek oleh model data (Visualizer lain), itu akan diselesaikan dengan nama ini sebagai pilihan kedua; sebaliknya
- Jika propertyName adalah nama bidang dari objek asli, maka properti tersebut akan menjadi pilihan ketiga dalam penyelesaian ke nama ini; sebaliknya
- Jika objek adalah pointer, pointer akan didereferensikan, dan siklus di atas akan dilanjutkan (properti proyeksi dari objek yang didereferensi diikuti oleh kunci diikuti oleh bidang bawaan)
Cara normal akses properti di JavaScript -- object.propertyName dan object[propertyName] -- akan mengakses bidang asli objek yang mendasar, seperti perintah 'dx' dalam debugger.
Nama yang Diproyeksikan
Properti berikut (dan metode) diproyeksikan ke objek asli yang memasukkan JavaScript.
| Metode | Tanda tangan | Deskripsi |
|---|---|---|
| hostContext | Harta benda | Mengembalikan objek yang mewakili konteks objek berada di dalam (ruang alamat, target debug, dll...) |
| targetLokasi | Harta benda | Mengembalikan objek yang merupakan abstraksi tempat objek berada dalam ruang alamat (alamat virtual, daftar, sub-daftar, dll...) |
| targetSize | Harta benda | Mengembalikan ukuran objek (secara efektif: sizeof(<TYPE OF OBJECT>) |
| addParentModel | .addParentModel(object) | Menambahkan model induk baru (mirip dengan prototipe JavaScript tetapi di sisi model data) ke objek |
| removeParentModel | .removeParentModel(object) | Menghapus model induk tertentu dari objek |
| runtimeTypedObject | Harta benda | Melakukan analisis pada objek dan mencoba mengonversinya ke jenis runtime (paling turunan) |
| targetType | Harta benda | Ekstensi JavaScript memiliki akses langsung ke sistem jenis bahasa yang mendasar. Akses ini dinyatakan melalui gagasan objek tipe. Untuk informasi selengkapnya, lihat Objek Debugger Asli di Ekstensi JavaScript - Ketik Objek |
Jika objek adalah penunjuk, properti berikut (dan metode) diproyeksikan ke penunjuk yang memasukkan JavaScript:
| Nama Properti | Tanda tangan | Deskripsi |
|---|---|---|
| tambahkan | .add(value) | Melakukan penambahan matematika penunjuk antara penunjuk dan nilai yang ditentukan |
| alamat | Harta benda | Mengembalikan alamat penunjuk sebagai objek ordinal 64-bit (jenis pustaka) |
| mengakses nilai referensi | .dereference() | Menghilangkan referensi dari pointer dan mengembalikan objek dasar |
| isNull | Harta benda | Mengembalikan apakah nilai penunjuk adalah nullptr (0) atau tidak |
Jenis Khusus yang Berkaitan dengan Objek Debugger Asli
Objek Lokasi
Objek lokasi yang dikembalikan dari properti targetLocation dari objek asli berisi properti (dan metode) berikut.
| Nama Properti | Tanda tangan | Deskripsi |
|---|---|---|
| tambahkan | .add(value) | Menambahkan offset byte absolut ke lokasi. |
| mengurangkan | .subtract(value) | Mengurangi jarak byte absolut dari lokasi. |
Atribut Tambahan
Iterabilitas
Objek apa pun yang dipahami sebagai dapat diulang oleh model data (ini adalah array asli atau memiliki visualizer (NatVis atau sebaliknya) yang membuatnya dapat diulang) akan memiliki fungsi iterator (diindeks melalui Symbol.iterator standar ES6) yang ditempatkan di atasnya. Ini berarti Anda dapat mengulangi objek asli di JavaScript sebagai berikut.
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++.
//
}
}
Pengindeksan
Objek yang dipahami sebagai dapat diindeks dalam satu dimensi melalui ordinal (misalnya: array asli) akan dapat diindeks di JavaScript melalui operator akses properti standar -- object[index]. Jika objek dapat diindeks berdasarkan nama atau dapat diindeks dalam lebih dari satu dimensi, metode getValueAt dan setValueAt akan diproyeksikan ke objek sehingga kode JavaScript dapat menggunakan pengindeks.
function indexNative(nativeArray)
{
var first = nativeArray[0];
}
Konversi String
Setiap objek asli yang memiliki konversi string tampilan melalui dukungan IStringDisplayableConcept atau elemen NatVis DisplayString akan memiliki konversi string yang dapat diakses melalui metode JavaScript toString standar.
function stringifyNative(nativeObject)
{
var myString = nativeObject.toString();
}
Membuat Objek Debugger Asli
Seperti disebutkan, skrip JavaScript bisa mendapatkan akses ke objek asli dengan memasukkannya ke JavaScript dengan salah satu dari beberapa cara atau dapat membuatnya melalui panggilan ke pustaka host. Gunakan fungsi berikut untuk membuat objek debugger asli.
| Metode | Tanda tangan | Deskripsi |
|---|---|---|
host.getModuleSymbol |
getModuleSymbol(namaModul, namaSimbol, [pewarisKonteks]) getModuleSymbol(moduleName, symbolName, [typeName], [contextInheritor]) |
Mengembalikan objek untuk simbol global dalam modul tertentu. Nama modul dan nama simbol adalah string. Jika argumen contextInheritor opsional disediakan, modul dan simbol akan dicari dalam konteks yang sama (ruang alamat, target debug) sebagai objek yang dilewatkan. Jika argumen tidak disediakan, modul dan simbol akan dicari dalam konteks debugger saat ini. Ekstensi JavaScript yang bukan skrip pengujian satu kali harus selalu menyediakan konteks eksplisit. Jika argumen opsional typeName diberikan, simbol akan diasumsikan sebagai tipe yang diberikan, dan tipe yang ditunjukkan dalam simbol akan diabaikan. Perhatikan bahwa setiap pemanggil yang mengharapkan untuk menggunakan simbol publik untuk modul harus selalu menyediakan nama jenis eksplisit. |
host.getModuleContainingSymbol |
getModuleContainingSymbol(location, [contextInheritor]) | Mengembalikan simbol (misalnya: fungsi atau data) yang berisi alamat yang diberikan. Perhatikan bahwa ini hanya akan berfungsi jika ada simbol privat untuk modul yang berisi alamat yang diberikan. Jika argumen contextInheritor opsional disediakan, modul dan simbol akan dicari dalam konteks yang sama (ruang alamat, target debug) sebagai objek yang dilewatkan. Jika argumen tidak disediakan, modul dan simbol akan dicari dalam konteks debugger saat ini. Ekstensi JavaScript yang bukan skrip pengujian satu kali harus selalu menyediakan konteks eksplisit. |
host.createPointerObject |
createPointerObject(address, moduleName, typeName, [contextInheritor]) |
Membuat objek penunjuk di alamat atau lokasi yang ditentukan. Nama modul dan nama jenis adalah string. Jika argumen contextInheritor opsional disediakan, modul dan simbol akan dicari dalam konteks yang sama (ruang alamat, target debug) sebagai objek yang dilewatkan. Jika argumen tidak disediakan, modul dan simbol akan dicari dalam konteks debugger saat ini. Ekstensi JavaScript yang bukan skrip pengujian satu kali harus selalu menyediakan konteks eksplisit. |
host.createTypedObject |
createTypedObject(location, moduleName, typeName, [contextInheritor]) |
Membuat objek yang mewakili objek bertipe asli dalam ruang alamat memori target debug di lokasi yang ditentukan. Nama modul dan nama jenis adalah string. Jika argumen contextInheritor opsional disediakan, modul dan simbol akan dicari dalam konteks yang sama (ruang alamat, target debug) sebagai objek yang dilewatkan. Jika argumen tidak disediakan, modul dan simbol akan dicari dalam konteks debugger saat ini. Ekstensi JavaScript yang bukan skrip pengujian satu kali harus selalu menyediakan konteks eksplisit. |
API Host untuk Ekstensi JavaScript
Penyedia JavaScript menyisipkan objek yang disebut host ke dalam namespace layanan global dari setiap skrip yang dimuatnya. Objek ini menyediakan akses ke fungsionalitas penting untuk skrip serta akses ke namespace debugger. Ini diatur dalam dua fase.
Fase 1: Sebelum skrip dijalankan, objek host hanya berisi serangkaian fungsionalitas minimal yang diperlukan agar skrip menginisialisasi dirinya sendiri dan mendaftarkan titik ekstensibilitasnya (baik sebagai produsen maupun konsumen). Kode akar dan inisialisasi tidak dimaksudkan untuk memanipulasi status target debug atau melakukan operasi kompleks dan, dengan demikian, host tidak sepenuhnya diisi sampai setelah metode initializeScript kembali.
Fase 2: Setelah inisialisasiScript kembali, objek host diisi dengan semua yang diperlukan untuk memanipulasi status target debug.
Tingkat Objek Host
Beberapa potongan kunci fungsionalitas berada tepat di bawah objek host. Sisanya diberi struktur sub-namespace. Namespace mencakup hal-hal berikut.
| Namespace | Deskripsi |
|---|---|
| diagnostik | Fungsionalitas untuk membantu dalam diagnosis dan debug kode skrip |
| memori | Fungsionalitas untuk mengaktifkan pembacaan dan penulisan memori dalam target debug |
Tingkat Akar
Langsung dalam objek host, properti, metode, dan konstruktor berikut dapat ditemukan.
| Nama | Tanda tangan | Fase Saat Ini | Deskripsi |
|---|---|---|---|
| MembuatObjekPointer | createPointerObject(address, moduleName, typeName, [contextInheritor]) |
2 | Membuat objek penunjuk di alamat atau lokasi yang ditentukan. Nama modul dan nama jenis adalah string. Argumen contextInheritor opsional berfungsi seperti halnya getModuleSymbol. |
| createTypedObject (membuat objek bertipe) | createTypedObject(location, moduleName, typeName, [contextInheritor]) |
2 | Membuat sebuah objek yang mewakili objek tertipe asli pada lokasi yang ditentukan dalam ruang alamat dari target debug. Nama modul dan nama jenis adalah string. Argumen contextInheritor opsional berfungsi seperti halnya getModuleSymbol. |
| currentProcess | Harta benda |
2 | Mengembalikan objek yang mewakili proses debugger saat ini |
| sesiSaatIni | Harta benda |
2 | Mengembalikan objek yang mewakili sesi debugger saat ini (target, cadangan, dll...) yang sedang di-debug |
| currentThread | Harta benda |
2 | Mengembalikan objek yang mewakili thread debugger saat ini |
| evaluateExpression | evaluateExpression(expression, [contextInheritor]) |
2 | Ini memanggil host debug untuk mengevaluasi ekspresi menggunakan bahasa target debug saja. Jika argumen contextInheritor opsional disediakan, ekspresi akan dievaluasi dalam konteks (misalnya: ruang alamat dan target debug) dari argumen; jika tidak, ini akan dievaluasi dalam konteks debugger saat ini |
| evaluateExpressionInContext | evaluateExpressionInContext(context, expression) |
2 | Ini memanggil host debug untuk mengevaluasi ekspresi menggunakan bahasa target debug saja. Argumen konteks menunjukkan implisit penunjuk ini untuk digunakan untuk evaluasi. Ekspresi akan dievaluasi dalam konteks (misalnya: ruang alamat dan target debug) yang ditunjukkan oleh argumen konteks . |
| getModuleSymbol | getModuleSymbol(moduleName, symbolName, [contextInheritor]) |
2 | Mengembalikan objek untuk simbol global dalam modul tertentu. Nama modul dan nama simbol adalah string. Jika argumen contextInheritor opsional disediakan, modul dan simbol akan dicari dalam konteks yang sama (ruang alamat, target debug) sebagai objek yang dilewatkan. Jika argumen tidak disediakan, modul dan simbol akan dicari dalam konteks debugger saat ini. Ekstensi JavaScript yang bukan skrip sekali pakai harus selalu menyediakan konteks eksplisit |
| getNamedModel | getNamedModel(modelName) |
2 | Mengembalikan model data yang didaftarkan terhadap nama tertentu. Perhatikan bahwa sepenuhnya legal untuk melakukan panggilan ini pada nama yang belum terdaftar. Melakukannya akan membuat stub untuk nama tersebut, dan manipulasi stub tersebut akan diterapkan pada objek aktual ketika pendaftaran. |
| nilaiDiindeks | indexedValue baru(nilai, indeks-indeks) |
2 | Konstruktor untuk objek yang dapat dikembalikan dari iterator JavaScript untuk menetapkan sekumpulan indeks default ke nilai yang diulang. Kumpulan indeks harus dinyatakan sebagai array JavaScript. |
| Int64 | new Int64(nilai, [nilaiTinggi]) |
1 | Ini membuat pustaka jenis Int64. Versi argumen tunggal akan mengambil nilai apa pun yang dapat dikemas ke dalam Int64 (tanpa konversi) dan menempatkannya ke dalamnya. Jika argumen kedua opsional disediakan, konversi argumen pertama dikemas ke dalam 32-bit yang lebih rendah dan konversi argumen kedua dikemas ke dalam 32 bit atas. |
| namedModelParent | baru bernamaModelParent(objek, nama) |
1 | Konstruktor untuk objek yang dimaksudkan untuk ditempatkan dalam array yang dikembalikan dari initializeScript, ini mewakili penggunaan prototipe JavaScript atau kelas ES6 sebagai ekstensi induk model data dari model data dengan nama tertentu |
| namedModelRegistration | baru bernamaModelRegistration(objek, nama) |
1 | Konstruktor untuk objek yang dimaksudkan untuk ditempatkan dalam array yang dikembalikan dari initializeScript, ini mewakili pendaftaran prototipe JavaScript atau kelas ES6 sebagai model data melalui nama yang diketahui sehingga ekstensi lain dapat menemukan dan memperluas |
| ruang nama | Harta benda |
2 | Memberikan akses langsung ke namespace root debugger. Misalnya, seseorang dapat mengakses daftar proses target debug pertama melalui host.namespace.Debugger.Sessions.First(). Proses menggunakan properti ini |
| registerNamedModel | registerNamedModel(object, modelName) |
2 | Ini mendaftarkan prototipe JavaScript atau kelas ES6 sebagai model data dengan nama yang diberikan. Pendaftaran semacam itu memungkinkan prototipe atau kelas ditemukan dan diperluas oleh skrip lain atau ekstensi debugger lainnya. Perhatikan bahwa skrip harus lebih memilih untuk mengembalikan objek namedModelRegistration dari metode initializeScript daripada melakukan ini secara imperatif. Setiap skrip yang membuat perubahan secara imperatif diperlukan untuk memiliki metode inisialisasiScript untuk membersihkan. |
| registerExtensionForTypeSignature | registerExtensionForTypeSignature(object, typeSignature) |
2 | Ini mendaftarkan prototipe JavaScript atau kelas ES6 sebagai model data ekstensi untuk jenis asli sesuai dengan tanda tangan jenis yang diberikan. Perhatikan bahwa skrip harus lebih memilih untuk mengembalikan objek typeSignatureExtension dari metode inisialisasiScript daripada melakukan ini secara imperatif. Setiap skrip yang membuat perubahan secara imperatif diperlukan untuk memiliki metode inisialisasiScript untuk membersihkan. |
| registerPrototypeForTypeSignature | registerPrototypeForTypeSignature(object, typeSignature) |
2 | Ini mendaftarkan prototipe JavaScript atau kelas ES6 sebagai model data kanonis (misalnya: visualizer) untuk tipe bawaan seperti yang diberikan oleh tanda tangan tipe yang disediakan. Perhatikan bahwa skrip harus lebih memilih untuk mengembalikan objek typeSignatureRegistration dari metode initializeScript daripada melakukan ini secara imperatif. Setiap skrip yang membuat perubahan secara imperatif diperlukan untuk memiliki metode uninitializeScriptuntuk membersihkan. |
| parseInt64 | parseInt64(string, [radix]) |
1 | Metode ini bertindak mirip dengan metode javascript parseInt standar kecuali bahwa ia mengembalikan pustaka jenis Int64 sebagai gantinya. Jika radiks disediakan, penguraian akan terjadi pada basis 2, 8, 10, atau 16 seperti yang ditunjukkan. |
| tipeTandaTanganEkstensi | typeSignatureExtension baru(object, typeSignature, [moduleName], [minVersion], [maxVersion]) |
1 | Konstruktor untuk objek yang dimaksudkan untuk dimasukkan dalam array yang dikembalikan dari initializeScript. Ini mewakili perluasan tipe asli yang dijelaskan melalui penanda tipe oleh prototipe JavaScript atau kelas ES6. Pendaftaran seperti itu "menambahkan bidang" pada visualisasi debugger untuk jenis apa pun yang cocok dengan tanda tangan, alih-alih mengambil alih sepenuhnya. Nama dan versi modul opsional dapat membatasi pendaftaran. Versi ditentukan sebagai string format "1.2.3.4". |
| Pendaftaran Tanda Tangan Tipe | typeSignatureRegistration baru(object, typeSignature, [moduleName], [minVersion], [maxVersion]) |
1 | Konstruktor untuk objek yang ditujukan untuk ditempatkan dalam array yang dikembalikan dari initializeScript, ini mewakili pendaftaran resmi prototipe JavaScript atau kelas ES6 terhadap tanda tangan tipe native. Pendaftaran semacam itu "menguasai" visualisasi debugger dari tipe apa pun yang sesuai dengan tanda tangan daripada sekadar memperluasnya. Nama dan versi modul opsional dapat membatasi pendaftaran. Versi ditentukan dalam format string "1.2.3.4". |
| unregisterNamedModel (batalkan pendaftaranModelBernama) | unregisterNamedModel(modelName) |
2 | Ini membatalkan pendaftaran model data dari pencarian dengan nama yang diberikan, membalikkan operasi apa pun yang telah dilakukan oleh registerNamedModel |
| unregisterExtensionForTypeSignature | unregisterExtensionForTypeSignature(object, typeSignature, [moduleName], [minVersion], [maxVersion]) |
2 | Ini membatalkan registrasi prototipe JavaScript atau kelas ES6 agar tidak menjadi model data ekstensi untuk tipe native sesuai dengan tanda tangan tipe yang diberikan. Ini adalah pembatalan logis dari fungsi registerExtensionForTypeSignature. Perhatikan bahwa skrip harus lebih memilih untuk mengembalikan objek typeSignatureExtension dari metode inisialisasiScript daripada melakukan ini secara imperatif. Setiap skrip yang membuat perubahan secara imperatif diperlukan untuk memiliki metode inisialisasiScript untuk membersihkan. Nama dan versi modul opsional dapat membatasi pendaftaran. Versi ditentukan dalam format string "1.2.3.4". |
| unregisterPrototypeForTypeSignature | unregisterPrototypeForTypeSignature(object, typeSignature, [moduleName], [minVersion], [maxVersion]) |
2 | Membatalkan pendaftaran prototipe JavaScript atau kelas ES6 dari menjadi model data kanonis (misalnya: visualizer) untuk tipe asli sebagaimana yang ditentukan oleh tanda tangan tipe yang disediakan. Ini adalah pembatalan logis dari registerPrototypeForTypeSignature. Perhatikan bahwa skrip harus lebih memilih untuk mengembalikan objek typeSignatureRegistration dari metode initializeScript daripada melakukan ini secara imperatif. Setiap skrip yang membuat perubahan secara imperatif diperlukan untuk memiliki metode uninitializeScript untuk membersihkan. Nama dan versi modul opsional dapat membatasi pendaftaran. Versi ditentukan dalam format string "1.2.3.4". |
Fungsionalitas Diagnostik
Sub-namespace layanan diagnostik objek host berisi yang berikut ini.
| Nama | Tanda tangan | Fase Saat Ini | Deskripsi |
|---|---|---|---|
| debugLog | debugLog(objek...) | 1 | Ini menyediakan debugging gaya printf pada ekstensi skrip. Saat ini, output dari debugLog diarahkan ke konsol output debugger. Di kemudian hari, ada rencana untuk memberikan fleksibilitas dalam perutean output ini. CATATAN: Ini tidak boleh digunakan sebagai sarana pencetakan output pengguna ke konsol. Ini mungkin tidak dialihkan ke sana di masa depan. |
Fungsionalitas Memori
Sub-namespace memori objek host berisi yang berikut ini.
| Nama | Tanda tangan | Fase Saat Ini | Deskripsi |
|---|---|---|---|
| readMemoryValues | bacaNilaiMemori(lokasi, jumlahElemen, [ukuranElemen], [bertanda], [pewarisKonteks]) |
2 | Ini membaca array nilai mentah dari ruang alamat target debug dan menempatkan array yang ditik di atas tampilan memori ini. Lokasi yang disediakan dapat berupa alamat (nilai 64-bit), objek lokasi, atau pointer asli. Ukuran array ditunjukkan oleh argumen numElements . Ukuran (dan jenis) dari setiap elemen array diberikan oleh argumen opsional elementSize dan isSigned. Jika tidak ada argumen yang disediakan, defaultnya adalah byte (tidak ditandatangani / 1 byte). Jika argumen contextInheritor opsional disediakan, memori akan dibaca dalam konteks (misalnya: ruang alamat dan target debug) yang ditunjukkan oleh argumen; jika tidak, ini akan dibaca dari konteks debugger saat ini. Perhatikan bahwa menggunakan metode ini pada nilai 8, 16, dan 32-bit menghasilkan tampilan berjenis cepat yang ditempatkan di atas memori baca. Menggunakan metode ini pada nilai 64-bit menghasilkan array jenis pustaka 64-bit yang dibangun yang secara signifikan lebih mahal! |
| readString | readString(location, [contextInheritor]) bacaString(lokasi, [panjang], [pewarisKonteks]) |
2 | Ini membaca string sempit (halaman kode saat ini) dari ruang alamat target debug, mengonversinya menjadi UTF-16, dan mengembalikan hasilnya sebagai string JavaScript. Ini dapat melemparkan pengecualian jika memori tidak dapat dibaca. Lokasi yang disediakan dapat berupa alamat (nilai 64-bit), objek lokasi, atau karakter asli. Jika argumen contextInheritor opsional disediakan, memori akan dibaca dalam konteks (misalnya: ruang alamat dan target debug) yang ditunjukkan oleh argumen; jika tidak, ini akan dibaca dari konteks debugger saat ini. Jika argumen panjang opsional disediakan, string baca akan memiliki panjang yang ditentukan. |
| readWideString | readWideString(lokasi, [contextInheritor]) readWideString(location, [length], [contextInheritor]) |
2 | Ini membaca string wide(UTF-16) dari ruang alamat target debug dan mengembalikan hasilnya sebagai string JavaScript. Ini dapat melemparkan pengecualian jika memori tidak dapat dibaca. Lokasi yang disediakan dapat berupa alamat (nilai 64-bit), objek lokasi, atau wchar_t asli. Jika argumen contextInheritor opsional disediakan, memori akan dibaca dalam konteks (misalnya: ruang alamat dan target debug) yang ditunjukkan oleh argumen; jika tidak, ini akan dibaca dari konteks debugger saat ini. Jika argumen panjang opsional disediakan, string baca akan memiliki panjang yang ditentukan. |
Konsep Model Data di JavaScript
Pemetaan Model Data
Konsep-konsep model data berikut dipetakan ke JavaScript.
| Konsep | Antarmuka Asli | Padanan JavaScript |
|---|---|---|
| Konversi String | IStringDisplayableConcept | standar: toString(...){...} |
| Iterabilitas | IIterableConcept | standar: [Symbol.iterator](){...} |
| Kemampuan Pengindeksan | IIndexableConcept | protokol: getDimensionality(...) / getValueAt(...) / setValueAt(...) |
| Konversi Jenis Runtime | IPreferredRuntimeTypeConcept | protokol: getPreferredRuntimeTypedObject(...) |
Konversi String
Konsep konversi string (IStringDisplayableConcept) secara langsung diterjemahkan ke metode JavaScript toString standar. Karena semua objek JavaScript memiliki konversi string (disediakan oleh Object.prototype jika tidak disediakan di tempat lain), setiap objek JavaScript yang dikembalikan ke model data dapat dikonversi ke string tampilan. Mengesampingkan konversi string hanya memerlukan penerapan toString Anda sendiri.
class myObject
{
//
// This method will be called whenever any native code calls IStringDisplayableConcept::ToDisplayString(...)
//
toString()
{
return "This is my own string conversion!";
}
}
Iterabilitas
Konsep model data tentang apakah suatu objek bersifat iterable atau tidak sesuai langsung dengan protokol ES6 tentang apakah objek tersebut dapat diiterasi. Objek apa pun yang memiliki metode [Symbol.iterator] dianggap dapat diulang. Implementasi tersebut akan membuat objek dapat diulang.
Objek yang hanya dapat diulang dapat memiliki implementasi seperti berikut.
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";
}
}
Pertimbangan khusus harus diberikan untuk objek yang dapat diulang dan dapat diindeks karena objek yang dikembalikan dari iterator harus menyertakan indeks serta nilai melalui jenis pengembalian khusus.
Iterable dan Indexable
Objek yang dapat diulang dan dapat diindeks memerlukan nilai pengembalian khusus dari iterator. Alih-alih menghasilkan nilai, iterator menghasilkan instance dari indexedValue. Indeks diteruskan sebagai array dalam argumen kedua ke konstruktor indexedValue. Mereka bisa multi-dimensi tetapi harus cocok dengan dimensi yang dikembalikan dalam protokol pengindeks.
Kode ini menunjukkan contoh implementasi.
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]);
}
}
Pengindeksan
Tidak seperti JavaScript, model data membuat diferensiasi yang sangat eksplisit antara akses properti dan pengindeksan. Setiap objek JavaScript yang ingin menampilkan dirinya sebagai dapat diindeks dalam model data harus menerapkan protokol yang terdiri dari metode getDimensionality yang mengembalikan dimensi pengindeks dan sepasang opsional metode getValueAt dan setValueAt yang melakukan pembacaan dan penulisan objek pada indeks yang disediakan. Dapat diterima untuk menghilangkan metode getValueAt atau setValueAt apabila objek tersebut hanya dapat dibaca atau ditulis saja.
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;
}
}
Konversi Jenis Runtime
Ini hanya relevan untuk prototipe/kelas JavaScript yang terdaftar terhadap jenis sistem jenis (asli). Debugger sering mampu melakukan analisis (misalnya Run-Time Type Information (RTTI) / v-table analysis) untuk menentukan jenis runtime sejati objek dari jenis statis yang dinyatakan dalam kode. Model data yang terdaftar terhadap tipe bawaan dapat menggantikan perilaku ini melalui implementasi IPreferredRuntimeTypeConcept. Demikian juga, kelas JavaScript atau prototipe yang terdaftar pada objek asli dapat memberikan implementasinya sendiri melalui implementasi protokol yang terdiri dari metode getPreferredRuntimeTypedObject.
Perhatikan bahwa meskipun metode ini secara teknis dapat mengembalikan apa pun, dianggap tidak baik untuk metode ini mengembalikan sesuatu yang bukan merupakan jenis runtime yang sebenarnya atau jenis yang diturunkan. Hal tersebut dapat mengakibatkan kebingungan yang signifikan bagi pengguna debugger. Namun, mengesampingkan metode ini dapat bernilai untuk hal-hal seperti implementasi dengan gaya header dan objek ala C, dll...
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);
}
}
Lihat juga
Objek Debugger Asli di ekstensi JavaScript
Objek Debugger Asli di Ekstensi JavaScript - Pertimbangan Desain dan Pengujian