ア | イ | ウ | エ | オ |
カ | キ | ク | ケ | コ |
サ | シ | ス | セ | ソ |
タ | チ | ツ | テ | ト |
ナ | ニ | ヌ | ネ | ノ |
ハ | ヒ | フ | ヘ | ホ |
マ | ミ | ム | メ | モ |
ヤ | ユ | ヨ | ||
ラ | リ | ル | レ | ロ |
ワ | ヰ | ヴ | ヱ | ヲ |
ン |
A | B | C | D | E |
F | G | H | I | J |
K | L | M | N | O |
P | Q | R | S | T |
U | V | W | X | Y |
Z | 数字 | 記号 |
SpiderMonkeyで使われている変数型の一つで、JavaScriptエンジンの内部で使うあらゆる型の要素が格納できるもの。
SpiderMonkeyにおいては、これは32ビット長の変数であり、ここに様々な値が格納される。
Firefox 4.0で採用されるJägerMonkeyでは仕様が変わり、64ビット長の変数となった。32ビットの従来のものと互換性が全く無いので、SpiderMonkeyからJägerMonkeyにJavaScriptエンジンを置き換える場合は、大幅な書き換えが必要になる可能性もある。
32ビットのうち、下位3ビットを「タグ」として扱い、変数型の識別に使う。
例えば、オブジェクトの参照(つまりポインター)は常に8バイト単位にアラインメントされており、結果、下位3ビットが常に0となる。
31ビット長整数の場合は上位31ビットが、double型/string型への参照とboolean型は上位29ビットが実際に使われる値となる。
SpiderMonkeyで実際に処理を実装しようと思えば、様々なオブジェクトを扱うことになる。整数はオブジェクトではないが、整数の「配列」はオブジェクトである。
こういったオブジェクトは、JSObject *型で値が得られる。見ての通りポインターであり、これはSpiderMonkeyが内部管理する実際の情報に対するポインターである。
オブジェクトといえども、jsval型に直接代入はできない。次のマクロを使い、相互変換する。
例えば、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型では整数は符号ありの31ビット長である。
Cの整数型とjsval型は、次のマクロを使い、相互変換する。
jsvalの整数型の最大値および最小値は、次のマクロが定義されている(おそらく内部処理用)。
31ビット長ということは、実質的に次の範囲になる。
内部的には、long型から1ビット左シフトして最下位ビットを1にしたものがjsval型である。
なお、この整数型の中に、void値であるJSVAL_VOIDが定義されている。実装にもよると思われるが、0から230を引いた値が使用されている。1ビット左シフトして最下位ビットを1にした実際のjsval内部の数値は、0x80000001である。
具体的には、次のように使われている。
実数型(jsdouble *型)と文字列型(JSString *型)も格納可能だが、これも実際には参照(ポインター)であり、内部情報の構造体を指し示している。
オブジェクトの場合と同様、8バイト単位にアラインメントされており、ポインターに変換する時には下位3ビットを切り落として0にしている。
真偽の2値のみを表わすブール値だが、専用のタグが用意され、1ビットで済む値のために29ビットの領域が提供されている。
上位29ビットが0ならFALSE、1ならTRUEであり、下位3ビットは6なので、結果として次のようになる。
64ビットのうち、下位32ビットに実際の値(オブジェクト型の参照、整数、string型の参照)を格納し、上位32ビットがタグとなる。
但しdouble型についてはIEEE-754準拠の64ビット形式で扱われるとしている。
コメントなどを投稿するフォームは、日本語対応時のみ表示されます