4534: BEGIN_CASE(JSOP_GETELEM) 4535: /* Open-coded ELEMENT_OP optimized for strings and dense arrays. */ 4536: lval = FETCH_OPND(-2); 4537: rval = FETCH_OPND(-1); 4538: if (JSVAL_IS_STRING(lval) && JSVAL_IS_INT(rval)) { /* 文字列の数値的プロパティに関する処理 */ 4548: } 4549: 4550: VALUE_TO_OBJECT(cx, -2, lval, obj); 4551: if (JSVAL_IS_INT(rval)) { 4552: if (OBJ_IS_DENSE_ARRAY(cx, obj)) { /* 密な配列の数値的プロパティに関する処理 */ 4566: } 4567: id = INT_JSVAL_TO_JSID(rval); 4568: } else { 4569: if (!js_InternNonIntElementId(cx, obj, rval, &id)) 4570: goto error; 4571: } 4572: 4573: if (!OBJ_GET_PROPERTY(cx, obj, id, &rval)) 4574: goto error; 4575: end_getelem: 4576: regs.sp--; 4577: STORE_OPND(-1, rval); 4578: END_CASE(JSOP_GETELEM)ひとつのブロックが BEGIN で始まって END で終わっているような気がしますが、これは C 言語のソースコードです。今の場合、lval には正規表現オブジェクト (へのポインタ)、rval には整数値 -1 が含まれることになります。lval、rval はともに jsval 型ですが、プロパティの操作に当たっては JSObject へのポインタ型と jsid 型の値を使うので、4550 行目で正規表現オブジェクト (へのポインタ) を JSObject へのポインタ型に、4567 行目で整数値を jsid 型に変換しています。
4573 行目のいざプロパティを取得する段では、取得結果を収める変数として rval を再利用しています。正規表現オブジェクトの場合、OBJ_GET_PROPERTY マクロによるプロパティの取得は js_GetProperty 関数 (JS_GetProperty 関数とは別物。大文字の JS から始まる関数は外部 API) を経て js_GetPropertyHelper 関数の呼び出しにつながります。
/* jsobj.c */3644: JSBool 3645: js_GetPropertyHelper(JSContext *cx, JSObject *obj, jsid id, jsval *vp, 3646: JSPropCacheEntry **entryp) 3647: { 3648: uint32 type; 3649: int protoIndex; 3650: JSObject *obj2; 3651: JSProperty *prop; 3652: JSScopeProperty *sprop; 3653: 3654: /* Convert string indices to integers if appropriate. */ 3655: CHECK_FOR_STRING_INDEX(id); 3656: JS_COUNT_OPERATION(cx, JSOW_GET_PROPERTY); 3657: 3658: type = OBJ_SCOPE(obj)->shape; 3659: protoIndex = js_LookupPropertyWithFlags(cx, obj, id, 0, &obj2, &prop); 3660: if (protoIndex < 0) 3661: return JS_FALSE; 3662: if (!prop) { 3663: jsbytecode *pc; 3664: 3665: *vp = JSVAL_VOID; 3666: 3667: if (!OBJ_GET_CLASS(cx, obj)->getProperty(cx, obj, ID_TO_VALUE(id), vp)) 3668: return JS_FALSE; 3669: /* プロパティキャッシュに関する処理 */ /* 最終的にプロパティが存在しなかった場合の処理 */ 3716: return JS_TRUE; 3717: } 3718: /* すでにプロパティが存在する場合の処理 */ /* プロパティキャッシュに関する処理 */ 3733: return JS_TRUE; 3734: }
3659 行目でプロパティの探索を行いますが、-1 という名前のプロパティは本来正規表現オブジェクトに存在しないので見つからず、変数 prop の値は NULL になります。すると、3667 行目で、正規表現オブジェクトに共通するプロパティ取得時用フック関数 (regexp_getProperty 関数) が、整数 -1 (を表す jsval 型の値) とともに呼び出されるのです。
/* jsregexp.c */
セコメントをする