jsval

読み:ジェイエス・バル
外語:jsval 英語
品詞:名詞

SpiderMonkeyで使われている変数型の一つで、JavaScriptエンジンの内部で使うあらゆる型の要素が格納できるもの。

目次

SpiderMonkeyにおいては、これは32ビット長の変数であり、ここに様々な値が格納される。

Firefox 4.0で採用されるJägerMonkeyでは仕様が変わり、64ビット長の変数となった。32ビットの従来のものと互換性が全く無いので、SpiderMonkeyからJägerMonkeyにJavaScriptエンジンを置き換える場合は、大幅な書き換えが必要になる可能性もある。

SpiderMonkey仕様(32ビット)

定義

usr/include/js以下で、次のように定義されている。

  • typedef long JSWord; (jstypes.h)
  • typedef JSWord jsword; (jscompat.h)
  • typedef jsword jsval; (jspubtd.h)

つまり、jsvalは間接的にlongで定義されている。

構造

32ビットのうち、下位3ビットを「タグ」として扱い、変数型の識別に使う。

例えば、オブジェクトの参照(つまりポインター)は常に8バイト単位にアラインメントされており、結果、下位3ビットが常に0となる。

  • 0b000 ‐ オブジェクトへの参照 (JSVAL_OBJECT)
  • 0bXX1 ‐ 31ビット長整数 (JSVAL_INT)
  • 0b010 ‐ double型への参照 (JSVAL_DOUBLE)
  • 0b100 ‐ string型への参照 (JSVAL_STRING)
  • 0b110 ‐ boolean型 (JSVAL_BOOLEAN)

31ビット長整数の場合は上位31ビットが、double型/string型への参照とboolean型は上位29ビットが実際に使われる値となる。

JSVAL_OBJECT

SpiderMonkeyで実際に処理を実装しようと思えば、様々なオブジェクトを扱うことになる。整数はオブジェクトではないが、整数の「配列」はオブジェクトである。

こういったオブジェクトは、JSObject *型で値が得られる。見ての通りポインターであり、これはSpiderMonkeyが内部管理する実際の情報に対するポインターである。

オブジェクトといえども、jsval型に直接代入はできない。次のマクロを使い、相互変換する。

  • OBJECT_TO_JSVAL(obj) ‐ (JSObject *)→(jsval)
  • JSVAL_TO_OBJECT(v) ‐ (jsval)→(JSObject *)

例えば、num個のint型配列dataを配列オブジェクトに変換する処理は、次のようになる。

JSObject *array_obj = JS_NewArrayObject (cx, num, NULL);
int i;
for (i = 0; i < num; ++i)
{
  jsval val = INT_TO_JSVAL(data[i]);
  JS_SetElement (cx, array_obj, i, &val);
}

また、このオブジェクト型のなかに、NULL値であるJSVAL_NULLが定義されている。実装にもよると思われるが、「(jsval)0」つまり値0が使用されている。

JSVAL_INT

整数を結果として返す機会も多くある。jsval型では整数は符号ありの31ビット長である。

Cの整数型とjsval型は、次のマクロを使い、相互変換する。

  • INT_TO_JSVAL(obj) ‐ (long)→(jsval)
  • JSVAL_TO_INT(v) ‐ (jsval)→(long)

jsvalの整数型の最大値および最小値は、次のマクロが定義されている(おそらく内部処理用)。

  • JSVAL_INT_MIN
  • JSVAL_INT_MAX

31ビット長ということは、実質的に次の範囲になる。

  • JSVAL_INT_MIN=-1073741823
  • JSVAL_INT_MAX=1073741823 (0x3fffffff)

内部的には、long型から1ビット左シフトして最下位ビットを1にしたものがjsval型である。

なお、この整数型の中に、void値であるJSVAL_VOIDが定義されている。実装にもよると思われるが、0から230を引いた値が使用されている。1ビット左シフトして最下位ビットを1にした実際のjsval内部の数値は、0x80000001である。

具体的には、次のように使われている。

  • 0x00000001〜0x7fffffff … 0〜0x3ffffffまでの正の整数
  • 0x80000001 … JSVAL_VOID
  • 0x80000003〜0xffffffff … −1〜−0x3ffffffまでの負の整数

JSVAL_DOUBLE、JSVAL_STRING

実数型(jsdouble *型)と文字列型(JSString *型)も格納可能だが、これも実際には参照(ポインター)であり、内部情報の構造体を指し示している。

オブジェクトの場合と同様、8バイト単位にアラインメントされており、ポインターに変換する時には下位3ビットを切り落として0にしている。

  • DOUBLE_TO_JSVAL(dp) ‐ (jsdouble *)→(jsval)
  • JSVAL_TO_DOUBLE(v) ‐ (jsval)→(jsdouble *)
  • STRING_TO_JSVAL(str) ‐ (JSString *)→(jsval)
  • JSVAL_TO_STRING(v) ‐ (jsval)→(JSString *)

JSVAL_BOOLEAN

真偽の2値のみを表わすブール値だが、専用のタグが用意され、1ビットで済む値のために29ビットの領域が提供されている。

上位29ビットが0ならFALSE、1ならTRUEであり、下位3ビットは6なので、結果として次のようになる。

  • JSVAL_FALSE … 0x6
  • JSVAL_TRUE … 0xE

JägerMonkey仕様(64ビット)

64ビットのうち、下位32ビットに実際の値(オブジェクト型の参照、整数、string型の参照)を格納し、上位32ビットがタグとなる。

但しdouble型についてはIEEE-754準拠の64ビット形式で扱われるとしている。

用語の所属
JavaScript

コメントなどを投稿するフォームは、日本語対応時のみ表示されます


KisoDic通信用語の基礎知識検索システム WDIC Explorer Version 7.04a (27-May-2022)
Search System : Copyright © Mirai corporation
Dictionary : Copyright © WDIC Creators club