This commit is contained in:
Andreas Gal 2008-06-28 09:58:48 -07:00
commit 44e0963c4e
3 changed files with 102 additions and 19 deletions

View File

@ -3777,12 +3777,15 @@ JS_INTERPRET(JSContext *cx, JSInterpreterState *state)
guard_obj_is_xml(cx, regs, obj2)))) { \
JSXMLObjectOps *ops; \
\
ABORT_TRACE("operations involving XML not traced"); \
ops = (JSXMLObjectOps *) obj2->map->ops; \
if (obj2 == JSVAL_TO_OBJECT(rval)) \
rval = lval; \
if (!ops->equality(cx, obj2, rval, &cond)) \
goto error; \
cond = cond OP JS_TRUE; \
i = (int)cond; \
prim_generate_int_constant(cx, 1, j); \
prim_icmp_##OP(cx, i, j, cond); \
} else
#define EXTENDED_EQUALITY_OP(OP) \
@ -3791,10 +3794,13 @@ JS_INTERPRET(JSContext *cx, JSInterpreterState *state)
((clasp = OBJ_GET_CLASS(cx, obj2))->flags & JSCLASS_IS_EXTENDED)) { \
JSExtendedClass *xclasp; \
\
ABORT_TRACE("extended equality comparison not traceable"); \
xclasp = (JSExtendedClass *) clasp; \
if (!xclasp->equality(cx, obj2, rval, &cond)) \
goto error; \
cond = cond OP JS_TRUE; \
i = (int)cond; \
prim_generate_int_constant(cx, 1, j); \
prim_icmp_##OP(cx, i, j, cond); \
} else
#else
#define XML_EQUALITY_OP(OP) /* nothing */
@ -3810,23 +3816,34 @@ JS_INTERPRET(JSContext *cx, JSInterpreterState *state)
XML_EQUALITY_OP(OP) \
if (ltmp == rtmp) { \
if (ltmp == JSVAL_STRING) { \
str = JSVAL_TO_STRING(lval); \
str2 = JSVAL_TO_STRING(rval); \
cond = js_EqualStrings(str, str2) OP JS_TRUE; \
prim_jsval_to_string(cx, lval, str); \
prim_jsval_to_string(cx, rval, str2); \
call_CompareStrings(cx, str, str2, i); \
prim_generate_int_constant(cx, 0, j); \
prim_icmp_##OP(cx, i, j, cond); \
} else if (ltmp == JSVAL_DOUBLE) { \
d = *JSVAL_TO_DOUBLE(lval); \
d2 = *JSVAL_TO_DOUBLE(rval); \
cond = JSDOUBLE_COMPARE(d, OP, d2, IFNAN); \
VALUE_TO_NUMBER(cx, -2, lval, d); \
VALUE_TO_NUMBER(cx, -1, rval, d2); \
prim_dcmp_##OP(cx, IFNAN, d, d2, cond); \
} else { \
EXTENDED_EQUALITY_OP(OP) \
/* Handle all undefined (=>NaN) and int combinations. */ \
cond = lval OP rval; \
{ /* Else block for EXTENDED_EQUALITY_OP if defined */ \
/* Handle all undefined (=>NaN) and int combinations. */ \
i = (int)lval; \
j = (int)rval; \
prim_icmp_##OP(cx, i, j, cond); \
} \
} \
} else { \
ABORT_TRACE("comparison of mismatched types not traceable"); \
if (JSVAL_IS_NULL(lval) || JSVAL_IS_VOID(lval)) { \
cond = (JSVAL_IS_NULL(rval) || JSVAL_IS_VOID(rval)) OP 1; \
i = JSVAL_IS_NULL(rval) || JSVAL_IS_VOID(rval); \
prim_generate_int_constant(cx, 1, j); \
prim_icmp_##OP(cx, i, j, cond); \
} else if (JSVAL_IS_NULL(rval) || JSVAL_IS_VOID(rval)) { \
cond = 1 OP 0; \
prim_generate_int_constant(cx, 1, i); \
prim_generate_int_constant(cx, 0, j); \
prim_icmp_##OP(cx, i, j, cond); \
} else { \
if (ltmp == JSVAL_OBJECT) { \
DEFAULT_VALUE(cx, -2, JSTYPE_VOID, lval); \
@ -3836,13 +3853,15 @@ JS_INTERPRET(JSContext *cx, JSInterpreterState *state)
rtmp = JSVAL_TAG(rval); \
} \
if (ltmp == JSVAL_STRING && rtmp == JSVAL_STRING) { \
str = JSVAL_TO_STRING(lval); \
str2 = JSVAL_TO_STRING(rval); \
cond = js_EqualStrings(str, str2) OP JS_TRUE; \
prim_jsval_to_string(cx, lval, str); \
prim_jsval_to_string(cx, rval, str2); \
call_CompareStrings(cx, str, str2, i); \
prim_generate_int_constant(cx, 0, j); \
prim_icmp_##OP(cx, i, j, cond); \
} else { \
VALUE_TO_NUMBER(cx, -2, lval, d); \
VALUE_TO_NUMBER(cx, -1, rval, d2); \
cond = JSDOUBLE_COMPARE(d, OP, d2, IFNAN); \
prim_dcmp_##OP(cx, IFNAN, d, d2, cond); \
} \
} \
} \
@ -3850,12 +3869,12 @@ JS_INTERPRET(JSContext *cx, JSInterpreterState *state)
STORE_STACK_BOOLEAN(-1, cond); \
JS_END_MACRO
BEGIN_CASE(JSOP_EQ)
EQUALITY_OP(==, JS_FALSE);
TRACE_CASE(JSOP_EQ)
EQUALITY_OP(eq, JS_FALSE);
END_CASE(JSOP_EQ)
BEGIN_CASE(JSOP_NE)
EQUALITY_OP(!=, JS_TRUE);
EQUALITY_OP(ne, JS_TRUE);
END_CASE(JSOP_NE)
#define STRICT_EQUALITY_OP(OP) \

