v8 больше не поддерживает v8 :: Value :: ToNumber? - PullRequest
0 голосов
/ 01 октября 2019

В настоящее время я ищу дополнения C ++ для node-gyp.

node-gyp configure работает нормально, но node-gyp build выдает ошибку с error C2661: 'v8::Value::ToNumber': no overloaded function take 0 parameter.

Естьнекоторые предупреждения об устаревших, и они дают ссылку на объявление в файле v8.h (в node-gyp). Однако есть только V8_DEPRECATED и V8_WARN_UNUSED_RESULT о ToNumber. Таким образом, похоже, что ошибка возникла из-за отсутствия определения около v8::Value::ToNumber в v8.h.

Ошибка возникает в последней строке кода ниже:

void someFunction(const FunctionCallbackInfo<Value>& args) {
    Isolate *iso = args.GetIsolate();
    if (args.Length() < 1) {
        iso->ThrowException(Exception::TypeError(String::NewFromUtf8(iso, "Must provide Input")));
    }

    Local<Object> coords = args[0]->ToObject()->Clone();  // note that the keys are available with coords->GetOwnPropertyNames();
    Local<Array> keys = coords->GetOwnPropertyNames();

    if (keys->Length() != 2) {
        iso->ThrowException(Exception::TypeError(String::NewFromUtf8(iso, "Need exactly 2 values")));
    }

    char props[2];
    double values[2];

    for (int i=0; i < 2; i++) {
        String::Utf8Value key(keys->Get(i)->ToString());
        props[i] = (*key)[0];
        values[i] = coords->Get(keys->Get(i))->ToNumber()->Value();
    }
    ...

Я пытался прочитать nodejsдокументы, но, кажется, нет доказательств удаления ToNumber. Также искали соответствующие вопросы, но ничего не соответствует моим: (

Возможно, это связано с версией моего узла, но мне нужно несколько ответов на мою проблему перед тестированием с версиями узла ..

I 'm используя нод: 10.16.3 npm: 6.9.0 node-gyp: 5.0.3

Спасибо за ваши чтения. Любая помощь приветствуется!

1 Ответ

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

V8 разработчик здесь. Вы не можете найти никаких доказательств удаления ToNumber, потому что оно не было удалено; -)

Просто версия функции без параметров, которая была объявлена ​​устаревшей некоторое время, наконец была отброшена,Замена - это версия, которая принимает Local<Context> в качестве параметра, см. Здесь: https://github.com/nodejs/node/blob/v10.16.3/deps/v8/include/v8.h#L2425

Технический фон заключается в том, что ToNumber может в конечном итоге выполнить JavaScript (если он вызывается для объекта с valueOf метод, например), и выполнение JavaScript зависит от контекста. Используемый для ToNumber контекст был неявным, о чем трудно было подумать, а иногда приводил к незначительным ошибкам на стороне устройства для внедрения;поэтому «новая» (за последние пару лет) API-интерфейс V8 заключается в том, чтобы сделать параметры контекста явными. Чем сложнее ваше приложение для встраивания, тем больше (надеюсь) вы оцените более очевидную структуру кода.

ToString, кстати, в одной лодке. В этом случае версия без параметров все еще существует, но она устарела;замена ToString(Local<Context> context).

...