Interna felsökningsobjekt i JavaScript-tillägg – Information om felsökningsobjekt

I det här avsnittet beskrivs ytterligare information om hur du använder inbyggda felsökningsobjekt i JavaScript-tillägg.

Interna felsökningsobjekt representerar olika konstruktioner och beteenden i felsökningsmiljön. Objekten kan skickas till (eller hämtas i) JavaScript-tillägg för att ändra tillståndet för felsökningsprogrammet.

Information om JavaScript-tillägg för felsökningsobjekt finns i Interna felsökningsobjekt i JavaScript-tillägg.

Allmän information om hur du arbetar med JavaScript finns i Skript för JavaScript-felsökningsprogram.

För exempelvis JavaScript-skript och tillägg har felsökningsteamet en GitHub-lagringsplats på https://github.com/Microsoft/WinDbg-Samples.

Felsökningsobjekt i JavaScript-tillägg

Skicka inbyggda objekt

Felsökningsobjekt kan skickas till eller hämtas i JavaScript-tillägg på flera olika sätt.

  • De kan skickas till JavaScript-funktioner eller -metoder
  • De kan vara instansobjektet för en JavaScript-prototyp (till exempel som visualiserare)
  • De kan returneras från värdmetoder som utformats för att skapa interna felsökningsobjekt
  • De kan returneras från värdmetoder som utformats för att skapa interna felsökningsobjekt

Felsökningsobjekt som skickas till ett JavaScript-tillägg har en uppsättning funktioner som beskrivs i det här avsnittet.

  • Egenskapsåtkomst
  • Projekterade namn
  • Särskilda typer som gäller inbyggda debugger-objekt
  • Ytterligare attribut

Egenskapsåtkomst

Även om det finns vissa egenskaper för objekt som placeras där av Själva JavaScript-providern, tillhandahålls majoriteten av egenskaperna för ett inbyggt objekt som anger JavaScript av datamodellen. Det innebär att för en egenskapsåtkomst --- object.propertyName eller object[propertyName] sker följande.

  • Om propertyName är namnet på en egenskap som projiceras på objektet av själva JavaScript-providern, kommer den att matchas först; annars
  • Om propertyName är namnet på en nyckel som projiceras på objektet av datamodellen (en annan Visualiserare), matchas den till det här namnet andra gången. Annars
  • Om propertyName är namnet på ett fält i det inbyggda objektet kommer det att matchas till detta namn som tredje alternativ; annars
  • Om objektet är en pekare derefereras pekaren och cykeln ovan fortsätter (en beräknad egenskap för det derefererade objektet följt av en nyckel följt av ett internt fält)

Det normala sättet för egenskapsåtkomst i JavaScript – object.propertyName och object[propertyName] – kommer åt de underliggande interna fälten i ett objekt, ungefär som kommandot "dx" skulle ha i felsökningsprogrammet.

Projekterade namn

Följande egenskaper (och metoder) projiceras på inbyggda objekt som kommer in i JavaScript.

Metod Underskrift Beskrivning
hostContext Fastighet Returnerar ett objekt som representerar kontexten som objektet finns i (adressutrymmet, felsökningsmålet osv.).
targetLocation Fastighet Returnerar ett objekt som är en abstraktion av var objektet finns inom ett adressutrymme (virtuell adress, register, underregister osv.)
targetSize Fastighet Returnerar objektets storlek (effektivt: sizeof(<TYPE OF OBJECT>)
lägg till föräldramodell .addParentModel(object) Lägger till en ny överordnad modell (liknar en JavaScript-prototyp men på datamodellsidan) i objektet
removeParentModel .removeParentModel(object) Tar bort en viss överordnad modell från objektet
runtimeTypedObject Fastighet Utför en analys av objektet och försöker konvertera det till dess mest specificerade körningstidstyp.
måltyp Fastighet JavaScript-tillägg har direkt åtkomst till det underliggande språkets typsystem. Den här åtkomsten uttrycks genom begreppet typobjekt. Mer information finns i Interna felsökningsobjekt i JavaScript-tillägg – Typobjekt

Om objektet är en pekare projiceras följande egenskaper (och metoder) på pekaren som anger JavaScript:

Egenskapsnamn Underskrift Beskrivning
lägg till .add(value) Utför pekarberäkningstillägg mellan pekaren och det angivna värdet
adress Fastighet Returnerar pekarens adress som ett 64-bitars ordinalt objekt (en bibliotekstyp)
dereference .dereference() Avrefererar pekaren och returnerar det underliggande objektet
isNull Fastighet Returnerar om pekarvärdet är nullptr (0)

Särskilda typer som rör inbyggda felsökningsobjekt

Platsobjekt

Platsobjektet som returneras från egenskapen targetLocation för ett internt objekt innehåller följande egenskaper (och metoder).

Egenskapsnamn Underskrift Beskrivning
lägg till .add(value) Lägger till en absolut byteförskjutning till platsen.
subtrahera .subtract(value) Subtraherar en absolut byteförskjutning från platsen.

Ytterligare attribut

Iterbarhet

Alla objekt som uppfattas som iterbara av datamodellen (det är en intern matris eller en visualiserare (NatVis eller på annat sätt) som gör den itererbar) kommer att ha en iteratorfunktion (indexerad via ES6 standard Symbol.iterator) placerad på den. Det innebär att du kan iterera ett inbyggt objekt i JavaScript på följande sätt.

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++.
        //
    }
}

