Узел 12 (v8) - преобразование устаревшего кода в «возможно» версию - PullRequest
0 голосов
/ 03 октября 2019

Я решил обновить Node до 12.11. Из-за этого у меня возникают ошибки компиляции в некоторых модулях, которые я использую. У меня есть некоторый опыт работы с C ++, но я никогда не использовал v8. Мне удалось исправить большинство ошибок, связанных с ранее устаревшими и теперь удаленными функциями, но есть одна проблема, которую я не могу решить:

v8::Local<v8::Object> obj = size->ToObject();
if(obj->Has(columns))
    w->ws_col = obj->Get(columns)->Uint32Value();
if(obj->Has(rows))
    w->ws_row = obj->Get(rows)->Uint32Value();

ToObject() было удалено, поэтому япридумал это:

v8::Local<v8::Object> obj = Nan::To<v8::Object>(size).ToLocalChecked();

Проблема в том, что нет v8::Object::Has(v8::Local<v8::String>&) метода. Как я могу сделать вызовы Has совместимыми с новой версией?

1 Ответ

1 голос
/ 04 октября 2019

Незаменимая замена старой ToObject() - MaybeLocal<Object> v8::Value::ToObject(Local<Context> context);использование Nan конечно возможно, но не обязательно. Обратите внимание, что .ToLocalChecked вызовет сбой, если было сгенерировано исключение и отсутствует значение результата, это может произойти, например, если вы вызываете эту функцию на null или undefined. Тип результата MaybeLocal предназначен для того, чтобы сделать очевидным, что код встроенного кода должен проверять это и обрабатывать исключения соответствующим образом.

Точно так же, не устаревшие версии Has() - это две, которые принимают контекстпараметры: Maybe<bool> v8::Object::Has(Local<Context> context, Local<Value> key) и Maybe<bool> v8::Object::Has(Local<Context> context, uint32_t index). Maybe<bool>, которые они возвращают, - ничто (.IsNothing() == true), если было сгенерировано исключение, в противном случае это bool с результатом.

...