View File

@ -373,6 +373,18 @@ PRIMITIVE(guard_boolean_is_true)(JSContext* cx, JSFrameRegs& regs, JSBool& cond)
return cond;
}
static inline void
PRIMITIVE(prim_icmp_eq)(JSContext* cx, jsint& a, jsint& b, JSBool& r)
{
r = a == b;
}
static inline void
PRIMITIVE(prim_icmp_ne)(JSContext* cx, jsint& a, jsint& b, JSBool& r)
{
r = a != b;
}
static inline void
PRIMITIVE(prim_icmp_lt)(JSContext* cx, jsint& a, jsint& b, JSBool& r)
{
@ -397,6 +409,20 @@ PRIMITIVE(prim_icmp_ge)(JSContext* cx, jsint& a, jsint& b, JSBool& r)
r = a >= b;
}
static inline void
PRIMITIVE(prim_dcmp_eq)(JSContext* cx, bool ifnan, jsdouble& a, jsdouble& b,
JSBool& r)
{
r = JSDOUBLE_COMPARE(a, ==, b, ifnan);
}
static inline void
PRIMITIVE(prim_dcmp_ne)(JSContext* cx, bool ifnan, jsdouble& a, jsdouble& b,
JSBool& r)
{
r = JSDOUBLE_COMPARE(a, !=, b, ifnan);
}
static inline void
PRIMITIVE(prim_dcmp_lt)(JSContext* cx, bool ifnan, jsdouble& a, jsdouble& b, JSBool& r)
{

View File

@ -377,6 +377,23 @@ guard_boolean_is_true(JSContext* cx, JSFrameRegs& regs, JSBool& cond)
return ok;
}
static inline void
prim_icmp_eq(JSContext* cx, jsint& a, jsint& b, JSBool& r)
{
interp_prim_icmp_eq(cx, a, b, r);
recorder(cx)->binary(LIR_eq, &a, &b, &r);
}
static inline void
prim_icmp_ne(JSContext* cx, jsint& a, jsint& b, JSBool& r)
{
interp_prim_icmp_ne(cx, a, b, r);
#if 0
// Need to synthesize LIR_ne here -- LIR_eq(sub(a, b), 0) ?
recorder(cx)->binary(LIR_ne, &a, &b, &r);
#endif
}
static inline void
prim_icmp_lt(JSContext* cx, jsint& a, jsint& b, JSBool& r)
{
@ -405,6 +422,23 @@ prim_icmp_ge(JSContext* cx, jsint& a, jsint& b, JSBool& r)
recorder(cx)->binary(LIR_ge, &a, &b, &r);
}
static inline void
prim_dcmp_eq(JSContext* cx, bool ifnan, jsdouble& a, jsdouble& b, JSBool& r)
{
interp_prim_dcmp_eq(cx, ifnan, a, b, r);
recorder(cx)->binary(LIR_eq, &a, &b, &r); // TODO: check ifnan handling
}
static inline void
prim_dcmp_ne(JSContext *cx, bool ifnan, jsdouble& a, jsdouble& b, JSBool& r)
{
interp_prim_dcmp_ne(cx, ifnan, a, b, r);
#if 0
// Need to synthesize LIR_ne here -- LIR_eq(sub(a, b), 0) ?
recorder(cx)->binary(LIR_ne, &a, &b, &r);
#endif
}
static inline void
prim_dcmp_lt(JSContext* cx, bool ifnan, jsdouble& a, jsdouble& b, JSBool& r)
{
@ -499,6 +533,10 @@ guard_ops_are_xml(JSContext *cx, JSFrameRegs& regs, JSObjectOps*& ops)
return ok;
}
/*
* XXX want to move to an interp helper, but guard_ops_are_xml isn't visible
* except in jstracer.cpp mode, so it breaks compilation.
*/
static inline bool
guard_obj_is_xml(JSContext* cx, JSFrameRegs& regs, JSObject*& obj)
{