Indexerbarhet

Objekt som uppfattas som indexerbara i en dimension via ordningstal (t.ex. interna matriser) kan indexeras i JavaScript via standardegenskapens åtkomstoperator -- object[index]. Om ett objekt kan indexeras efter namn eller är indexerbart i mer än en dimension projiceras metoderna getValueAt och setValueAt på objektet så att JavaScript-koden kan använda indexeraren.

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

Strängkonvertering

Alla inbyggda objekt som har en visningssträngkonvertering via stöd för IStringDisplayableConcept eller ett NatVis DisplayString-element kommer att ha strängkonverteringen tillgänglig via standardmetoden JavaScript toString.

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

Skapa interna felsökningsobjekt

Som nämnts kan ett JavaScript-skript få åtkomst till inbyggda objekt genom att skicka dem till JavaScript på ett av flera sätt eller skapa dem via anrop till värdbiblioteket. Använd följande funktioner för att skapa interna felsökningsobjekt.

Metod Underskrift Beskrivning

host.getModuleSymbol

getModuleSymbol(moduleName, symbolName, [contextInheritor])

getModuleSymbol(moduleNamn, symbolNamn, [typNamn], [kontextArvtagare])

Returnerar ett objekt för en global symbol i en viss modul. Modulnamnet och symbolnamnet är strängar.

Om det valfria argumentet contextInheritor anges, kommer modulen och symbolen att letas upp inom samma kontext (adressutrymme, felsökningsmål) som det skickade objektet. Om argumentet inte anges, kommer modulen och symbolen att letas upp i felsökningsprogrammets aktuella kontext. Ett JavaScript-tillägg som inte är ett engångstestskript bör alltid ange en explicit kontext.

Om det valfria typeName-argumentet anges antas symbolen vara av godkänd typ och den typ som anges i symbolerna ignoreras. Observera att alla uppringare som förväntar sig att arbeta med offentliga symboler för en modul alltid ska ange ett explicit typnamn.

host.getModuleContainingSymbol

getModuleContainingSymbol(location, [contextInheritor])

Returnerar symbolen (t.ex. funktion eller data) som innehåller den angivna adressen. Observera att detta endast fungerar om det finns privata symboler för modulen som innehåller den angivna adressen.

Om det valfria argumentet contextInheritor anges, kommer modulen och symbolen att letas upp inom samma kontext (adressutrymme, felsökningsmål) som det skickade objektet. Om argumentet inte anges, kommer modulen och symbolen att letas upp i felsökningsprogrammets aktuella kontext. Ett JavaScript-tillägg som inte är ett engångstestskript bör alltid ange en explicit kontext.

host.createPointerObject

skapaPekarobjekt(adress, modulnamn, typnamn, [kontextärva])

Skapar ett pekarobjekt på den angivna adressen eller platsen. Modulnamnet och typnamnet är strängar.

Om det valfria argumentet contextInheritor anges, kommer modulen och symbolen att letas upp inom samma kontext (adressutrymme, felsökningsmål) som det skickade objektet. Om argumentet inte anges, kommer modulen och symbolen att letas upp i felsökningsprogrammets aktuella kontext. Ett JavaScript-tillägg som inte är ett engångstestskript bör alltid ange en explicit kontext.

host.createTypedObject

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

Skapar ett objekt som representerar ett inbyggt eller ursprungligt typat objekt inom adressutrymmet för ett felsökningsmålobjekt på den angivna lokationen. Modulnamnet och typnamnet är strängar.

