This commit is contained in:
Luke Wagner 2010-06-16 23:57:45 -07:00
commit 40aca2d2fb
11 changed files with 72 additions and 331 deletions

View File

@ -768,298 +768,3 @@ nsICanvasRenderingContextWebGL_VertexAttrib4fv(JSContext *cx, uintN argc, jsval
{ {
return helper_nsICanvasRenderingContextWebGL_VertexAttrib_x_fv(cx, argc, vp, 4); return helper_nsICanvasRenderingContextWebGL_VertexAttrib_x_fv(cx, argc, vp, 4);
} }
#ifdef JS_TRACER
static inline jsval FASTCALL
helper_nsICanvasRenderingContextWebGL_Uniform_x_iv_tn(JSContext *cx, JSObject *obj, JSObject *locationobj,
JSObject *arg, int nElements)
{
XPC_QS_ASSERT_CONTEXT_OK(cx);
nsICanvasRenderingContextWebGL *self;
xpc_qsSelfRef selfref;
xpc_qsArgValArray<3> vp(cx);
if (!xpc_qsUnwrapThis(cx, obj, nsnull, &self, &selfref.ptr, &vp.array[0], nsnull)) {
js_SetTraceableNativeFailed(cx);
return JSVAL_VOID;
}
js::AutoValueRooter obj_tvr(cx);
nsIWebGLUniformLocation *location;
xpc_qsSelfRef location_selfref;
nsresult rv_convert_arg0
= xpc_qsUnwrapThis(cx, locationobj, nsnull, &location, &location_selfref.ptr, &vp.array[1], nsnull);
if (NS_FAILED(rv_convert_arg0)) {
js_SetTraceableNativeFailed(cx);
return JSVAL_VOID;
}
js::TypedArray *wa = 0;
if (helper_isInt32Array(arg)) {
wa = js::TypedArray::fromJSObject(arg);
} else if (JS_IsArrayObject(cx, arg)) {
JSObject *nobj = js_CreateTypedArrayWithArray(cx, js::TypedArray::TYPE_INT32, arg);
if (!nobj) {
// XXX this will likely return a strange error message if it goes wrong
js_SetTraceableNativeFailed(cx);
return JSVAL_VOID;
}
*obj_tvr.jsval_addr() = OBJECT_TO_JSVAL(nobj);
wa = js::TypedArray::fromJSObject(nobj);
} else {
xpc_qsThrowMethodFailedWithDetails(cx, NS_ERROR_FAILURE, "nsICanvasRenderingContextWebGL", "uniformNiv");
js_SetTraceableNativeFailed(cx);
return JSVAL_VOID;
}
nsresult rv;
if (nElements == 1) {
rv = self->Uniform1iv_array(location, wa);
} else if (nElements == 2) {
rv = self->Uniform2iv_array(location, wa);
} else if (nElements == 3) {
rv = self->Uniform3iv_array(location, wa);
} else if (nElements == 4) {
rv = self->Uniform4iv_array(location, wa);
}
if (NS_FAILED(rv)) {
xpc_qsThrowMethodFailedWithDetails(cx, rv, "nsICanvasRenderingContextWebGL", "uniformNiv");
js_SetTraceableNativeFailed(cx);
}
return JSVAL_VOID;
}
static inline jsval FASTCALL
helper_nsICanvasRenderingContextWebGL_Uniform_x_fv_tn(JSContext *cx, JSObject *obj, JSObject *locationobj,
JSObject *arg, int nElements)
{
XPC_QS_ASSERT_CONTEXT_OK(cx);
nsICanvasRenderingContextWebGL *self;
xpc_qsSelfRef selfref;
xpc_qsArgValArray<3> vp(cx);
if (!xpc_qsUnwrapThis(cx, obj, nsnull, &self, &selfref.ptr, &vp.array[0], nsnull)) {
js_SetTraceableNativeFailed(cx);
return JSVAL_VOID;
}
js::AutoValueRooter obj_tvr(cx);
nsIWebGLUniformLocation *location;
xpc_qsSelfRef location_selfref;
nsresult rv_convert_arg0
= xpc_qsUnwrapThis(cx, locationobj, nsnull, &location, &location_selfref.ptr, &vp.array[1], nsnull);
if (NS_FAILED(rv_convert_arg0)) {
js_SetTraceableNativeFailed(cx);
return JSVAL_VOID;
}
js::TypedArray *wa = 0;
if (helper_isFloat32Array(arg)) {
wa = js::TypedArray::fromJSObject(arg);
} else if (JS_IsArrayObject(cx, arg)) {
JSObject *nobj = js_CreateTypedArrayWithArray(cx, js::TypedArray::TYPE_FLOAT32, arg);
if (!nobj) {
// XXX this will likely return a strange error message if it goes wrong
js_SetTraceableNativeFailed(cx);
return JSVAL_VOID;
}
*obj_tvr.jsval_addr() = OBJECT_TO_JSVAL(nobj);
wa = js::TypedArray::fromJSObject(nobj);
} else {
xpc_qsThrowMethodFailedWithDetails(cx, NS_ERROR_FAILURE, "nsICanvasRenderingContextWebGL", "uniformNfv");
js_SetTraceableNativeFailed(cx);
return JSVAL_VOID;
}
nsresult rv;
if (nElements == 1) {
rv = self->Uniform1fv_array(location, wa);
} else if (nElements == 2) {
rv = self->Uniform2fv_array(location, wa);
} else if (nElements == 3) {
rv = self->Uniform3fv_array(location, wa);
} else if (nElements == 4) {
rv = self->Uniform4fv_array(location, wa);
}
if (NS_FAILED(rv)) {
xpc_qsThrowMethodFailedWithDetails(cx, rv, "nsICanvasRenderingContextWebGL", "uniformNfv");
js_SetTraceableNativeFailed(cx);
}
return JSVAL_VOID;
}
static inline jsval FASTCALL
helper_nsICanvasRenderingContextWebGL_UniformMatrix_x_fv_tn(JSContext *cx, JSObject *obj, JSObject *locationobj,
JSBool transpose, JSObject *arg, int nElements)
{
XPC_QS_ASSERT_CONTEXT_OK(cx);
nsICanvasRenderingContextWebGL *self;
xpc_qsSelfRef selfref;
xpc_qsArgValArray<4> vp(cx);
if (!xpc_qsUnwrapThis(cx, obj, nsnull, &self, &selfref.ptr, &vp.array[0], nsnull)) {
js_SetTraceableNativeFailed(cx);
return JSVAL_VOID;
}
js::AutoValueRooter obj_tvr(cx);
nsIWebGLUniformLocation *location;
xpc_qsSelfRef location_selfref;
nsresult rv_convert_arg0
= xpc_qsUnwrapThis(cx, locationobj, nsnull, &location, &location_selfref.ptr, &vp.array[1], nsnull);
if (NS_FAILED(rv_convert_arg0)) {
js_SetTraceableNativeFailed(cx);
return JSVAL_VOID;
}
js::TypedArray *wa = 0;
if (helper_isFloat32Array(arg)) {
wa = js::TypedArray::fromJSObject(arg);
} else if (JS_IsArrayObject(cx, arg)) {
JSObject *nobj = js_CreateTypedArrayWithArray(cx, js::TypedArray::TYPE_FLOAT32, arg);
if (!nobj) {
// XXX this will likely return a strange error message if it goes wrong
js_SetTraceableNativeFailed(cx);
return JSVAL_VOID;
}
*obj_tvr.jsval_addr() = OBJECT_TO_JSVAL(nobj);
wa = js::TypedArray::fromJSObject(nobj);
} else {
xpc_qsThrowMethodFailedWithDetails(cx, NS_ERROR_FAILURE, "nsICanvasRenderingContextWebGL", "uniformMatrixNfv");
js_SetTraceableNativeFailed(cx);
return JSVAL_VOID;
}
nsresult rv;
if (nElements == 2) {
rv = self->UniformMatrix2fv_array(location, transpose, wa);
} else if (nElements == 3) {
rv = self->UniformMatrix3fv_array(location, transpose, wa);
} else if (nElements == 4) {
rv = self->UniformMatrix4fv_array(location, transpose, wa);
}
if (NS_FAILED(rv)) {
xpc_qsThrowMethodFailedWithDetails(cx, rv, "nsICanvasRenderingContextWebGL", "uniformMatrixNfv");
js_SetTraceableNativeFailed(cx);
}
return JSVAL_VOID;
}
static jsval FASTCALL
nsICanvasRenderingContextWebGL_Uniform1iv_tn(JSContext *cx, JSObject *obj, JSObject *location, JSObject *arg)
{
return helper_nsICanvasRenderingContextWebGL_Uniform_x_iv_tn(cx, obj, location, arg, 1);
}
JS_DEFINE_TRCINFO_1(nsICanvasRenderingContextWebGL_Uniform1iv,
(4, (static, JSVAL_FAIL, nsICanvasRenderingContextWebGL_Uniform1iv_tn, CONTEXT, THIS, OBJECT, OBJECT, 0, nanojit::ACC_STORE_ANY)))
static jsval FASTCALL
nsICanvasRenderingContextWebGL_Uniform2iv_tn(JSContext *cx, JSObject *obj, JSObject *location, JSObject *arg)
{
return helper_nsICanvasRenderingContextWebGL_Uniform_x_iv_tn(cx, obj, location, arg, 2);
}
JS_DEFINE_TRCINFO_1(nsICanvasRenderingContextWebGL_Uniform2iv,
(4, (static, JSVAL_FAIL, nsICanvasRenderingContextWebGL_Uniform2iv_tn, CONTEXT, THIS, OBJECT, OBJECT, 0, nanojit::ACC_STORE_ANY)))
static jsval FASTCALL
nsICanvasRenderingContextWebGL_Uniform3iv_tn(JSContext *cx, JSObject *obj, JSObject *location, JSObject *arg)
{
return helper_nsICanvasRenderingContextWebGL_Uniform_x_iv_tn(cx, obj, location, arg, 3);
}
JS_DEFINE_TRCINFO_1(nsICanvasRenderingContextWebGL_Uniform3iv,
(4, (static, JSVAL_FAIL, nsICanvasRenderingContextWebGL_Uniform3iv_tn, CONTEXT, THIS, OBJECT, OBJECT, 0, nanojit::ACC_STORE_ANY)))
static jsval FASTCALL
nsICanvasRenderingContextWebGL_Uniform4iv_tn(JSContext *cx, JSObject *obj, JSObject *location, JSObject *arg)
{
return helper_nsICanvasRenderingContextWebGL_Uniform_x_iv_tn(cx, obj, location, arg, 4);
}
JS_DEFINE_TRCINFO_1(nsICanvasRenderingContextWebGL_Uniform4iv,
(4, (static, JSVAL_FAIL, nsICanvasRenderingContextWebGL_Uniform4iv_tn, CONTEXT, THIS, OBJECT, OBJECT, 0, nanojit::ACC_STORE_ANY)))
static jsval FASTCALL
nsICanvasRenderingContextWebGL_Uniform1fv_tn(JSContext *cx, JSObject *obj, JSObject *location, JSObject *arg)
{
return helper_nsICanvasRenderingContextWebGL_Uniform_x_fv_tn(cx, obj, location, arg, 1);
}
JS_DEFINE_TRCINFO_1(nsICanvasRenderingContextWebGL_Uniform1fv,
(4, (static, JSVAL_FAIL, nsICanvasRenderingContextWebGL_Uniform1fv_tn, CONTEXT, THIS, OBJECT, OBJECT, 0, nanojit::ACC_STORE_ANY)))
static jsval FASTCALL
nsICanvasRenderingContextWebGL_Uniform2fv_tn(JSContext *cx, JSObject *obj, JSObject *location, JSObject *arg)
{
return helper_nsICanvasRenderingContextWebGL_Uniform_x_fv_tn(cx, obj, location, arg, 2);
}
JS_DEFINE_TRCINFO_1(nsICanvasRenderingContextWebGL_Uniform2fv,
(4, (static, JSVAL_FAIL, nsICanvasRenderingContextWebGL_Uniform2fv_tn, CONTEXT, THIS, OBJECT, OBJECT, 0, nanojit::ACC_STORE_ANY)))
static jsval FASTCALL
nsICanvasRenderingContextWebGL_Uniform3fv_tn(JSContext *cx, JSObject *obj, JSObject *location, JSObject *arg)
{
return helper_nsICanvasRenderingContextWebGL_Uniform_x_fv_tn(cx, obj, location, arg, 3);
}
JS_DEFINE_TRCINFO_1(nsICanvasRenderingContextWebGL_Uniform3fv,
(4, (static, JSVAL_FAIL, nsICanvasRenderingContextWebGL_Uniform3fv_tn, CONTEXT, THIS, OBJECT, OBJECT, 0, nanojit::ACC_STORE_ANY)))
static jsval FASTCALL
nsICanvasRenderingContextWebGL_Uniform4fv_tn(JSContext *cx, JSObject *obj, JSObject *location, JSObject *arg)
{
return helper_nsICanvasRenderingContextWebGL_Uniform_x_fv_tn(cx, obj, location, arg, 4);
}
JS_DEFINE_TRCINFO_1(nsICanvasRenderingContextWebGL_Uniform4fv,
(4, (static, JSVAL_FAIL, nsICanvasRenderingContextWebGL_Uniform4fv_tn, CONTEXT, THIS, OBJECT, OBJECT, 0, nanojit::ACC_STORE_ANY)))
static jsval FASTCALL
nsICanvasRenderingContextWebGL_UniformMatrix2fv_tn(JSContext *cx, JSObject *obj, JSObject *loc, JSBool transpose, JSObject *arg)
{
return helper_nsICanvasRenderingContextWebGL_UniformMatrix_x_fv_tn(cx, obj, loc, transpose, arg, 2);
}
JS_DEFINE_TRCINFO_1(nsICanvasRenderingContextWebGL_UniformMatrix2fv,
(5, (static, JSVAL_FAIL, nsICanvasRenderingContextWebGL_UniformMatrix2fv_tn, CONTEXT, THIS, OBJECT, BOOL, OBJECT, 0, nanojit::ACC_STORE_ANY)))
static jsval FASTCALL
nsICanvasRenderingContextWebGL_UniformMatrix3fv_tn(JSContext *cx, JSObject *obj, JSObject *loc, JSBool transpose, JSObject *arg)
{
return helper_nsICanvasRenderingContextWebGL_UniformMatrix_x_fv_tn(cx, obj, loc, transpose, arg, 3);
}
JS_DEFINE_TRCINFO_1(nsICanvasRenderingContextWebGL_UniformMatrix3fv,
(5, (static, JSVAL_FAIL, nsICanvasRenderingContextWebGL_UniformMatrix3fv_tn, CONTEXT, THIS, OBJECT, BOOL, OBJECT, 0, nanojit::ACC_STORE_ANY)))
static jsval FASTCALL
nsICanvasRenderingContextWebGL_UniformMatrix4fv_tn(JSContext *cx, JSObject *obj, JSObject *loc, JSBool transpose, JSObject *arg)
{
return helper_nsICanvasRenderingContextWebGL_UniformMatrix_x_fv_tn(cx, obj, loc, transpose, arg, 4);
}
JS_DEFINE_TRCINFO_1(nsICanvasRenderingContextWebGL_UniformMatrix4fv,
(5, (static, JSVAL_FAIL, nsICanvasRenderingContextWebGL_UniformMatrix4fv_tn, CONTEXT, THIS, OBJECT, BOOL, OBJECT, 0, nanojit::ACC_STORE_ANY)))
#endif /* JS_TRACER */

View File

@ -9119,7 +9119,6 @@ nsHTMLDocumentSH::NewResolve(nsIXPConnectWrappedNative *wrapper, JSContext *cx,
// If we have (or just created) a helper, pass the resolve flags // If we have (or just created) a helper, pass the resolve flags
// to the helper as its private data. // to the helper as its private data.
// TODO: fix // TODO: fix
JS_ASSERT(false && "Relying on dirty private = int details");
if (helper && !::JS_SetPrivate(cx, helper, FlagsToPrivate(flags))) { if (helper && !::JS_SetPrivate(cx, helper, FlagsToPrivate(flags))) {
nsDOMClassInfo::ThrowJSException(cx, NS_ERROR_UNEXPECTED); nsDOMClassInfo::ThrowJSException(cx, NS_ERROR_UNEXPECTED);

View File

@ -162,10 +162,11 @@ typedef struct JSCompartment JSCompartment;
* TODO: explain boxing strategy * TODO: explain boxing strategy
*/ */
#if defined(__cplusplus) || !defined(_MSC_VER)
typedef enum JSValueMask16 typedef enum JSValueMask16
#if defined(_MSC_VER) # if defined(_MSC_VER)
: uint16 : uint16
#endif # endif
{ {
JSVAL_MASK16_NULL = (uint16)0x0001, JSVAL_MASK16_NULL = (uint16)0x0001,
JSVAL_MASK16_UNDEFINED = (uint16)0x0002, JSVAL_MASK16_UNDEFINED = (uint16)0x0002,
@ -188,10 +189,30 @@ typedef enum JSValueMask16
*/ */
JSVAL_NANBOX_PATTERN = ((uint16)0xFFFF) JSVAL_NANBOX_PATTERN = ((uint16)0xFFFF)
} }
#if defined(__GNUC__) # if defined(__GNUC__)
__attribute__((packed)) __attribute__((packed))
#endif # endif
JSValueMask16; JSValueMask16;
#else /* defined(__cplusplus) || !defined(_MSC_VER) */
// We need this C API for MSVC, because MSVC doesn't allow us to
// make a 16-bit enum in C.
typedef uint16 JSValueMask16;
#define JSVAL_MASK16_NULL ((uint16)0x0001)
#define JSVAL_MASK16_UNDEFINED ((uint16)0x0002)
#define JSVAL_MASK16_INT32 ((uint16)0x0004)
#define JSVAL_MASK16_STRING ((uint16)0x0008)
#define JSVAL_MASK16_NONFUNOBJ ((uint16)0x0010)
#define JSVAL_MASK16_FUNOBJ ((uint16)0x0020)
#define JSVAL_MASK16_BOOLEAN ((uint16)0x0040)
#define JSVAL_MASK16_MAGIC ((uint16)0x0080)
#define JSVAL_MASK16_SINGLETON (JSVAL_MASK16_NULL | JSVAL_MASK16_UNDEFINED)
#define JSVAL_MASK16_OBJECT (JSVAL_MASK16_NONFUNOBJ | JSVAL_MASK16_FUNOBJ)
#define JSVAL_MASK16_OBJORNULL (JSVAL_MASK16_OBJECT | JSVAL_MASK16_NULL)
#define JSVAL_MASK16_GCTHING (JSVAL_MASK16_OBJECT | JSVAL_MASK16_STRING)
#define JSVAL_NANBOX_PATTERN ((uint16)0xFFFF)
#endif /* defined(__cplusplus) || !defined(_MSC_VER) */
#define JSVAL_MASK32_CLEAR ((uint32)0xFFFF0000) #define JSVAL_MASK32_CLEAR ((uint32)0xFFFF0000)
@ -1130,15 +1151,15 @@ static inline JSEqualityOp Jsvalify(EqualityOp f); /* Same type as HasI
} /* namespace js */ } /* namespace js */
typedef js::Class JSFunctionClassType; typedef js::Class JSFunctionClassType;
extern "C" JS_FRIEND_DATA(JSFunctionClassType) js_FunctionClass;
#else /* !defined(__cplusplus) */ #else /* !defined(__cplusplus) */
typedef JSClass JSFunctionClassType; typedef JSClass JSFunctionClassType;
extern JS_FRIEND_DATA(JSFunctionClassType) js_FunctionClass;
#endif /* __cplusplus */ #endif /* __cplusplus */
extern JS_FRIEND_DATA(JSFunctionClassType) js_FunctionClass;
typedef struct JSPretendObject typedef struct JSPretendObject
{ {
void *_; void *_;

View File

@ -731,17 +731,8 @@ TraceRecorder::slurpInt32Slot(LIns* addr_ins, ptrdiff_t offset, Value* vp, VMSid
{ {
LIns *mask_ins = lir->insLoad(LIR_ldi, addr_ins, offset + offsetof(jsval_layout, s.u.mask32), LIns *mask_ins = lir->insLoad(LIR_ldi, addr_ins, offset + offsetof(jsval_layout, s.u.mask32),
ACC_OTHER); ACC_OTHER);
guard(false, guard(true, lir->ins2(LIR_eqi, mask_ins, INS_CONST(JSVAL_MASK32_INT32)), exit);
lir->insEqI_0(lir->ins2(LIR_ori, return lir->insLoad(LIR_ldi, addr_ins, offset + offsetof(jsval_layout, s.payload), ACC_OTHER);
lir->ins2(LIR_eqi, mask_ins, INS_CONST(JSVAL_MASK32_INT32)),
lir->ins2(LIR_ltui, mask_ins, INS_CONST(JSVAL_MASK32_CLEAR)))),
exit);
LIns* space = lir->insAlloc(sizeof(int32));
LIns* args[] = { space, lir->ins2(LIR_addp, addr_ins, INS_CONST(offset)) };
LIns* result = lir->insCall(&js_TryUnboxInt32_ci, args);
guard(false, lir->insEqI_0(result), exit);
LIns* int32_ins = lir->insLoad(LIR_ldi, space, 0, ACC_OTHER);
return int32_ins;
} }
JS_REQUIRES_STACK LIns* JS_REQUIRES_STACK LIns*
@ -749,15 +740,8 @@ TraceRecorder::slurpDoubleSlot(LIns* addr_ins, ptrdiff_t offset, Value* vp, VMSi
{ {
LIns *mask_ins = lir->insLoad(LIR_ldi, addr_ins, offset + offsetof(jsval_layout, s.u.mask32), LIns *mask_ins = lir->insLoad(LIR_ldi, addr_ins, offset + offsetof(jsval_layout, s.u.mask32),
ACC_OTHER); ACC_OTHER);
guard(false, guard(true, lir->ins2(LIR_ltui, mask_ins, INS_CONST(JSVAL_MASK32_CLEAR)), exit);
lir->insEqI_0(lir->ins2(LIR_ori, return lir->insLoad(LIR_ldd, addr_ins, offset + offsetof(jsval_layout, s.payload), ACC_OTHER);
lir->ins2(LIR_eqi, mask_ins, INS_CONST(JSVAL_MASK32_INT32)),
lir->ins2(LIR_ltui, mask_ins, INS_CONST(JSVAL_MASK32_CLEAR)))),
exit);
LIns *val_ins = lir->insLoad(LIR_ldi, addr_ins, offset + offsetof(jsval_layout, s.payload),
ACC_OTHER);
LIns* args[] = { val_ins, mask_ins };
return lir->insCall(&js_UnboxDouble_ci, args);
} }
JS_REQUIRES_STACK LIns* JS_REQUIRES_STACK LIns*

View File

@ -9372,12 +9372,13 @@ TraceRecorder::stobj_get_slot(LIns* obj_ins, unsigned slot, LIns*& dslots_ins)
} }
JS_REQUIRES_STACK LIns* JS_REQUIRES_STACK LIns*
TraceRecorder::unbox_value(const Value &v, LIns *vaddr_ins, ptrdiff_t offset, VMSideExit *exit) TraceRecorder::unbox_value(const Value &v, LIns *vaddr_ins, ptrdiff_t offset, VMSideExit *exit,
bool force_double)
{ {
AccSet accSet = vaddr_ins == lirbuf->sp ? ACC_STACK : ACC_OTHER; AccSet accSet = vaddr_ins == lirbuf->sp ? ACC_STACK : ACC_OTHER;
LIns *mask_ins = lir->insLoad(LIR_ldi, vaddr_ins, offset + offsetof(jsval_layout, s.u.mask32), LIns *mask_ins = lir->insLoad(LIR_ldi, vaddr_ins, offset + offsetof(jsval_layout, s.u.mask32),
accSet); accSet);
if (v.isNumber()) { if (v.isNumber() && force_double) {
guard(false, guard(false,
lir->insEqI_0(lir->ins2(LIR_ori, lir->insEqI_0(lir->ins2(LIR_ori,
lir->ins2(LIR_eqi, mask_ins, INS_CONST(JSVAL_MASK32_INT32)), lir->ins2(LIR_eqi, mask_ins, INS_CONST(JSVAL_MASK32_INT32)),
@ -9389,8 +9390,17 @@ TraceRecorder::unbox_value(const Value &v, LIns *vaddr_ins, ptrdiff_t offset, VM
return lir->insCall(&js_UnboxDouble_ci, args); return lir->insCall(&js_UnboxDouble_ci, args);
} }
LIns *val_ins = lir->insLoad(LIR_ldi, vaddr_ins, offset + offsetof(jsval_layout, s.payload), if (v.isInt32()) {
accSet); guard(true, lir->ins2(LIR_eqi, mask_ins, INS_CONST(JSVAL_MASK32_INT32)), exit);
return i2d(lir->insLoad(LIR_ldi, vaddr_ins, offset + offsetof(jsval_layout, s.payload), accSet));
}
if (v.isDouble()) {
guard(true, lir->ins2(LIR_ltui, mask_ins, INS_CONST(JSVAL_MASK32_CLEAR)), exit);
return lir->insLoad(LIR_ldd, vaddr_ins, offset + offsetof(jsval_layout, s.payload), accSet);
}
LIns *val_ins = NULL;
uint32 mask; uint32 mask;
if (v.isUndefined()) { if (v.isUndefined()) {
mask = JSVAL_MASK32_UNDEFINED; mask = JSVAL_MASK32_UNDEFINED;
@ -9411,6 +9421,9 @@ TraceRecorder::unbox_value(const Value &v, LIns *vaddr_ins, ptrdiff_t offset, VM
} else { } else {
JS_NOT_REACHED("bad type"); JS_NOT_REACHED("bad type");
} }
if (!val_ins)
val_ins = lir->insLoad(LIR_ldi, vaddr_ins, offset + offsetof(jsval_layout, s.payload),
accSet);
guard(true, lir->ins2(LIR_eqi, mask_ins, INS_CONST(mask)), exit); guard(true, lir->ins2(LIR_eqi, mask_ins, INS_CONST(mask)), exit);
return val_ins; return val_ins;
@ -13261,7 +13274,7 @@ TraceRecorder::denseArrayElement(Value& oval, Value& ival, Value*& vp, LIns*& v_
JS_ASSERT(sizeof(Value) == 8); // The |3| in the following statement requires this. JS_ASSERT(sizeof(Value) == 8); // The |3| in the following statement requires this.
addr_ins = lir->ins2(LIR_addp, dslots_ins, addr_ins = lir->ins2(LIR_addp, dslots_ins,
lir->ins2ImmI(LIR_lshp, pidx_ins, 3)); lir->ins2ImmI(LIR_lshp, pidx_ins, 3));
v_ins = unbox_value(*vp, addr_ins, 0, exit); v_ins = unbox_value(*vp, addr_ins, 0, exit, true);
/* Don't let the hole value escape. Turn it into an undefined. */ /* Don't let the hole value escape. Turn it into an undefined. */
if (vp->isMagic()) { if (vp->isMagic()) {

View File

@ -1329,7 +1329,8 @@ class TraceRecorder
int v_spindex); int v_spindex);
JS_REQUIRES_STACK nanojit::LIns* unbox_value(const Value &v, nanojit::LIns *vaddr_ins, JS_REQUIRES_STACK nanojit::LIns* unbox_value(const Value &v, nanojit::LIns *vaddr_ins,
ptrdiff_t offset, VMSideExit *exit); ptrdiff_t offset, VMSideExit *exit,
bool force_double=false);
JS_REQUIRES_STACK nanojit::LIns* unbox_value_load(const Value &v, nanojit::LIns *vload_ins, JS_REQUIRES_STACK nanojit::LIns* unbox_value_load(const Value &v, nanojit::LIns *vload_ins,
VMSideExit *exit); VMSideExit *exit);
JS_REQUIRES_STACK nanojit::LIns* unbox_int(const Value &v, nanojit::LIns *vaddr_ins, JS_REQUIRES_STACK nanojit::LIns* unbox_int(const Value &v, nanojit::LIns *vaddr_ins,

View File

@ -0,0 +1,3 @@
// don't crash or assert
+Function("switch(\"\"){case 1:case 8:}");

View File

@ -0,0 +1,12 @@
// Don't crash
function f(o, s) {
var k = s.substr(0, 1);
var c;
for (var i = 0; i < 10; ++i) {
c = k in o;
}
return c;
}
assertEq(f({ a: 66 }, 'abc'), true);

View File

@ -159,7 +159,10 @@ DEFINES += \
$(addprefix -D,$(filter AVMPLUS%,$(CONFIG))) \ $(addprefix -D,$(filter AVMPLUS%,$(CONFIG))) \
$(NULL) $(NULL)
ENABLE_TRACEABLE_FLAGS = --enable-traceables # Disable traceable natives because (a) many of them return jsvals, which is
# hard to support now, and (b) we can call the basic versions from trace now
# anyway.
ENABLE_TRACEABLE_FLAGS =
endif # ENABLE_JIT endif # ENABLE_JIT

View File

@ -309,7 +309,7 @@ JSBool XPCDispConvert::JSToCOM(XPCCallContext& ccx,
case VT_R8: case VT_R8:
{ {
varDest->vt = VT_R8; varDest->vt = VT_R8;
varDest->dblVal = *JSVAL_TO_DOUBLE(src); varDest->dblVal = JSVAL_TO_DOUBLE(src);
} }
break; break;
case VT_EMPTY: case VT_EMPTY:

View File

@ -366,7 +366,7 @@ JSBool XPCDispInterface::Member::GetValue(XPCCallContext& ccx,
return JS_FALSE; return JS_FALSE;
// Store ourselves and our native interface within the JSObject // Store ourselves and our native interface within the JSObject
if(!JS_SetReservedSlot(ccx, funobj, 0, PRIVATE_TO_JSVAL(this))) if(!JS_SetReservedSlot(ccx, funobj, 0, PRIVATE_TO_JSVAL((void *) this)))
return JS_FALSE; return JS_FALSE;
if(!JS_SetReservedSlot(ccx, funobj, 1, PRIVATE_TO_JSVAL(iface))) if(!JS_SetReservedSlot(ccx, funobj, 1, PRIVATE_TO_JSVAL(iface)))