2017-07-29 4 views
1

Hallo V8-Programmierer und Node-Gyp'ers. Ich bin mit OS X 10.12.6, Node v6.11.1 mit npm v3.10.10, nan v2.6.2, gcc als Teil XCode mit dieser Version Ausgabe:Wie zum Schweigen bringen "'NewInstance ist veraltet" Warnung in `node-gyp rebuild`? Was ist die Alternative zu NewInstance in v8?

$ > gcc --version 
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 
Apple LLVM version 8.1.0 (clang-802.0.42) 
Target: x86_64-apple-darwin16.7.0 
Thread model: posix 

mir bitte helfen zu verstehen, wie man richtig NewInstance nutzen und beseitigen Warnungen während des npm install oder node-gyp rebuild Prozesses meines benutzerdefinierte Paketinstallation?

> node-gyp rebuild 

    CXX(target) Release/obj.target/cellcrypt/src/cellcrypt.o 
    CC(target) Release/obj.target/cellcrypt/src/decode.o 
    CXX(target) Release/obj.target/cellcrypt/src/DecryptionWrapper.o 
../src/DecryptionWrapper.cpp:55:44: warning: 'NewInstance' is deprecated [-Wdeprecated-declarations] 
    v8::Local<v8::Object> instance = cons->NewInstance(); 
            ^
/Users/sjcbsolo/.node-gyp/6.11.1/include/node/v8.h:3276:52: note: 'NewInstance' has been explicitly marked deprecated here 
    V8_DEPRECATED("Use maybe version", Local<Object> NewInstance() const); 
              ^
1 warning generated. 
    CC(target) Release/obj.target/cellcrypt/src/Encryption.o 
    SOLINK_MODULE(target) Release/cellcrypt.node 
clang: warning: libstdc++ is deprecated; move to libc++ with a minimum deployment target of OS X 10.9 [-Wdeprecated] 

Ich möchte diese Warnungen nicht sehen, wenn ich nicht muss. Ich fand ein offenes Ticket auf github ein Update auf ein anderes Add-on-Paket Detaillierung durch die Art und Weise erfordern NewInstance aufgerufen wird:

info.GetReturnValue().Set(cons->NewInstance(argc, argv)); 
info.GetReturnValue().Set(Nan::NewInstance(cons, argc, argv).ToLocalChecked()); 

Was ist die Art und Weise bester Nan::NewInstance() zu implementieren, ohne zu viel Geschwindigkeit und Effizienz zu verletzen?

Antwort

4

Die Fehlermeldung selbst gibt Ihnen die kurze Form der Antwort: "Verwenden Sie vielleicht Version". Es versucht Ihnen zu sagen, dass es eine überladene Version von NewInstance gibt, die eine MaybeLocal (anstelle einer Local) zurückgibt, und das sollten Sie verwenden.

Der Hintergrund ist, dass die meisten Operationen fehlschlagen können, normalerweise wenn eine Ausnahme ausgelöst wird. Die alte V8-API machte es einem Embedder relativ schwer, sicher zu sein, dass sie an allen relevanten Stellen nach Ausnahmen suchte; So wurde eine neue API basierend auf MaybeLocal Rückgabetypen eingeführt. Immer, wenn Sie eine MaybeLocal erhalten, sollten Sie überprüfen, ob es tatsächlich einen Wert enthält. Wenn Sie einfach .ToLocalChecked verwenden (ohne zuerst manuell zu prüfen), bedeutet das, dass Sie einfach abstürzen, wenn etwas fehlgeschlagen ist (was in Ordnung ist, wenn Sie garantieren können, dass nichts jemals fehlschlagen wird). Auf der hellen Seite ist das nicht schlechter als das, was dein Code anscheinend immer getan hat ;-)

Verwandte Themen