Om det valfria argumentet contextInheritor anges, kommer modulen och symbolen att letas upp inom samma kontext (adressutrymme, felsökningsmål) som det skickade objektet. Om argumentet inte anges, kommer modulen och symbolen att letas upp i felsökningsprogrammets aktuella kontext. Ett JavaScript-tillägg som inte är ett engångstestskript bör alltid ange en explicit kontext.

Värd-API:er för JavaScript-tillägg

JavaScript-providern infogar ett objekt som kallas värd i det globala namnområdet för varje skript som läses in. Det här objektet ger åtkomst till viktiga funktioner för skriptet samt åtkomst till namnområdet för felsökningsprogrammet. Den konfigureras i två faser.

  • Fas 1: Innan ett skript körs innehåller värdobjektet bara den minimala uppsättning funktioner som krävs för att ett skript ska kunna initiera sig själv och registrera sina utökningspunkter (både som producent och konsument). Rot- och initieringskoden är inte avsedd att ändra tillståndet för ett felsökningsmål eller utföra komplexa åtgärder och därför fylls värden inte i helt förrän när metoden initializeScript returnerar.

  • Fas 2: När initializeScript returnerar fylls värdobjektet i med allt som krävs för att ändra tillståndet för felsökningsmål.

Värdobjektnivå

Några viktiga funktioner finns direkt under värdobjektet. Resten är undernamnområde. Namnområden innehåller följande.

Namespace Beskrivning
diagnostik Funktioner som hjälper dig att diagnostisera och felsöka skriptkod
minne Funktioner för att aktivera minnesläsning och skrivning inom ett felsökningsmål

Rotnivå

Direkt i värdobjektet finns följande egenskaper, metoder och konstruktorer.

Namn Underskrift Fas närvarande Beskrivning
skapaPekarobjekt (createPointerObject)

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

2 Skapar ett pekarobjekt på den angivna adressen eller platsen. Modulnamnet och typnamnet är strängar. Det valfria argumentet contextInheritor fungerar som med getModuleSymbol.
createTypedObject

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

2 Skapar ett objekt som representerar ett inbyggt typobjekt inom adressutrymmet för ett felsökningsobjekt på den angivna platsen. Modulnamnet och typnamnet är strängar. Det valfria argumentet contextInheritor fungerar som med getModuleSymbol.
currentProcess

Fastighet

2 Returnerar objektet som representerar den aktuella processen för felsökningsprogrammet
aktuell session

Fastighet

2 Returnerar objektet som representerar den aktuella sessionen i felsökaren där mål, dump osv. debuggas
currentThread

Fastighet

2 Returnerar objektet som representerar den aktuella tråden i felsökningsprogrammet
evalueraUttryck

evaluateExpression(expression, [contextInheritor])

2 Detta anropar felsökningsvärden för att utvärdera ett uttryck med hjälp av språket för felsökningsmålet. Om det valfria argumentet contextInheritor anges utvärderas uttrycket i kontexten (t.ex. adressutrymme och felsökningsmål) för argumentet. annars utvärderas den i den aktuella kontexten för felsökningsprogrammet
evaluateExpressionInContext

evaluateExpressionInContext(context, expression)

2 Detta anropar felsökningsvärden dator för att utvärdera ett uttryck med hjälp av endast språket för felsökningsmålet. Kontextargumentet anger den implicita pekaren som ska utnyttjas för utvärderingen. Uttrycket utvärderas i kontexten (t.ex. adressutrymme och felsökningsmål) som anges av kontextargumentet .
getModuleSymbol

getModuleSymbol(moduleName, symbolName, [kontextArvtagare])

2 Returnerar ett objekt för en global symbol i en viss modul. Modulnamnet och symbolnamnet är strängar. Om det valfria argumentet contextInheritor anges, kommer modulen och symbolen att letas upp inom samma kontext (adressutrymme, felsökningsmål) som det skickade objektet. Om argumentet inte anges, kommer modulen och symbolen att letas upp i felsökningsprogrammets aktuella kontext. Ett JavaScript-tillägg som inte är ett engångsskript bör alltid ange en explicit kontext
getNamedModel

getNamedModel(modelName)

2 Returnerar datamodellen som registrerades med ett givet namn. Observera att det är helt lagligt att kalla detta mot ett namn som ännu inte har registrerats. Om du gör det skapas en stub för det namnet och manipuleringar av stub görs till det faktiska objektet vid registreringen
indexeratVärde

new indexedValue(value, index)

