Wie überprüft man beim Aufruf von ObjectWrap :: Unwrap in einem Nodejs-Add-On den richtigen Typ?

8

Ich habe 2 C ++ - Klassen als JavaScript-Klassen, VanillaOption und NoomraEngine , die beide von ObjectWrap erben.

In der folgenden Methode in NoomraEngine sollte ich eine zuvor "eingepackte" VanillaOption :

erhalten %Vor%

Alles funktioniert gut, außer dass wenn ich den falschen Typ an die Methode übergebe, der Knoten in ObjectWrap::Unwrap abstürzt.

Wie kann ich sicherstellen, dass ich den korrekten Typ in args[0] ?

erhalten habe?     
BigONotation 24.01.2012, 21:09
quelle

3 Antworten

3

BEARBEITEN: Eine bessere Methode als die blanke V8-Version ist NanHasInstance ( Ссылка )

In MyObject::Init :

%Vor%

wobei prototype ein statisches Persistent<FunctionTemplate> Mitglied von MyObject ist.

Verwenden Sie so:

%Vor%

Mit dem Vorbehalt, dass dies mein erster Schritt beim Schreiben eines Knoten-Addons ist, habe ich dieses genaue Problem gelöst, indem ich den Prototyp des Objekts mit meinem eigenen Wrapper um UnWrap überprüft habe.

Hier ist ein Patch zur Addon-Factory-Class-Demo, der die Methode zeigt: Ссылка

Es werden nur fabrikgenerierte Objekte unterstützt und nicht solche, bei denen ein Konstruktor verfügbar ist, so dass Benutzer von der Basisklasse erben können. Dies könnte jedoch verallgemeinert werden, indem man die Prototypkette führt.

Zusammenfassend wird der Verweis auf den erwarteten Klassenprototyp in MyObject::Init festgehalten:

%Vor%

Und überprüft das vor dem Dereferenzieren des Objekts:

%Vor%

Alle Funktionen verwenden stattdessen CheckedUnWrap :

%Vor%

Ich habe auch darüber nachgedacht, ein internes Feld hinzuzufügen und das auf einige magische Zeiger zu setzen, aber dann wäre der Code davon abhängig gewesen, dass node::ObjectWrap nicht ändern würde, wie er die internen Felder verwendet.

    
Peter Liljenberg 28.08.2014, 18:33
quelle
3

Aktualisieren : Da NanHasInstance veraltet ist, lautet die neue Lösung für diese Antwort bool FunctionTemplate::HasInstance(Local<Value> object) . Diese Funktion gibt true zurück, wenn das angegebene Objekt eine Instanz dieser Funktionsvorlage ist.

%Vor%

Setzen Sie dann in Ihrer Funktion Wrapper::Init() das öffentliche persistente Objekt:

%Vor%

Jetzt zum Auspacken:

%Vor%     
dsamarin 28.08.2017 00:27
quelle
-1

Knoten :: Puffer :: HasInstance (args [0]);

Siehe auch: Ссылка

    
Lee Treveil 04.05.2012 15:53
quelle

Tags und Links