在v8中为值句柄转换为ToXXX

时间:2013-02-22 04:54:16

标签: javascript c++ v8

我在V ++程序中嵌入V8作为辅助语言。

当我打电话给

时,我从V8中检索Handle<Value>
Handle<Value> value_handle = context->Global()->Get(key_handle);

然后我可以发现它是(比方说)带有value_handle->IsString()的字符串。如果是这样,我可以将其转换为Handle<String>以访问其特定于字符串的方法。

但似乎有两种方法可以做到:

Handle<String> string = value_handle->ToString();

Handle<String> string = Handle<String>::Cast(value_handle);

但是,对于数组和函数,没有toArray()toFunction方法,只有转换。

所以我的问题是: a)ToXXX只是用于铸造的语法糖? 并且,如果不是b)ToXXX方法在做什么?

2 个答案:

答案 0 :(得分:8)

ToXXX函数执行类型强制,如ECMA-262 5th的section 9小节中所述。例如,section 9.8中描述了ToString:当给定非字符串值时,它将返回一个适当的字符串表示形式,如果您正在传递对象,它将调用toString方法它(如果valueOf不存在,则为toString)。调用ToString Value::ToString

api.cc ToString runtime.js的相关代码

另一方面,Handle<XXX>::Cast(...)没有强制。它只是手柄的类型转换。基本上它只是一个static_cast<XXX*>。在调试模式下,检查Handle<T>::Cast(...)并在类型不匹配时中止执行。如果您获得包含Handle<Value>的{​​{1}}并且您正尝试将其投放到Object,则会出现致命错误。在释放模式下,当您尝试使用强制转换的结果时,转换为不兼容的类型将导致奇怪的结果并可能导致崩溃。 Handle<String> Handle<T>::Cast中的相关代码委托(例如)String::Cast通过String::CheckCast检查演员表(如果启用了支票)。

答案 1 :(得分:0)

我们可以找到

  

V8EXPORT Local ToString()const;

v8.h的第971行

其中V8EXPORT是一种依赖于操作系统的函数方法。


Handle of String的ToString位于api.cc的第2362行

Local<String> Value::ToString() const {
  i::Handle<i::Object> obj = Utils::OpenHandle(this);
  i::Handle<i::Object> str;
  if (obj->IsString()) {
    str = obj;
  } else {
    i::Isolate* isolate = i::Isolate::Current();
    if (IsDeadCheck(isolate, "v8::Value::ToString()")) {
      return Local<String>();
    }
    LOG_API(isolate, "ToString");
    ENTER_V8(isolate);
    EXCEPTION_PREAMBLE(isolate);
    str = i::Execution::ToString(obj, &has_pending_exception);
    EXCEPTION_BAILOUT_CHECK(isolate, Local<String>());
  }
  return Local<String>(ToApi<String>(str));
}

为了保持一致性并从V8版本的进一步升级中获益,我强烈建议使用toString()而不是原始版本。