如何将 v8::Local<v8::Value> 转换为 uint32_t

How to convert a v8::Local<v8::Value> into a uint32_t

给定以下代码,我如何将 v8::Local 转换为 uint32_t。还是其他基于Is*方法的类型?

v8::Local<v8::Value> value;
v8::Local<v8::Context> context = v8::Context::New(v8::Isolate::GetCurrent());
if(value->IsUint32()) {
   v8::MaybeLocal<Int32> maybeLocal = value->Uint32Value(context);
   uint32_t i = maybeLocal;
}

您发布的代码无效,因为 value->Uint32Value(context) 没有 return 和 v8::MaybeLocal<Int32>。 C++ 类型是你的朋友(就像 TypeScript 一样)!

你有两种可能:

(1) 您可以使用 Value::Uint32Value(...),其中 return 是 Maybe<uint32_t>。由于您已经检查了 value->IsUint32(),此转换不会失败,因此您可以使用 Maybe::ToChecked().

提取包裹在 Maybe 中的 uint32_t

(2) 您可以使用 Value::ToUint32(...),其中 return 是 MaybeLocal<Uint32>。同样,由于您已经检查了 value->IsUint32(),它不会失败,因此您可以通过 MaybeLocal::ToLocalChecked() 获得 Local<Uint32>,然后只需使用 -> 语法调用包装的 Uint32Value()方法,它给出了uint32_t.
如果您只对最后的 uint32_t 感兴趣(而不对中间的 Local<Uint32> 感兴趣,您可以将其传递回 JavaScript),那么选项 (1) 的效率会稍微高一些。

请注意,IsUint32() 会像 {valueOf: () => 42; } 一样为 objects 说 false。如果你想处理这样的objects,那么尝试转换,并处理失败,例如:

Maybe<uint32_t> maybe_uint = value->Uint32Value(context);
if (maybe_uint.IsJust()) {
  uint32_t i = maybe_uint.FromJust();
} else {
  // Conversion failed. Maybe it threw an exception (use a `v8::TryCatch` to catch it), or maybe the object wasn't convertible to a uint32.
  // Handle that somehow.
}

另外请注意,大多数这些概念都在 V8 的 samples and API tests 中进行了说明。阅读 API headers 中的评论和实现本身也提供了很多见解。

最后说明:您可能希望跟踪您正在使用的当前上下文,而不是每次需要时都创建一个新的上下文。