2 En konstruktor för ett objekt som kan returneras från en JavaScript-iterator för att tilldela en standarduppsättning med index till det itererade värdet. Uppsättningen med indextal måste uttryckas som en JavaScript-matris.
Int64

new Int64(value, [highValue])

1 Detta konstruerar en int64-bibliotekstyp. Den enkla argumentversionen kan ta alla värden som kan packas in i en Int64 (utan konvertering) och placera dem i denna. Om ett valfritt andra argument anges packas en konvertering av det första argumentet till de lägre 32-bitars och en konvertering av det andra argumentet packas till de övre 32 bitarna.
namngivenModellFörälder

new namedModelParent(objekt, namn)

1 En konstruktor för ett objekt som är tänkt att placeras i matrisen som returneras från initializeScript, representerar detta med hjälp av en JavaScript-prototyp eller ES6-klass som ett överordnat datamodelltillägg för en datamodell med det angivna namnet
namedModelRegistration

new namedModelRegistration(object, name)

1 En konstruktor för ett objekt som är avsett att placeras i matrisen som returneras från initializeScript, detta representerar registreringen av en JavaScript-prototyp eller ES6-klass som en datamodell via ett känt namn så att andra tillägg kan hitta och utöka
Namnområde

Fastighet

2 Ger direkt åtkomst till rotnamnområdet för felsökningsprogrammet. Man kan till exempel komma åt processlistan för det första felsökningsmålet via host.namespace.Debugger.Sessions.First(). Processer som använder den här egenskapen
registerNamedModel

registerNamedModel(object, modelName)

2 Detta registrerar en JavaScript-prototyp eller en ES6-klass som en datamodell under det angivna namnet. En sådan registrering gör att prototypen eller klassen kan hittas och utökas av andra skript eller andra tillägg för felsökningsprogram. Observera att ett skript bör föredra att returnera ett namedModelRegistration-objekt från dess initializeScript-metod i stället för att göra detta imperativt. Skript som gör ändringar måste ha en initializeScript-metod för att rensa.
registerExtensionForTypeSignature

registerExtensionForTypeSignature(object, typeSignature)

2 Detta registrerar en JavaScript-prototyp eller ES6-klass som en tilläggsdatamodell för en intern typ enligt den angivna typsignaturen. Observera att ett skript bör föredra att returnera ett typeSignatureExtension-objekt från dess initializeScript-metod i stället för att göra detta imperativt. Skript som gör ändringar måste ha en initializeScript-metod för att rensa.
registerPrototypeForTypeSignature

registerPrototypeForTypeSignature(object, typeSignature)

2 Detta registrerar en JavaScript-prototyp eller ES6-klass som kanonisk datamodell (t.ex. visualiserare) för en intern typ enligt den angivna typsignaturen. Observera att ett skript bör föredra att returnera ett typeSignatureRegistration-objekt från dess initializeScript-metod i stället för att göra detta imperativt. Skript som gör ändringar måste ha en uninitializeScript-metodför att kunna rensas.
parseInt64

parseInt64(string, [radix])

1 Den här metoden fungerar på samma sätt som standardmetoden JavaScript parseInt, förutom att den returnerar en int64-bibliotekstyp i stället. Om ett radix tillhandahålls sker parsningen i antingen bas 2, 8, 10 eller 16 enligt beskrivningen.
TypeSignaturFörlängning

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

1 En konstruktor för ett objekt som är avsett att placeras i matrisen som returneras från initializeScript. Detta representerar ett tillägg av en intern typ som beskrivs via en typsignatur av en JavaScript-prototyp eller ES6-klass. En sådan registrering "lägger till fält" i felsökningsprogrammets visualisering av alla typer som matchar signaturen i stället för att ta över den helt. Ett valfritt modulnamn och en valfri version kan begränsa registreringen. Versioner anges som "1.2.3.4"-formaterade strängar.
registrering av typsignatur

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

1 En konstruktor för ett objekt som är avsett att placeras i matrisen som returneras från initializeScript, detta representerar en kanonisk registrering av en JavaScript-prototyp eller ES6-klass mot en intern typsignatur. En sådan registrering "tar över" felsökningsprogrammets visualisering av alla typer som matchar signaturen i stället för att bara utöka den. Ett valfritt modulnamn och en valfri version kan begränsa registreringen. Versioner anges som "1.2.3.4"-formaterade strängar.
unregisterNamedModel

unregisterNamedModel(modelName)

