mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Remove default parameter for guard, specify MISMATCH_EXIT explicitly.
This commit is contained in:
parent
00e5631b45
commit
020e68ab1e
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user