val.h

Embind C++クラスemscripten::valval.hで定義)は、JavaScriptコードをC++に書き換えるために使用されます。

このクラスのガイド資料は、valを使用してJavaScriptをC++に書き換えるにあります。

class emscripten::val

このクラスは、任意のJavaScriptオブジェクトを表現(および便利なアクセスを提供)するために使用できるC++データ型です。これを使用して、JavaScriptオブジェクトを呼び出したり、そのプロパティを読み書きしたり、boolintstd::stringのようなC++値に強制的に変換したりできます。

たとえば、以下のコードは、URLでXHRリクエストを行うためのいくつかの簡単なJavaScriptを示しています。

var xhr = new XMLHttpRequest;
xhr.open("GET", "http://url");

同じコードは、グローバルXMLHttpRequestオブジェクトのシンボルを取得するためにglobal()を使用し、それを使用してURLを開くことにより、C++で記述できます。

val xhr = val::global("XMLHttpRequest").new_();
xhr.call<void>("open", std::string("GET"), std::string("http://url"));

オブジェクトプロパティを読み取るにはoperator[]()を使用し、型を強制的に変換するにはas()を使用して、openメソッドの呼び出しが成功したかどうかをテストできます。

const char* state;
switch (xhr["readyState"].as<int>()) {
case 0:
  state = "UNSENT"; break;
case 1:
  state = "OPENED"; break;
default:
  state = "etc";
}

他の例については、valを使用してJavaScriptをC++に書き換えるを参照してください。

警告

JavaScriptの値はスレッド間で共有できないため、それらをバインドするvalインスタンスも共有できません。

たとえば、JavaScriptのグローバル変数をvalとしてキャッシュする場合は、各スレッドで名前によってグローバル変数の個別のインスタンスを取得してバインドする必要があります。これを行う最も簡単な方法は、thread_local宣言を使用することです。

thread_local const val Uint8Array = val::global("Uint8Array");
static val array()

新しいArrayを作成して返します。

static val object()

新しいObjectを作成して返します。

static val u8string(const char *s)

UTF-8エンコーディングの文字列リテラルからvalを作成します。

static val u16string(const char16_t *s)

UTF-16エンコーディングの文字列リテラルからvalを作成します。

static val undefined()

undefinedを表すvalを作成します。

static val null()

nullを表すvalを作成します。

EM_VAL as_handle() const

このvalを表す生のハンドルを返します。これは、JavaScriptに生の値ハンドルを渡し、Emval.toValue関数を介して反対側で値を取得するために使用できます。例

EM_JS(void, log_value, (EM_VAL val_handle), {
  var value = Emval.toValue(val_handle);
  console.log(value); // 42
});

val foo(42);
log_value(foo.as_handle());
static val take_ownership(EM_VAL e)

生のハンドルからvalを作成します。これは、JavaScriptから値を取得するために使用できます。JavaScript側では、値をEmval.toHandleでラップし、C++に渡し、C++ではtake_ownershipを使用してvalインスタンスに変換できます。例

EM_ASYNC_JS(EM_VAL, fetch_json_from_url, (const char *url), {
  var url = UTF8ToString(url);
  var response = await fetch(url);
  var json = await response.json();
  return Emval.toHandle(json);
});

val obj = val::take_ownership(fetch_json_from_url("https://httpbin.org/json"));
std::string author = obj["slideshow"]["author"].as<std::string>();
static val global(const char *name)

指定されたnameでグローバル値を検索します。

static val module_property(const char *name)

Emscripten Moduleオブジェクトで、指定されたnameで値を検索します。

explicit val(T &&value)

コンストラクター。

Embind互換のC++型から変換してvalを作成します。例えば、val(true)val(std::string("foo"))のように使用します。

explicit val(const char *v)

文字列リテラルからvalインスタンスを構築します。

val(val &&v)

値を新しいvalインスタンスに所有権を移動します。

val(const val &v)

提供されたvalインスタンスの背後にある同じ値への別の参照を作成します。

~val()

参照カウントを減らすことで、現在バインドされている値を削除します。

val &operator=(val &&v)

現在バインドされている値への参照を削除し、提供された値の所有権を引き継ぎます。

val &operator=(const val &v)

現在バインドされている値への参照を削除し、提供されたvalインスタンスの背後にある値への別の参照を作成します。

bool hasOwnProperty(const char *key) const

JavaScriptオブジェクトが、指定された名前の独自の(継承されていない)プロパティを持っているかどうかを確認します。

val new_(Args&&... args) const

現在の値がコンストラクターであると仮定し、そのインスタンスを作成します。JavaScriptの式new currentValue(…)と同等です。

val operator[](const T &key) const

JavaScriptオブジェクトの指定された(key)プロパティを取得します。

void set(const K &key, const val &v)

valを介してアクセスされる)JavaScriptオブジェクトの指定された(key)プロパティに値vを設定します。

val operator()(Args&&... args) const

現在の値が関数であると仮定し、提供された引数で呼び出します。

ReturnValue call(const char *name, Args&&... args) const

現在のオブジェクトに対して、指定されたメソッド(name)を、提供された引数で呼び出します。

T as() const

現在の値を指定されたC++型に変換します。

val typeof() const

現在の値で呼び出されたJavaScriptのtypeof演算子の結果を返します。

std::vector<T> vecFromJSArray(const val &v)

JavaScript配列をstd::vector<T>にコピーし、各要素を.as<T>()を使用して変換します。数値を使用する、より効率的だが安全でないバージョンについては、convertJSArrayToNumberVectorを参照してください。

パラメーター

val v – コピーするJavaScript配列

戻り値

javascript配列から作成されたstd::vector<T>

std::vector<T> convertJSArrayToNumberVector(const val &v)

JavaScript配列を、各要素に対してjavascriptのNumber()関数を使用するように、効率的にstd::vector<T>に変換します。これは、2つ以上の値を持つ配列ではvecFromJSArrayよりもはるかに効率的ですが、数値以外の値の配列には適していません。型チェックは行われないため、無効な配列エントリは、NaN値(または整数型の場合は0)に置き換えられます。

パラメーター

val v – コピーするJavaScript(型付き)配列

戻り値

javascript配列から作成されたstd::vector<T>

val await() const

Promise/thenable をawaitするために、C++を一時停止します。

戻り値

完了した値。

注意

このメソッドでは、ASYNCIFYを有効にする必要があります。

val operator co_await() const

co_await演算子を使用すると、valで表されるJavaScriptのPromiseを待機できます。

これは、C++20のコルーチンと互換性がありますが、通常は、Promiseにもなるvalを返すコルーチン内で使用する必要があります。

例えば、このJavaScriptのasync/await関数と同等のものを実装することができます。

async function foo() {
  const response = await fetch("http://url");
  const json = await response.json();
  return json;
}

export { foo };

C++コルーチンとして。

val foo() {
  val response = co_await val::global("fetch")(std::string("http://url"));
  val json = co_await response.call<val>("json");
  return json;
}

EMSCRIPTEN_BINDINGS(module) {
  function("foo", &foo);
}

await()メソッドとは異なり、ネイティブなC++コルーチン変換を使用するため、Asyncifyは必要ありません。

戻り値

このPromiseの完了値を表すval