2 Detta avregistrerar en datamodell från uppslag med det angivna namnet och ångrar alla åtgärder som utförs av registerNamedModel
avregistreraTilläggFörTypsignatur

avregistreraExtensionFörTypSignatur(object, typeSignature, [moduleName], [minVersion], [maxVersion])

2 Detta avregistrerar en JavaScript-prototyp eller ES6-klass från att vara en tilläggsdatamodell för en intern typ enligt den angivna typsignaturen. Det är den logiska återställandet av registerExtensionForTypeSignature. Observera att ett skript bör föredra att returnera ett typeSignatureExtension-objekt från dess initializeScript-metod i stället för att göra detta imperativt. Skript som gör ändringar måste ha en initializeScript-metod för att rensa. Ett valfritt modulnamn och en valfri version kan begränsa registreringen. Versioner anges som "1.2.3.4"-formaterade strängar.
unregisterPrototypeForTypeSignature (avregistrera prototype för typsignatur)

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

2 Detta avregistrerar en JavaScript-prototyp eller ES6-klass från att vara den kanoniska datamodellen (t.ex. visualiserare) för en intern typ enligt den angivna typsignaturen. Det är den logiska ångra av registerPrototypeForTypeSignature. Observera att ett skript bör föredra att returnera ett typeSignatureRegistration-objekt från dess initializeScript-metod i stället för att göra detta imperativt. Skript som gör ändringar måste ha en uninitializeScript-metod för att kunna rensas. Ett valfritt modulnamn och en valfri version kan begränsa registreringen. Versioner anges som "1.2.3.4"-formaterade strängar.

Diagnostikfunktioner

Undernamnområdet diagnostik för värdobjektet innehåller följande.

Namn Underskrift Fas närvarande Beskrivning
debugLog debugLog(object...) 1 Detta möjliggör printf-liknande felsökning i ett skripttillägg. För närvarande dirigeras utdata från debugLog till utdatakonsolen för felsökningsprogrammet. Vid ett senare tillfälle finns det planer på att ge flexibilitet vid routning av dessa utdata. Obs! Detta bör inte användas som ett sätt att skriva ut användarutdata till konsolen. Den kanske inte dirigeras dit i framtiden.

Minnesfunktioner

Värdobjektets undernamnområde för minne innehåller följande.

Namn Underskrift Fas närvarande Beskrivning
readMemoryValues

readMemoryValues(location, numElements, [elementSize], [isSigned], [contextInheritor])

2 Detta läser en rå matris med värden från adressutrymmet för felsökningsmålet och placerar en typad matris ovanpå vyn för det här minnet. Den angivna platsen kan vara en adress (ett 64-bitarsvärde), ett platsobjekt eller en inbyggd pekare. Matrisens storlek anges av argumentet numElements . Storleken (och typen) för varje element i matrisen anges av de valfria elementSize och isSigned-argumenten. Om inga sådana argument anges är standardvärdet byte (osignerad/1 byte). Om det valfria argumentet contextInheritor anges läss minnet i kontexten (t.ex. adressutrymme och felsökningsmål) som anges av argumentet. annars kommer den att läsas från felsökningsprogrammets aktuella kontext. Observera att om du använder den här metoden på 8-, 16- och 32-bitarsvärden resulterar det i att en typad vy snabbt placeras över det lästa minnet. Med den här metoden på 64-bitarsvärden resulterar det i att en matris med 64-bitars bibliotekstyper skapas, vilket är betydligt dyrare!
readString

readString(location, [contextInheritor])

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

2 Detta läser en smal sträng (aktuell kodsida) från adressutrymmet för ett felsökningsmål, konverterar den till UTF-16 och returnerar resultatet som en JavaScript-sträng. Det kan utlösa ett undantag om minnet inte kunde läsas. Den angivna platsen kan vara en adress (ett 64-bitars värde), ett platsobjekt eller ett inbyggt tecken. Om det valfria argumentet contextInheritor anges läss minnet i kontexten (t.ex. adressutrymme och felsökningsmål) som anges av argumentet. annars kommer den att läsas från felsökningsprogrammets aktuella kontext. Om det valfria längdargumentet anges kommer lässträngen att vara av den angivna längden.
readWideString

readWideString(location, [contextInheritor])

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

