Remove default parameter for guard, specify MISMATCH_EXIT explicitly.

This commit is contained in:
Andreas Gal 2008-08-11 15:40:04 -07:00
parent 00e5631b45
commit 020e68ab1e
3 changed files with 46 additions and 42 deletions

View File

@ -1699,9 +1699,10 @@ js_ExecuteTree(JSContext* cx, Fragment* f, uintN& inlineCallCount)
fp->regs->pc = (jsbytecode*)lr->from->root->ip + e->ip_adj;
#if defined(DEBUG) && defined(NANOJIT_IA32)
printf("leaving trace at %s:%u@%u, sp=%p, ip=%p, cycles=%llu\n",
printf("leaving trace at %s:%u@%u, exitType=%d, sp=%p, ip=%p, cycles=%llu\n",
fp->script->filename, js_PCToLineNumber(cx, fp->script, fp->regs->pc),
fp->regs->pc - fp->script->code,
lr->exit->exitType,
state.sp, lr->jmp,
(rdtsc() - start));
#endif
@ -1916,7 +1917,7 @@ TraceRecorder::ifop()
guard(JSSTRING_LENGTH(JSVAL_TO_STRING(v)) == 0,
lir->ins_eq0(lir->ins2(LIR_and,
lir->insLoadi(get(&v), offsetof(JSString, length)),
INS_CONST(JSSTRING_LENGTH_MASK))));
INS_CONST(JSSTRING_LENGTH_MASK))), BRANCH_EXIT);
} else {
JS_NOT_REACHED("ifop");
}
@ -2138,7 +2139,7 @@ TraceRecorder::map_is_native(JSObjectMap* map, LIns* map_ins, LIns*& ops_ins, si
if (OP(map->ops) == OP(&js_ObjectOps)) {
guard(true, addName(lir->ins2(LIR_eq, n, lir->insImmPtr((void*) OP(&js_ObjectOps))),
"guard(native-map)"));
"guard(native-map)"), MISMATCH_EXIT);
return true;
}
@ -2229,7 +2230,8 @@ TraceRecorder::test_property_cache(JSObject* obj, LIns* obj_ins, JSObject*& obj2
}
LIns* shape_ins = addName(lir->insLoadi(map_ins, offsetof(JSScope, shape)), "shape");
guard(true, addName(lir->ins2i(LIR_eq, shape_ins, entry->kshape), "guard(shape)"));
guard(true, addName(lir->ins2i(LIR_eq, shape_ins, entry->kshape), "guard(shape)"),
MISMATCH_EXIT);
if (PCVCAP_TAG(entry->vcap) == 1) {
JS_ASSERT(OBJ_SCOPE(obj2)->shape == PCVCAP_SHAPE(entry->vcap));
@ -2244,7 +2246,7 @@ TraceRecorder::test_property_cache(JSObject* obj, LIns* obj_ins, JSObject*& obj2
shape_ins = addName(lir->insLoadi(map_ins, offsetof(JSScope, shape)), "shape");
guard(true, addName(lir->ins2i(LIR_eq, shape_ins, PCVCAP_SHAPE(entry->vcap)),
"guard(vcap_shape)"));
"guard(vcap_shape)"), MISMATCH_EXIT);
}
}
@ -2419,7 +2421,7 @@ TraceRecorder::unbox_jsval(jsval v, LIns*& v_ins)
lir->ins2i(LIR_eq,
lir->ins2(LIR_and, v_ins,
lir->insImmPtr((void*)JSVAL_TAGMASK)),
JSVAL_DOUBLE))));
JSVAL_DOUBLE))), MISMATCH_EXIT);
v_ins = lir->insCall(F_UnboxDouble, &v_ins);
return true;
}
@ -2428,20 +2430,20 @@ TraceRecorder::unbox_jsval(jsval v, LIns*& v_ins)
guard(true,
lir->ins2i(LIR_eq,
lir->ins2(LIR_and, v_ins, lir->insImmPtr((void*)JSVAL_TAGMASK)),
JSVAL_BOOLEAN));
JSVAL_BOOLEAN), MISMATCH_EXIT);
v_ins = lir->ins2i(LIR_ush, v_ins, JSVAL_TAGBITS);
return true;
case JSVAL_OBJECT:
guard(true,
lir->ins2i(LIR_eq,
lir->ins2(LIR_and, v_ins, lir->insImmPtr((void*)JSVAL_TAGMASK)),
JSVAL_OBJECT));
JSVAL_OBJECT), MISMATCH_EXIT);
return true;
case JSVAL_STRING:
guard(true,
lir->ins2i(LIR_eq,
lir->ins2(LIR_and, v_ins, lir->insImmPtr((void*)JSVAL_TAGMASK)),
JSVAL_STRING));
JSVAL_STRING), MISMATCH_EXIT);
v_ins = lir->ins2(LIR_and, v_ins, lir->insImmPtr((void*)~JSVAL_TAGMASK));
return true;
}
@ -2455,7 +2457,7 @@ TraceRecorder::getThis(LIns*& this_ins)
if (JSVAL_IS_NULL(cx->fp->argv[-1]))
return false;
this_ins = get(&cx->fp->argv[-1]);
guard(false, lir->ins_eq0(this_ins));
guard(false, lir->ins_eq0(this_ins), MISMATCH_EXIT);
} else { /* in global code */
JS_ASSERT(!JSVAL_IS_NULL(cx->fp->argv[-1]));
this_ins = lir->insLoadi(lir->insLoadi(cx_ins, offsetof(JSContext, fp)),
@ -2475,7 +2477,8 @@ TraceRecorder::guardClass(JSObject* obj, LIns* obj_ins, JSClass* clasp)
char namebuf[32];
JS_snprintf(namebuf, sizeof namebuf, "guard(class is %s)", clasp->name);
guard(true, addName(lir->ins2(LIR_eq, class_ins, lir->insImmPtr(clasp)), namebuf));
guard(true, addName(lir->ins2(LIR_eq, class_ins, lir->insImmPtr(clasp)), namebuf),
MISMATCH_EXIT);
return true;
}
@ -2496,15 +2499,15 @@ TraceRecorder::guardDenseArrayIndex(JSObject* obj, jsint idx, LIns* obj_ins,
LIns* length_ins = stobj_get_fslot(obj_ins, JSSLOT_ARRAY_LENGTH);
// guard(index >= 0)
guard(true, lir->ins2i(LIR_ge, idx_ins, 0));
guard(true, lir->ins2i(LIR_ge, idx_ins, 0), MISMATCH_EXIT);
// guard(index < length)
guard(true, lir->ins2(LIR_lt, idx_ins, length_ins));
guard(true, lir->ins2(LIR_lt, idx_ins, length_ins), MISMATCH_EXIT);
// guard(index < capacity)
guard(false, lir->ins_eq0(dslots_ins));
guard(false, lir->ins_eq0(dslots_ins), MISMATCH_EXIT);
guard(true, lir->ins2(LIR_lt, idx_ins,
lir->insLoadi(dslots_ins, 0 - sizeof(jsval))));
lir->insLoadi(dslots_ins, 0 - sizeof(jsval))), MISMATCH_EXIT);
return true;
}
@ -3014,7 +3017,8 @@ TraceRecorder::record_JSOP_SETPROP()
// The global object's shape is guarded at trace entry.
if (obj != globalObj) {
LIns* shape_ins = addName(lir->insLoadi(map_ins, offsetof(JSScope, shape)), "shape");
guard(true, addName(lir->ins2i(LIR_eq, shape_ins, kshape), "guard(shape)"));
guard(true, addName(lir->ins2i(LIR_eq, shape_ins, kshape), "guard(shape)"),
MISMATCH_EXIT);
}
JSScope* scope = OBJ_SCOPE(obj);
@ -3022,7 +3026,7 @@ TraceRecorder::record_JSOP_SETPROP()
if (scope->object != obj || !SCOPE_HAS_PROPERTY(scope, sprop)) {
LIns* args[] = { lir->insImmPtr(sprop), obj_ins, cx_ins };
LIns* ok_ins = lir->insCall(F_AddProperty, args);
guard(false, lir->ins_eq0(ok_ins));
guard(false, lir->ins_eq0(ok_ins), MISMATCH_EXIT);
}
LIns* dslots_ins = NULL;
@ -3046,7 +3050,7 @@ TraceRecorder::record_JSOP_GETELEM()
if (JSVAL_IS_STRING(l) && JSVAL_IS_INT(r)) {
LIns* args[] = { f2i(get(&r)), get(&l), cx_ins };
LIns* unitstr_ins = lir->insCall(F_String_getelem, args);
guard(false, lir->ins_eq0(unitstr_ins));
guard(false, lir->ins_eq0(unitstr_ins), MISMATCH_EXIT);
set(&l, unitstr_ins);
return true;
}
@ -3063,7 +3067,8 @@ TraceRecorder::record_JSOP_GETELEM()
LIns* args[] = { get(&r), get(&l), cx_ins };
LIns* v_ins = lir->insCall(F_Any_getelem, args);
guard(false, lir->ins2(LIR_eq, v_ins, lir->insImmPtr((void*)JSVAL_ERROR_COOKIE)));
guard(false, lir->ins2(LIR_eq, v_ins, lir->insImmPtr((void*)JSVAL_ERROR_COOKIE)),
MISMATCH_EXIT);
if (!unbox_jsval(v, v_ins))
ABORT_TRACE("JSOP_GETELEM");
set(&l, v_ins);
@ -3099,7 +3104,7 @@ TraceRecorder::record_JSOP_SETELEM()
ABORT_TRACE("boxing string-indexed JSOP_SETELEM value");
LIns* args[] = { v_ins, get(&r), get(&l), cx_ins };
LIns* ok_ins = lir->insCall(F_Any_setelem, args);
guard(false, lir->ins_eq0(ok_ins));
guard(false, lir->ins_eq0(ok_ins), MISMATCH_EXIT);
set(&l, unboxed_v_ins);
return true;
}
@ -3115,7 +3120,7 @@ TraceRecorder::record_JSOP_SETELEM()
/* we have to check that its really an integer, but this check will to go away
once we peel the loop type down to integer for this slot */
guard(true, lir->ins2(LIR_feq, get(&r), lir->ins1(LIR_i2f, idx_ins)));
guard(true, lir->ins2(LIR_feq, get(&r), lir->ins1(LIR_i2f, idx_ins)), MISMATCH_EXIT);
/* ok, box the value we are storing, store it and we are done */
LIns* v_ins = get(&v);
LIns* boxed_ins = v_ins;
@ -3123,7 +3128,7 @@ TraceRecorder::record_JSOP_SETELEM()
ABORT_TRACE("boxing failed");
LIns* args[] = { boxed_ins, idx_ins, obj_ins, cx_ins };
LIns* res_ins = lir->insCall(F_Array_dense_setelem, args);
guard(false, lir->ins_eq0(res_ins));
guard(false, lir->ins_eq0(res_ins), MISMATCH_EXIT);
jsbytecode* pc = cx->fp->regs->pc;
if (*pc == JSOP_SETELEM && pc[JSOP_SETELEM_LENGTH] != JSOP_POP)
@ -3162,7 +3167,7 @@ TraceRecorder::guardShapelessCallee(jsval& callee)
guard(true,
addName(lir->ins2(LIR_eq, get(&callee), lir->insImmPtr((void*) JSVAL_TO_OBJECT(callee))),
"guard(shapeless callee)"));
"guard(shapeless callee)"), MISMATCH_EXIT);
return true;
}
@ -3401,7 +3406,7 @@ TraceRecorder::prop(JSObject* obj, LIns* obj_ins, uint32& slot, LIns*& v_ins)
*/
if (obj == globalObj)
ABORT_TRACE("prop op aliases global");
guard(false, lir->ins2(LIR_eq, obj_ins, lir->insImmPtr((void*)globalObj)));
guard(false, lir->ins2(LIR_eq, obj_ins, lir->insImmPtr((void*)globalObj)), MISMATCH_EXIT);
if (!test_property_cache_direct_slot(obj, obj_ins, slot))
return false;
@ -3437,7 +3442,7 @@ TraceRecorder::elem(jsval& l, jsval& r, jsval*& vp, LIns*& v_ins, LIns*& addr_in
if (obj == globalObj)
ABORT_TRACE("elem op aliases global");
LIns* obj_ins = get(&l);
guard(false, lir->ins2(LIR_eq, obj_ins, lir->insImmPtr((void*)globalObj)));
guard(false, lir->ins2(LIR_eq, obj_ins, lir->insImmPtr((void*)globalObj)), MISMATCH_EXIT);
/* make sure the object is actually a dense array */
if (!guardDenseArray(obj, obj_ins))
@ -3449,7 +3454,7 @@ TraceRecorder::elem(jsval& l, jsval& r, jsval*& vp, LIns*& v_ins, LIns*& addr_in
/* we have to check that its really an integer, but this check will to go away
once we peel the loop type down to integer for this slot */
guard(true, lir->ins2(LIR_feq, get(&r), lir->ins1(LIR_i2f, idx_ins)));
guard(true, lir->ins2(LIR_feq, get(&r), lir->ins1(LIR_i2f, idx_ins)), MISMATCH_EXIT);
LIns* dslots_ins = lir->insLoadi(obj_ins, offsetof(JSObject, dslots));
if (!guardDenseArrayIndex(obj, idx, obj_ins, dslots_ins, idx_ins))
@ -3606,14 +3611,14 @@ TraceRecorder::record_JSOP_LOOKUPSWITCH()
jsdpun u;
u.d = d;
guard(true, addName(lir->ins2(LIR_feq, get(&v), lir->insImmq(u.u64)),
"guard(lookupswitch numeric)"));
"guard(lookupswitch numeric)"), BRANCH_EXIT);
} else if (JSVAL_IS_STRING(v)) {
LIns* args[] = { get(&v), lir->insImmPtr((void*) JSVAL_TO_STRING(v)) };
guard(true, addName(lir->ins_eq0(lir->ins_eq0(lir->insCall(F_EqualStrings, args))),
"guard(lookupswitch string)"));
"guard(lookupswitch string)"), BRANCH_EXIT);
} else if (JSVAL_IS_BOOLEAN(v)) {
guard(true, addName(lir->ins2(LIR_eq, get(&v), lir->insImm(JSVAL_TO_BOOLEAN(v))),
"guard(lookupswitch boolean)"));
"guard(lookupswitch boolean)"), BRANCH_EXIT);
} else {
ABORT_TRACE("lookupswitch on object, null, or undefined");
}
@ -3811,7 +3816,7 @@ TraceRecorder::record_JSOP_ITER()
if (!JSVAL_IS_PRIMITIVE(v)) {
LIns* args[] = { get(&v), cx_ins };
LIns* v_ins = lir->insCall(F_ValueToEnumerator, args);
guard(false, lir->ins_eq0(v_ins));
guard(false, lir->ins_eq0(v_ins), MISMATCH_EXIT);
set(&v, v_ins);
return true;
}
@ -3839,7 +3844,7 @@ TraceRecorder::forInProlog(JSObject*& iterobj, LIns*& iterobj_ins)
offsetof(JSObject, fslots) +
JSSLOT_ITER_FLAGS * sizeof(jsval)),
INS_CONST(~JSITER_ENUMERATE))),
"guard(iter flags is JSITER_ENUMERATE)"));
"guard(iter flags is JSITER_ENUMERATE)"), MISMATCH_EXIT);
JSObject* obj = STOBJ_GET_PARENT(iterobj);
LIns* obj_ins = stobj_get_fslot(iterobj_ins, JSSLOT_PARENT);
@ -3851,7 +3856,7 @@ TraceRecorder::forInProlog(JSObject*& iterobj, LIns*& iterobj_ins)
LIns* n = lir->insLoadi(ops_ins, offsetof(JSObjectOps, enumerate));
if (obj->map->ops->enumerate == js_ObjectOps.enumerate) {
guard(true, addName(lir->ins2(LIR_eq, n, lir->insImmPtr((void*)js_ObjectOps.enumerate)),
"guard(native-enumerate)"));
"guard(native-enumerate)"), MISMATCH_EXIT);
return true;
}
}
@ -3863,7 +3868,7 @@ TraceRecorder::record_JSOP_ENDITER()
{
LIns* args[] = { stack(-1), cx_ins };
LIns* ok_ins = lir->insCall(F_CloseIterator, args);
guard(false, lir->ins_eq0(ok_ins));
guard(false, lir->ins_eq0(ok_ins), MISMATCH_EXIT);
return true;
}
@ -3906,18 +3911,18 @@ TraceRecorder::record_JSOP_FORLOCAL()
// and return so the immediately subsequent JSOP_IFEQ exits the loop.
int flag = 0;
guard(false, addName(lir->ins_eq0(stateval_ins), "guard(non-null iter state"));
guard(false, addName(lir->ins_eq0(stateval_ins), "guard(non-null iter state"), MISMATCH_EXIT);
if (stateval == JSVAL_NULL)
goto done;
guard(false,
addName(lir->ins2(LIR_eq, stateval_ins, lir->insImmPtr((void*) JSVAL_ZERO)),
"guard(non-empty iter state)"));
"guard(non-empty iter state)"), MISMATCH_EXIT);
if (stateval == JSVAL_ZERO)
goto done;
LIns* state_ins = lir->ins2(LIR_and, stateval_ins, lir->insImmPtr((void*) ~jsval(3)));
LIns* cursor_ins = lir->insLoadi(state_ins, offsetof(JSNativeEnumerator, cursor));
guard(false, addName(lir->ins_eq0(cursor_ins), "guard(ne->cursor != 0)"));
guard(false, addName(lir->ins_eq0(cursor_ins), "guard(ne->cursor != 0)"), MISMATCH_EXIT);
JSNativeEnumerator* ne = (JSNativeEnumerator*) (stateval & ~jsval(3));
if (ne->cursor == 0)
@ -4865,7 +4870,7 @@ TraceRecorder::record_JSOP_LENGTH()
// We support only flat strings at present.
guard(true, addName(lir->ins_eq0(lir->ins2(LIR_and, len_ins,
INS_CONST(JSSTRFLAG_DEPENDENT))),
"guard(flat-string)"));
"guard(flat-string)"), MISMATCH_EXIT);
set(&l, lir->ins1(LIR_i2f,
lir->ins2(LIR_and, len_ins, INS_CONST(JSSTRING_LENGTH_MASK))));
return true;

View File

@ -226,8 +226,7 @@ class TraceRecorder {
bool lazilyImportGlobalSlot(unsigned slot);
nanojit::LIns* guard(bool expected, nanojit::LIns* cond,
nanojit::ExitType exitType = nanojit::DONT_GROW);
nanojit::LIns* guard(bool expected, nanojit::LIns* cond, nanojit::ExitType exitType);
nanojit::LIns* addName(nanojit::LIns* ins, const char* name);
nanojit::LIns* get(jsval* p);

View File

@ -141,12 +141,12 @@ namespace nanojit
class Fragment;
enum ExitType {
DONT_GROW,
BRANCH_EXIT,
LOOP_EXIT,
NESTED_EXIT,
OOM_EXIT=DONT_GROW,
OVERFLOW_EXIT=DONT_GROW
MISMATCH_EXIT,
OOM_EXIT,
OVERFLOW_EXIT
};
struct SideExit