V8包装到所有访问器和模板回调函数

时间:2017-05-19 14:50:50

标签: c++ c++14 v8

背景:我必须更新旧的V8嵌入式代码(到5.8版)。较新的版本引入了类型MaybeLocal<>以确保您处理空的Local<>句柄。

为了处理空句柄,我写了一个简短的转换方法,如果句柄为空则抛出异常:

template<typename C>
inline v8::Local<C>
toLocalHandle(const v8::MaybeLocal<C> &handle)
{
    if (handle.IsEmpty())
        throw JSBaseClass::TerminateEx();
    return handle.ToLocalChecked();
}

现在我必须在任何访问器和函数回调中捕获该异常。我已经创建了宏来为回调函数创建包装器:

#define CREATE_V8_FUNCTION_CALLBACK_WRAPPER(fktName)     \
    static void wrap_##fktName(                          \
        const v8::FunctionCallbackInfo<v8::Value> &info) \
    {                                                    \
        try {                                            \
            fktName(info);                               \
        }                                                \
        catch (JSBaseClass::TerminateEx &ex)             \
        {                                                \
            return;                                      \
        }                                                \
    };                                                   \

#define V8_FUNCTION_WRAPPER(fktName) wrap_ ## fktName

现在我用它来为我的函数回调声明包装器:

static void
myFunc(const v8::FunctionCallbackInfo<v8::Value> &info);

CREATE_V8_FUNCTION_CALLBACK_WRAPPER(myFunc)

并使用另一个宏将回调包装器绑定到模板:

Local<ObjectTemplate> tmpl = ...
...
tmpl->Set(utf8_to_string("myFkt"),
          FunctionTemplate::New(isolate, V8_FUNCTION_WRAPPER(myFkt)));

现在我的问题:在C ++&lt; = 2014中没有宏的情况下有一个很好的方法吗?

0 个答案:

没有答案