2 Detta läser en wide(UTF-16) sträng från adressutrymmet för ett felsökningsmål och returnerar resultatet som en JavaScript-sträng. Det kan utlösa ett undantag om minnet inte kunde läsas. Den angivna platsen kan vara en adress (ett 64-bitarsvärde), ett platsobjekt eller en intern wchar_t. Om det valfria argumentet contextInheritor anges läss minnet i kontexten (t.ex. adressutrymme och felsökningsmål) som anges av argumentet. annars kommer den att läsas från felsökningsprogrammets aktuella kontext. Om det valfria längdargumentet anges kommer lässträngen att vara av den angivna längden.

Datamodellbegrepp i JavaScript

Datamodellmappning

Följande datamodellbegrepp mappar till JavaScript.

Begrepp Internt gränssnitt JavaScript-motsvarighet
Strängkonvertering VisningsbarSträngKoncept standard: toString(...){...}
Iterbarhet IIterableConcept standard: [Symbol.iterator](){...}
Indexerbarhet IIndexableConcept protokoll: getDimensionality(...) / getValueAt(...) / setValueAt(...)
Typkonvertering vid körningstid IPreferredRuntimeTypeConcept protocol: getPreferredRuntimeTypedObject(...)

Strängkonvertering

Strängkonverteringskonceptet (IStringDisplayableConcept) översätts direkt till standardmetoden JavaScript toString . Eftersom alla JavaScript-objekt har en strängkonvertering (tillhandahålls av Object.prototype om de inte tillhandahålls någon annanstans) kan alla JavaScript-objekt som returneras till datamodellen konverteras till en visningssträng. Att åsidosätta strängkonverteringen kräver bara att du implementerar din egen toString.

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

Iterbarhet

Datamodellens begrepp om huruvida ett objekt kan itereras eller inte mappar direkt till ES6-protokollet om huruvida ett objekt kan itereras. Alla objekt som har en [Symbol.iterator]-metod anses iterbara. Implementeringen av sådan gör objektet iterbart.

Ett objekt som bara går att iterera kan ha en implementering, till exempel följande.

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";
    }
}

Särskild hänsyn måste tas till objekt som är både iterbara och indexerbara eftersom de objekt som returneras från iteratorn måste innehålla indexet samt värdet via en särskild returtyp.

Itererbar och indexerbar

Ett objekt som är iterbart och indexerbart kräver ett särskilt returvärde från iteratorn. I stället för att ge värdena ger iteratorn instanser av indexedValue. Indexen skickas som en matris i det andra argumentet till indexedValue-konstruktören. De kan vara flerdimensionella men måste matcha den dimensionalitet som returneras i indexeringsprotokollet.

Den här koden visar ett exempel på implementering.

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]);
    }
}

Indexerbarhet

Till skillnad från JavaScript gör datamodellen en mycket explicit differentiering mellan egenskapsåtkomst och indexering. Alla JavaScript-objekt som vill presentera sig som indexerbara i datamodellen måste implementera ett protokoll som består av en getDimensionality-metod som returnerar indexerarens dimensionalitet och ett valfritt par getValueAt- och setValueAt-metoder som utför läsningar och skrivningar av objektet vid angivna dikter. Det är tillåtet att utelämna antingen metoderna getValueAt eller setValueAt om objektet är läs-skyddat eller skrivskyddat.

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;
    }
}

Konvertering av körningstyp

Detta är endast relevant för JavaScript-prototyper/-klasser som är registrerade mot typsystemtyper (inbyggda). Felsökningsprogrammet kan ofta utföra analys (t.ex. Run-Time Type Information (RTTI) / v-table-analys) för att fastställa den sanna körningstidstypen för ett objekt från en statisk typ angiven i koden. En datamodell som registrerats mot en inbyggd typ kan åsidosätta det här beteendet via en implementering av IPreferredRuntimeTypeConcept. På samma sätt kan en JavaScript-klass eller prototyp som registrerats mot ett inbyggt objekt tillhandahålla en egen implementering via implementeringen av ett protokoll som består av metoden getPreferredRuntimeTypedObject.

Observera att även om den här metoden tekniskt kan returnera vilken typ som helst, anses det vara dålig praxis att returnera något som inte är den faktiska körklass eller en härledd typ. Detta kan leda till betydande förvirring för felsökarens användare. Att åsidosätta den här metoden kan dock vara värdefullt för saker som C-formatmallar för sidhuvud och objekt för implementering osv.

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);
    }
}

Se även

interna felsökningsobjekt i JavaScript-tillägg

Interna felsökningsobjekt i JavaScript-tillägg – Design- och testningsöverväganden

Skript för JavaScript-felsökningsprogram

Exempelskript för JavaScript-felsökningsprogram