9

C++プログラムの補助言語としてV8を埋め込んでいます。

Handle<Value>次のようなものを呼び出すと、V8からを取得します

Handle<Value> value_handle = context->Global()->Get(key_handle);

次に、それが(たとえば)。を含む文字列であることがわかりますvalue_handle->IsString()。もしそうなら、私はそれをに変換して、Handle<String>その文字列固有のメソッドにアクセスすることができます。

しかし、それを行うには2つの方法があるようです。

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

また

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

ただし、配列と関数の場合、toArray()メソッドはなくtoFunction、キャストのみです。

だから私の質問は:a)ToXXXキャスティングのためのちょうど構文糖衣ですか?そして、そうでない場合b)ToXXXメソッドは何をしていますか?

4

2 に答える 2

9

ToXXX関数は、ECMA-2625thのセクション9のサブセクションで説明されているように型強制を実行します。たとえば、セクション9.8ToStringで説明されています。文字列以外の値が指定されると、適切な文字列表現が返されます。オブジェクトを渡す場合は、そのオブジェクトのメソッドが呼び出されます(存在しない場合)。に関連するコード:toStringvalueOftoStringToStringapi.cc Value::ToStringruntime.js ToString

一方、Handle<XXX>::Cast(...)強制はありません。ハンドル用の型キャストです。本質的にそれはただのstatic_cast<XXX*>です。デバッグモードHandle<T>::Cast(...)ではチェックされ、タイプが一致しない場合は実行を中止します。Handle<Value>を含むが与えられ、Objectそれをにキャストしようとすると、致命的なエラーになりますHandle<String>。リリースモードでは、互換性のないタイプにキャストすると、キャストの結果を使用しようとすると、後で奇妙な結果が発生し、クラッシュする可能性があります。を介してキャストをチェックする(チェックが有効になっている場合)に委任する関連コードv8.h Handle<T>::Cast(たとえば)。String::CastString::CheckCast

于 2013-02-22T09:40:48.077 に答える
0

見つけることができます

V8EXPORTローカルToString()const;

v8.h V8EXPORTがOSに依存する関数のアプローチである971行目。


文字列のハンドルの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()を使用することを強くお勧めします。

于 2013-02-22T06:08:50.950 に答える